From bcb63b9099e58cb8c4cc899f571d81c02cfb9cde Mon Sep 17 00:00:00 2001 From: Alena Khineika Date: Mon, 23 Jan 2023 19:46:21 +0100 Subject: [PATCH 01/36] feat: replace mongodb language with javascript in playgrounds --- package.json | 47 +++++----------- .../activeConnectionCodeLensProvider.ts | 13 +++++ src/editors/codeActionProvider.ts | 11 +++- src/editors/editorsController.ts | 4 +- src/editors/playgroundController.ts | 56 ++++++++++--------- src/language/languageServerController.ts | 4 +- 6 files changed, 71 insertions(+), 64 deletions(-) diff --git a/package.json b/package.json index 87f9910b1..34bfb74f1 100644 --- a/package.json +++ b/package.json @@ -83,7 +83,7 @@ "onView:mongoDBConnectionExplorer", "onView:mongoDBPlaygroundsExplorer", "onLanguage:json", - "onLanguage:mongodb" + "onLanguage:javasript" ], "contributes": { "viewsContainers": { @@ -125,17 +125,6 @@ } ], "languages": [ - { - "id": "mongodb", - "aliases": [ - "MongoDB", - "mongodb" - ], - "extensions": [ - ".mongodb" - ], - "configuration": "./languages/mongodb-language-configuration.json" - }, { "id": "terraform", "aliases": [ @@ -147,18 +136,7 @@ ] } ], - "grammars": [ - { - "language": "mongodb", - "path": "./syntaxes/mongodb.tmLanguage.json", - "scopeName": "source.mongodb" - } - ], "snippets": [ - { - "language": "mongodb", - "path": "./snippets/stage-autocompleter.json" - }, { "language": "terraform", "path": "./snippets/atlas-terraform.json" @@ -632,7 +610,7 @@ { "command": "mdb.runPlayground", "group": "navigation", - "when": "editorLangId == mongodb" + "when": "mdb.showRunPlaygroundButton == true" } ], "commandPalette": [ @@ -642,27 +620,27 @@ }, { "command": "mdb.runSelectedPlaygroundBlocks", - "when": "editorLangId == mongodb" + "when": "mdb.showRunPlaygroundButton == true" }, { "command": "mdb.runAllPlaygroundBlocks", - "when": "editorLangId == mongodb" + "when": "mdb.showRunPlaygroundButton == true" }, { "command": "mdb.exportToPython", - "when": "editorLangId == mongodb" + "when": "mdb.showRunPlaygroundButton == true" }, { "command": "mdb.exportToJava", - "when": "editorLangId == mongodb" + "when": "mdb.showRunPlaygroundButton == true" }, { "command": "mdb.exportToCsharp", - "when": "editorLangId == mongodb" + "when": "mdb.showRunPlaygroundButton == true" }, { "command": "mdb.exportToNode", - "when": "editorLangId == mongodb" + "when": "mdb.showRunPlaygroundButton == true" }, { "command": "mdb.refreshPlaygroundsFromTreeView", @@ -815,13 +793,13 @@ "command": "mdb.runSelectedPlaygroundBlocks", "key": "ctrl+alt+s", "mac": "cmd+alt+s", - "when": "editorLangId == mongodb" + "when": "mdb.showRunPlaygroundButton == true" }, { "command": "mdb.runAllPlaygroundBlocks", "key": "ctrl+alt+r", "mac": "cmd+alt+r", - "when": "editorLangId == mongodb" + "when": "mdb.showRunPlaygroundButton == true" }, { "command": "mdb.saveMongoDBDocument", @@ -1032,10 +1010,11 @@ "@types/react-dom": "^17.0.17", "@types/sinon": "^9.0.11", "@types/uuid": "^8.3.4", - "@types/vscode": "^1.71.0", + "@types/vscode": "^1.74.0", "@typescript-eslint/eslint-plugin": "^5.38.0", "@typescript-eslint/parser": "^5.38.0", "@vscode/test-electron": "^2.1.5", + "@vscode/vsce": "^2.16.0", "autoprefixer": "^9.8.8", "buffer": "^6.0.3", "chai": "^4.3.6", @@ -1085,7 +1064,7 @@ "ts-loader": "^9.4.1", "ts-node": "^10.9.1", "typescript": "^4.8.3", - "vsce": "^2.11.0", + "vscode-html-languageservice": "^5.0.3", "webpack": "^5.74.0", "webpack-cli": "^4.10.0", "xvfb-maybe": "^0.2.1", diff --git a/src/editors/activeConnectionCodeLensProvider.ts b/src/editors/activeConnectionCodeLensProvider.ts index 0013db8e3..4e61ddc5b 100644 --- a/src/editors/activeConnectionCodeLensProvider.ts +++ b/src/editors/activeConnectionCodeLensProvider.ts @@ -1,4 +1,5 @@ import * as vscode from 'vscode'; +import { TextEditor } from 'vscode'; import EXTENSION_COMMANDS from '../commands'; import ConnectionController from '../connectionController'; @@ -8,6 +9,7 @@ export default class ActiveConnectionCodeLensProvider _connectionController: ConnectionController; _onDidChangeCodeLenses: vscode.EventEmitter = new vscode.EventEmitter(); + _activeTextEditor?: TextEditor; readonly onDidChangeCodeLenses: vscode.Event = this._onDidChangeCodeLenses.event; @@ -18,6 +20,12 @@ export default class ActiveConnectionCodeLensProvider vscode.workspace.onDidChangeConfiguration(() => { this._onDidChangeCodeLenses.fire(); }); + + vscode.window.onDidChangeActiveTextEditor((editor: vscode.TextEditor | undefined) => { + if (editor?.document.languageId !== 'Log') { + this._activeTextEditor = editor; + } + }); } refresh(): void { @@ -25,6 +33,11 @@ export default class ActiveConnectionCodeLensProvider } provideCodeLenses(): vscode.CodeLens[] { + const editorUri = this._activeTextEditor?.document.uri; + if (editorUri?.fragment !== 'mongodb' && editorUri?.path.split('.').pop() !== 'mongodb') { + return []; + } + const codeLens = new vscode.CodeLens(new vscode.Range(0, 0, 0, 0)); let message = ''; diff --git a/src/editors/codeActionProvider.ts b/src/editors/codeActionProvider.ts index 453339f64..017e0f439 100644 --- a/src/editors/codeActionProvider.ts +++ b/src/editors/codeActionProvider.ts @@ -1,4 +1,5 @@ import * as vscode from 'vscode'; +import { TextEditor } from 'vscode'; import EXTENSION_COMMANDS from '../commands'; import { ExportToLanguageMode } from '../types/playgroundType'; @@ -8,6 +9,7 @@ export default class CodeActionProvider implements vscode.CodeActionProvider { new vscode.EventEmitter(); selection?: vscode.Selection; mode?: ExportToLanguageMode; + _activeTextEditor?: TextEditor; static readonly providedCodeActionKinds = [vscode.CodeActionKind.QuickFix]; @@ -15,6 +17,12 @@ export default class CodeActionProvider implements vscode.CodeActionProvider { vscode.workspace.onDidChangeConfiguration(() => { this._onDidChangeCodeCodeAction.fire(); }); + + vscode.window.onDidChangeActiveTextEditor((editor: vscode.TextEditor | undefined) => { + if (editor?.document.languageId !== 'Log') { + this._activeTextEditor = editor; + } + }); } readonly onDidChangeCodeLenses: vscode.Event = @@ -33,7 +41,8 @@ export default class CodeActionProvider implements vscode.CodeActionProvider { } provideCodeActions(): vscode.CodeAction[] | undefined { - if (!this.selection) { + const editorUri = this._activeTextEditor?.document.uri; + if (!this.selection || (editorUri?.fragment !== 'mongodb' && editorUri?.path.split('.').pop() !== 'mongodb')) { return; } diff --git a/src/editors/editorsController.ts b/src/editors/editorsController.ts index caa8ed2d6..af7fec2f7 100644 --- a/src/editors/editorsController.ts +++ b/src/editors/editorsController.ts @@ -400,7 +400,7 @@ export default class EditorsController { ); this._context.subscriptions.push( vscode.languages.registerCodeLensProvider( - { language: 'mongodb' }, + { language: 'javascript' }, this._activeConnectionCodeLensProvider ) ); @@ -432,7 +432,7 @@ export default class EditorsController { ); this._context.subscriptions.push( vscode.languages.registerCodeActionsProvider( - 'mongodb', + 'javascript', this._codeActionProvider, { providedCodeActionKinds: CodeActionProvider.providedCodeActionKinds, diff --git a/src/editors/playgroundController.ts b/src/editors/playgroundController.ts index f19bfd41b..5093becaf 100644 --- a/src/editors/playgroundController.ts +++ b/src/editors/playgroundController.ts @@ -2,6 +2,9 @@ import * as vscode from 'vscode'; import { OutputChannel, ProgressLocation, TextEditor } from 'vscode'; import vm from 'vm'; +// eslint-disable-next-line @typescript-eslint/no-unused-vars +import * as util from 'util'; + import ActiveConnectionCodeLensProvider from './activeConnectionCodeLensProvider'; import CodeActionProvider from './codeActionProvider'; import ConnectionController, { @@ -151,6 +154,12 @@ export default class PlaygroundController { this._playgroundResultTextDocument = editor?.document; } + if (editor?.document.uri.fragment === 'mongodb' || editor?.document.uri.path.split('.').pop() === 'mongodb') { + void vscode.commands.executeCommand('setContext', 'mdb.showRunPlaygroundButton', true); + } else { + void vscode.commands.executeCommand('setContext', 'mdb.showRunPlaygroundButton', false); + } + if (editor?.document.languageId !== 'Log') { this._activeTextEditor = editor; log.info('Active editor path', editor?.document.uri?.path); @@ -162,7 +171,7 @@ export default class PlaygroundController { vscode.window.onDidChangeTextEditorSelection( async (changeEvent: vscode.TextEditorSelectionChangeEvent) => { - if (changeEvent?.textEditor?.document?.languageId !== 'mongodb') { + if (changeEvent?.textEditor?.document?.uri.fragment !== 'mongodb') { return; } @@ -230,12 +239,24 @@ export default class PlaygroundController { content: string | undefined ): Promise { try { - const document = await vscode.workspace.openTextDocument({ - language: 'mongodb', - content, - }); + // Create untitled file. + const numberUntitledDocuments = vscode.workspace.textDocuments.filter((doc) => (doc.uri.scheme === 'untitled')).length; + const fileName = `Untitled-${numberUntitledDocuments + 1}`; + const newUri = vscode.Uri.file(fileName).with({ scheme: 'untitled', fragment: 'mongodb' }); - await vscode.window.showTextDocument(document); + const document = await vscode.workspace.openTextDocument(newUri); + await vscode.languages.setTextDocumentLanguage( + document, + 'javascript' + ); + + // Fill in initial content. + const edit = new vscode.WorkspaceEdit(); + edit.insert(newUri, new vscode.Position(0, 0), `${content}`); + await vscode.workspace.applyEdit(edit); + + // Actually show the editor. + await vscode.commands.executeCommand('vscode.open', newUri); return true; } catch (error) { @@ -302,23 +323,8 @@ export default class PlaygroundController { const useDefaultTemplate = !!vscode.workspace .getConfiguration('mdb') .get('useDefaultTemplateForPlayground'); - - try { - const document = await vscode.workspace.openTextDocument({ - language: 'mongodb', - content: useDefaultTemplate ? playgroundTemplate : '', - }); - - await vscode.window.showTextDocument(document); - - return true; - } catch (error) { - void vscode.window.showErrorMessage( - `Unable to create a playground: ${formatError(error).message}` - ); - - return false; - } + const content = useDefaultTemplate ? playgroundTemplate : ''; + return this._createPlaygroundFileWithContent(content); } async _evaluate(codeToEvaluate: string): Promise { @@ -538,7 +544,7 @@ export default class PlaygroundController { runAllPlaygroundBlocks(): Promise { if ( !this._activeTextEditor || - this._activeTextEditor.document.languageId !== 'mongodb' + this._activeTextEditor.document.uri.fragment !== 'mongodb' ) { void vscode.window.showErrorMessage( "Please open a '.mongodb' playground file before running it." @@ -556,7 +562,7 @@ export default class PlaygroundController { runAllOrSelectedPlaygroundBlocks(): Promise { if ( !this._activeTextEditor || - this._activeTextEditor.document.languageId !== 'mongodb' + this._activeTextEditor.document.uri.fragment !== 'mongodb' ) { void vscode.window.showErrorMessage( "Please open a '.mongodb' playground file before running it." diff --git a/src/language/languageServerController.ts b/src/language/languageServerController.ts index c079fa0b2..749d7697b 100644 --- a/src/language/languageServerController.ts +++ b/src/language/languageServerController.ts @@ -61,8 +61,8 @@ export default class LanguageServerController { const clientOptions: LanguageClientOptions = { // Register the server for mongodb documents documentSelector: [ - { scheme: 'untitled', language: 'mongodb' }, - { scheme: 'file', language: 'mongodb' }, + { scheme: 'untitled', language: 'javascript' }, + { scheme: 'file', language: 'javascript' }, ], synchronize: { // Notify the server about file changes in the workspace From 74411256776bd50f01bdb764863f9e233b2ec815 Mon Sep 17 00:00:00 2001 From: Alena Khineika Date: Tue, 24 Jan 2023 12:41:18 +0100 Subject: [PATCH 02/36] feat: use js grammar only --- .prettierignore | 1 - CONTRIBUTING.md | 1 - package.json | 20 +- scripts/update-grammar.ts | 60 - src/editors/playgroundController.ts | 21 +- .../playgroundCloneDocumentTemplate.ts | 3 +- .../playgroundCreateCollectionTemplate.ts | 3 +- .../playgroundCreateIndexTemplate.ts | 3 +- src/templates/playgroundSearchTemplate.ts | 3 +- src/templates/playgroundTemplate.ts | 3 +- syntaxes/mongodb.tmLanguage.json | 7263 ----------------- 11 files changed, 33 insertions(+), 7348 deletions(-) delete mode 100755 scripts/update-grammar.ts delete mode 100644 syntaxes/mongodb.tmLanguage.json diff --git a/.prettierignore b/.prettierignore index 6de1b6b4d..d969a3158 100644 --- a/.prettierignore +++ b/.prettierignore @@ -9,7 +9,6 @@ out playgrounds resources snippets -syntaxes CHANGELOG.md README.md constants.json diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9b6097208..0ac81eff8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -40,7 +40,6 @@ npm run watch - `out` compiled extension code - `images` Icons, logos, etc. - `snippets` [Bundled MongoDB Snippets][snippet guide] -- `syntaxes` [Syntax highlighting for `.mongodb` files][syntax guide] - `src` - `test/suite` where tests live with files names `*.test.ts` - `scripts` project helper scripts diff --git a/package.json b/package.json index 34bfb74f1..255654606 100644 --- a/package.json +++ b/package.json @@ -36,12 +36,11 @@ "scripts": { "clean": "rimraf ./out/* ./dist/* ", "lint": "eslint . && prettier --check .", - "update-grammar": "ts-node ./scripts/update-grammar.ts", "update-snippets": "ts-node ./scripts/update-snippets.ts", "precompile": "npm run clean", "compile": "npm-run-all compile:*", "compile:keyfile": "ts-node ./scripts/generate-keyfile.ts", - "compile:resources": "npm run update-grammar && npm run update-snippets", + "compile:resources": "npm run update-snippets", "compile:extension": "tsc -p ./", "compile:extension-bundles": "webpack --mode development", "watch": "npm run compile && npm-run-all -p watch:*", @@ -67,23 +66,10 @@ "npm": "^8.8.0" }, "activationEvents": [ - "onCommand:mdb.connect", - "onCommand:mdb.connectWithURI", - "onCommand:mdb.openOverviewPage", - "onCommand:mdb.createPlayground", - "onCommand:mdb.addConnection", - "onCommand:mdb.addConnectionWithURI", - "onCommand:mdb.disconnect", - "onCommand:mdb.removeConnection", - "onCommand:mdb.openMongoDBShell", - "onCommand:mdb.saveMongoDBDocument", - "onCommand:mdb.insertObjectIdToEditor", - "onCommand:mdb.generateObjectIdToClipboard", "onView:mongoDB", - "onView:mongoDBConnectionExplorer", - "onView:mongoDBPlaygroundsExplorer", "onLanguage:json", - "onLanguage:javasript" + "onLanguage:javasript", + "onLanguage:plaintext" ], "contributes": { "viewsContainers": { diff --git a/scripts/update-grammar.ts b/scripts/update-grammar.ts deleted file mode 100755 index c838da410..000000000 --- a/scripts/update-grammar.ts +++ /dev/null @@ -1,60 +0,0 @@ -#! /usr/bin/env ts-node - -import path = require('path'); -import mkdirp = require('mkdirp'); -import ora = require('ora'); -import download = require('download'); -import meow = require('meow'); - -import formatError from '../src/utils/formatError'; - -const DEFAULT_DEST = path.join(__dirname, '..', 'syntaxes'); - -const languageURL = - 'https://raw.githubusercontent.com/mongodb-js/vscode-mongodb-language/master/syntaxes/mongodb.tmLanguage.json'; - -const cli = meow( - ` - Downloads the latest mongodb.tmLanguage.json from mongodb-js/vscode-mongodb-language - - Usage - $ update-grammar.ts - - Options - --dest Directory to download to [Default: ${DEFAULT_DEST}] - --src URL of mongodb.tmLanguage.json [Default: ${languageURL}] - - Examples - $ ./update-grammar.ts - ℹ Downlading latest mongodb.tmLanguage.json - ✔ Downloaded to /Users/lucas/vsc/syntaxes/mongodb.tmLanguage.json -`, - { - flags: { - dest: { - default: DEFAULT_DEST, - }, - url: { - default: languageURL, - }, - }, - } -); - -(async () => { - await mkdirp(DEFAULT_DEST); - - const ui = ora().info('Downlading latest mongodb.tmLanguage.json').start(); - - try { - await download(cli.flags.url, cli.flags.dest); - ui.succeed( - `Downloaded to ${path.join( - cli.flags.dest as string, - 'mongodb.tmLanguage.json' - )}` - ); - } catch (error) { - ui.fail(`Download failed: ${formatError(error).message}`); - } -})(); diff --git a/src/editors/playgroundController.ts b/src/editors/playgroundController.ts index 5093becaf..d6e5e83f2 100644 --- a/src/editors/playgroundController.ts +++ b/src/editors/playgroundController.ts @@ -166,9 +166,27 @@ export default class PlaygroundController { } }; + vscode.workspace.textDocuments.forEach((document) => { + if (document.uri.path.split('.').pop() === 'mongodb') { + void vscode.languages.setTextDocumentLanguage( + document, + 'javascript' + ); + } + }); + vscode.window.onDidChangeActiveTextEditor(onDidChangeActiveTextEditor); onDidChangeActiveTextEditor(vscode.window.activeTextEditor); + vscode.workspace.onDidOpenTextDocument(async (document) => { + if (document.uri.path.split('.').pop() === 'mongodb') { + await vscode.languages.setTextDocumentLanguage( + document, + 'javascript' + ); + } + }); + vscode.window.onDidChangeTextEditorSelection( async (changeEvent: vscode.TextEditorSelectionChangeEvent) => { if (changeEvent?.textEditor?.document?.uri.fragment !== 'mongodb') { @@ -242,8 +260,9 @@ export default class PlaygroundController { // Create untitled file. const numberUntitledDocuments = vscode.workspace.textDocuments.filter((doc) => (doc.uri.scheme === 'untitled')).length; const fileName = `Untitled-${numberUntitledDocuments + 1}`; - const newUri = vscode.Uri.file(fileName).with({ scheme: 'untitled', fragment: 'mongodb' }); + const newUri = vscode.Uri.file(fileName).with({ scheme: 'untitled', fragment: 'mongodb' }); // http://localhost/?#mongodb + // Before: vscode.workspace.openTextDocument({ language: 'mongodb', content }); const document = await vscode.workspace.openTextDocument(newUri); await vscode.languages.setTextDocumentLanguage( document, diff --git a/src/templates/playgroundCloneDocumentTemplate.ts b/src/templates/playgroundCloneDocumentTemplate.ts index b31770f48..bf34936b2 100644 --- a/src/templates/playgroundCloneDocumentTemplate.ts +++ b/src/templates/playgroundCloneDocumentTemplate.ts @@ -1,4 +1,5 @@ -const template = `// MongoDB Playground +const template = `/* global use, db */ +// MongoDB Playground // Use Ctrl+Space inside a snippet or a string literal to trigger completions. // The current database to use. diff --git a/src/templates/playgroundCreateCollectionTemplate.ts b/src/templates/playgroundCreateCollectionTemplate.ts index dc0b5d842..340bb2f09 100644 --- a/src/templates/playgroundCreateCollectionTemplate.ts +++ b/src/templates/playgroundCreateCollectionTemplate.ts @@ -1,4 +1,5 @@ -const template = `// MongoDB Playground +const template = `/* global use, db */ +// MongoDB Playground // Use Ctrl+Space inside a snippet or a string literal to trigger completions. const database = 'NEW_DATABASE_NAME'; diff --git a/src/templates/playgroundCreateIndexTemplate.ts b/src/templates/playgroundCreateIndexTemplate.ts index 7cd380722..122644de3 100644 --- a/src/templates/playgroundCreateIndexTemplate.ts +++ b/src/templates/playgroundCreateIndexTemplate.ts @@ -1,4 +1,5 @@ -const template = `// MongoDB Playground +const template = `/* global use, db */ +// MongoDB Playground // Use Ctrl+Space inside a snippet or a string literal to trigger completions. // The current database to use. diff --git a/src/templates/playgroundSearchTemplate.ts b/src/templates/playgroundSearchTemplate.ts index 81d3cd404..be3ddb573 100644 --- a/src/templates/playgroundSearchTemplate.ts +++ b/src/templates/playgroundSearchTemplate.ts @@ -1,4 +1,5 @@ -const template = `// MongoDB Playground +const template = `/* global use, db */ +// MongoDB Playground // Use Ctrl+Space inside a snippet or a string literal to trigger completions. // The current database to use. diff --git a/src/templates/playgroundTemplate.ts b/src/templates/playgroundTemplate.ts index 2e0a78d5b..6a3f9b26d 100644 --- a/src/templates/playgroundTemplate.ts +++ b/src/templates/playgroundTemplate.ts @@ -1,4 +1,5 @@ -const template = `// MongoDB Playground +const template = `/* global use, db */ +// MongoDB Playground // To disable this template go to Settings | MongoDB | Use Default Template For Playground. // Make sure you are connected to enable completions and to be able to run a playground. // Use Ctrl+Space inside a snippet or a string literal to trigger completions. diff --git a/syntaxes/mongodb.tmLanguage.json b/syntaxes/mongodb.tmLanguage.json deleted file mode 100644 index f8cc8b640..000000000 --- a/syntaxes/mongodb.tmLanguage.json +++ /dev/null @@ -1,7263 +0,0 @@ -{ - "name": "MongoDB", - "uuid": "ef98eb90-bf9b-11e4-bb52-0800200c9a66", - "scopeName": "source.mongodb", - "fileTypes": [ - "mongodb" - ], - "patterns": [ - { - "include": "#directives" - }, - { - "include": "#statements" - }, - { - "name": "comment.line.shebang.mongodb", - "match": "\\A(#!).*(?=$)", - "captures": { - "1": { - "name": "punctuation.definition.comment.mongodb" - } - } - } - ], - "repository": { - "statements": { - "patterns": [ - { - "include": "#declaration" - }, - { - "include": "#control-statement" - }, - { - "include": "#after-operator-block-as-object-literal" - }, - { - "include": "#decl-block" - }, - { - "include": "#label" - }, - { - "include": "#expression" - }, - { - "include": "#punctuation-semicolon" - }, - { - "include": "#string" - }, - { - "include": "#comment" - } - ] - }, - "declaration": { - "patterns": [ - { - "include": "#decorator" - }, - { - "include": "#var-expr" - }, - { - "include": "#function-declaration" - }, - { - "include": "#class-declaration" - }, - { - "include": "#interface-declaration" - }, - { - "include": "#enum-declaration" - }, - { - "include": "#namespace-declaration" - }, - { - "include": "#type-alias-declaration" - }, - { - "include": "#import-equals-declaration" - }, - { - "include": "#import-declaration" - }, - { - "include": "#export-declaration" - }, - { - "name": "storage.modifier.mongodb", - "match": "(?)\n )) |\n ((async\\s*)?(\n ((<\\s*$)|((<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?[\\(]\\s*((([\\{\\[]\\s*)?$)|((\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})\\s*((:\\s*\\{?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))|((\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])\\s*((:\\s*\\[?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))))) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?\n [(]\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)? # typeparameters\n \\(\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\.\\.\\.\\s*[_$[:alpha:]]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(?]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?[\\(]\\s*((([\\{\\[]\\s*)?$)|((\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})\\s*((:\\s*\\{?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))|((\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])\\s*((:\\s*\\[?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*))))))) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ((<\\s*$)|((<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?[\\(]\\s*((([\\{\\[]\\s*)?$)|((\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})\\s*((:\\s*\\{?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))|((\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])\\s*((:\\s*\\[?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))))) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?\n [(]\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)? # typeparameters\n \\(\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\.\\.\\.\\s*[_$[:alpha:]]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", - "beginCaptures": { - "1": { - "name": "meta.definition.variable.mongodb entity.name.function.mongodb" - }, - "2": { - "name": "keyword.operator.definiteassignment.mongodb" - } - }, - "end": "(?=$|^|[;,=}]|((?)\n )) |\n ((async\\s*)?(\n ((<\\s*$)|((<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?[\\(]\\s*((([\\{\\[]\\s*)?$)|((\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})\\s*((:\\s*\\{?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))|((\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])\\s*((:\\s*\\[?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))))) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?\n [(]\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)? # typeparameters\n \\(\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\.\\.\\.\\s*[_$[:alpha:]]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(?]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?[\\(]\\s*((([\\{\\[]\\s*)?$)|((\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})\\s*((:\\s*\\{?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))|((\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])\\s*((:\\s*\\[?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*))))))) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ((<\\s*$)|((<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?[\\(]\\s*((([\\{\\[]\\s*)?$)|((\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})\\s*((:\\s*\\{?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))|((\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])\\s*((:\\s*\\[?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))))) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?\n [(]\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)? # typeparameters\n \\(\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\.\\.\\.\\s*[_$[:alpha:]]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", - "beginCaptures": { - "1": { - "name": "meta.definition.variable.mongodb variable.other.constant.mongodb entity.name.function.mongodb" - } - }, - "end": "(?=$|^|[;,=}]|((?)\n )) |\n ((async\\s*)?(\n ((<\\s*$)|((<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?[\\(]\\s*((([\\{\\[]\\s*)?$)|((\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})\\s*((:\\s*\\{?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))|((\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])\\s*((:\\s*\\[?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))))) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?\n [(]\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)? # typeparameters\n \\(\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\.\\.\\.\\s*[_$[:alpha:]]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(?]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?[\\(]\\s*((([\\{\\[]\\s*)?$)|((\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})\\s*((:\\s*\\{?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))|((\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])\\s*((:\\s*\\[?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*))))))) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ((<\\s*$)|((<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?[\\(]\\s*((([\\{\\[]\\s*)?$)|((\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})\\s*((:\\s*\\{?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))|((\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])\\s*((:\\s*\\[?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))))) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?\n [(]\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)? # typeparameters\n \\(\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\.\\.\\.\\s*[_$[:alpha:]]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", - "captures": { - "1": { - "name": "storage.modifier.mongodb" - }, - "2": { - "name": "keyword.operator.rest.mongodb" - }, - "3": { - "name": "entity.name.function.mongodb variable.language.this.mongodb" - }, - "4": { - "name": "entity.name.function.mongodb" - }, - "5": { - "name": "keyword.operator.optional.mongodb" - } - } - }, - { - "match": "(?x)(?:(?)\n )) |\n ((async\\s*)?(\n ((<\\s*$)|((<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?[\\(]\\s*((([\\{\\[]\\s*)?$)|((\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})\\s*((:\\s*\\{?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))|((\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])\\s*((:\\s*\\[?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))))) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?\n [(]\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)? # typeparameters\n \\(\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\.\\.\\.\\s*[_$[:alpha:]]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(?]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?[\\(]\\s*((([\\{\\[]\\s*)?$)|((\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})\\s*((:\\s*\\{?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))|((\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])\\s*((:\\s*\\[?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*))))))) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ((<\\s*$)|((<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?[\\(]\\s*((([\\{\\[]\\s*)?$)|((\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})\\s*((:\\s*\\{?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))|((\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])\\s*((:\\s*\\[?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))))) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?\n [(]\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)? # typeparameters\n \\(\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\.\\.\\.\\s*[_$[:alpha:]]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", - "captures": { - "1": { - "name": "meta.definition.property.mongodb entity.name.function.mongodb" - }, - "2": { - "name": "keyword.operator.optional.mongodb" - }, - "3": { - "name": "keyword.operator.definiteassignment.mongodb" - } - } - }, - { - "name": "meta.definition.property.mongodb variable.object.property.mongodb", - "match": "\\#?[_$[:alpha:]][_$[:alnum:]]*" - }, - { - "name": "keyword.operator.optional.mongodb", - "match": "\\?" - }, - { - "name": "keyword.operator.definiteassignment.mongodb", - "match": "\\!" - } - ] - }, - "variable-initializer": { - "patterns": [ - { - "begin": "(?\\s*$)", - "beginCaptures": { - "1": { - "name": "keyword.operator.assignment.mongodb" - } - }, - "end": "(?=$|^|[,);}\\]]|((?]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*))?[\\(])", - "beginCaptures": { - "1": { - "name": "storage.modifier.mongodb" - }, - "2": { - "name": "storage.modifier.mongodb" - }, - "3": { - "name": "storage.modifier.async.mongodb" - }, - "4": { - "name": "keyword.operator.new.mongodb" - }, - "5": { - "name": "keyword.generator.asterisk.mongodb" - } - }, - "end": "(?=\\}|;|,|$)|(?<=\\})", - "patterns": [ - { - "include": "#method-declaration-name" - }, - { - "include": "#function-body" - } - ] - }, - { - "name": "meta.method.declaration.mongodb", - "begin": "(?x)(?]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*))?[\\(])", - "beginCaptures": { - "1": { - "name": "storage.modifier.mongodb" - }, - "2": { - "name": "storage.modifier.mongodb" - }, - "3": { - "name": "storage.modifier.async.mongodb" - }, - "4": { - "name": "storage.type.property.mongodb" - }, - "5": { - "name": "keyword.generator.asterisk.mongodb" - } - }, - "end": "(?=\\}|;|,|$)|(?<=\\})", - "patterns": [ - { - "include": "#method-declaration-name" - }, - { - "include": "#function-body" - } - ] - } - ] - }, - "object-literal-method-declaration": { - "name": "meta.method.declaration.mongodb", - "begin": "(?x)(?]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*))?[\\(])", - "beginCaptures": { - "1": { - "name": "storage.modifier.async.mongodb" - }, - "2": { - "name": "storage.type.property.mongodb" - }, - "3": { - "name": "keyword.generator.asterisk.mongodb" - } - }, - "end": "(?=\\}|;|,)|(?<=\\})", - "patterns": [ - { - "include": "#method-declaration-name" - }, - { - "include": "#function-body" - }, - { - "begin": "(?x)(?]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*))?[\\(])", - "beginCaptures": { - "1": { - "name": "storage.modifier.async.mongodb" - }, - "2": { - "name": "storage.type.property.mongodb" - }, - "3": { - "name": "keyword.generator.asterisk.mongodb" - } - }, - "end": "(?=\\(|\\<)", - "patterns": [ - { - "include": "#method-declaration-name" - } - ] - } - ] - }, - "method-declaration-name": { - "begin": "(?x)(?=((\\b(?)", - "captures": { - "1": { - "name": "storage.modifier.async.mongodb" - }, - "2": { - "name": "variable.parameter.mongodb" - } - } - }, - { - "name": "meta.arrow.mongodb", - "begin": "(?x) (?:\n (? is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?\n [(]\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)? # typeparameters\n \\(\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\.\\.\\.\\s*[_$[:alpha:]]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+)? # return type\n \\s*=> # arrow operator\n)\n )\n)", - "beginCaptures": { - "1": { - "name": "storage.modifier.async.mongodb" - } - }, - "end": "(?==>|\\{|(^\\s*(export|function|class|interface|let|var|const|import|enum|namespace|module|type|abstract|declare)\\s+))", - "patterns": [ - { - "include": "#comment" - }, - { - "include": "#type-parameters" - }, - { - "include": "#function-parameters" - }, - { - "include": "#arrow-return-type" - }, - { - "include": "#possibly-arrow-return-type" - } - ] - }, - { - "name": "meta.arrow.mongodb", - "begin": "=>", - "beginCaptures": { - "0": { - "name": "storage.type.function.arrow.mongodb" - } - }, - "end": "((?<=\\}|\\S)(?)|((?!\\{)(?=\\S)))(?!\\/[\\/\\*])", - "patterns": [ - { - "include": "#single-line-comment-consuming-line-ending" - }, - { - "include": "#decl-block" - }, - { - "include": "#expression" - } - ] - } - ] - }, - "indexer-declaration": { - "name": "meta.indexer.declaration.mongodb", - "begin": "(?:(?]|^await|[^\\._$[:alnum:]]await|^return|[^\\._$[:alnum:]]return|^yield|[^\\._$[:alnum:]]yield|^throw|[^\\._$[:alnum:]]throw|^in|[^\\._$[:alnum:]]in|^of|[^\\._$[:alnum:]]of|^typeof|[^\\._$[:alnum:]]typeof|&&|\\|\\||\\*)\\s*(\\{)", - "beginCaptures": { - "1": { - "name": "punctuation.definition.block.mongodb" - } - }, - "end": "\\}", - "endCaptures": { - "0": { - "name": "punctuation.definition.block.mongodb" - } - }, - "patterns": [ - { - "include": "#object-member" - } - ] - }, - "object-literal": { - "name": "meta.objectliteral.mongodb", - "begin": "\\{", - "beginCaptures": { - "0": { - "name": "punctuation.definition.block.mongodb" - } - }, - "end": "\\}", - "endCaptures": { - "0": { - "name": "punctuation.definition.block.mongodb" - } - }, - "patterns": [ - { - "include": "#object-member" - } - ] - }, - "object-member": { - "patterns": [ - { - "name": "meta.object.member.mongodb", - "match": "\\$undefined\\b", - "captures": { - "0": { - "name": "keyword.other.aggBSON.undefined.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$timestamp\\b", - "captures": { - "0": { - "name": "keyword.other.aggBSON.timestamp.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$regularExpression\\b", - "captures": { - "0": { - "name": "keyword.other.aggBSON.regularExpression.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$regex\\b", - "captures": { - "0": { - "name": "keyword.other.aggBSON.regex.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$oid\\b", - "captures": { - "0": { - "name": "keyword.other.aggBSON.oid.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$numberLong\\b", - "captures": { - "0": { - "name": "keyword.other.aggBSON.numberLong.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$numberInt\\b", - "captures": { - "0": { - "name": "keyword.other.aggBSON.numberInt.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$numberDouble\\b", - "captures": { - "0": { - "name": "keyword.other.aggBSON.numberDouble.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$numberDecimal\\b", - "captures": { - "0": { - "name": "keyword.other.aggBSON.numberDecimal.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$minKey\\b", - "captures": { - "0": { - "name": "keyword.other.aggBSON.minKey.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$maxKey\\b", - "captures": { - "0": { - "name": "keyword.other.aggBSON.maxKey.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$date\\b", - "captures": { - "0": { - "name": "keyword.other.aggBSON.date.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$binary\\b", - "captures": { - "0": { - "name": "keyword.other.aggBSON.binary.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$unwind\\b", - "captures": { - "0": { - "name": "keyword.other.aggStageOperators.unwind.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$sortByCount\\b", - "captures": { - "0": { - "name": "keyword.other.aggStageOperators.sortByCount.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$sort\\b", - "captures": { - "0": { - "name": "keyword.other.aggStageOperators.sort.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$skip\\b", - "captures": { - "0": { - "name": "keyword.other.aggStageOperators.skip.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$setWindowFields\\b", - "captures": { - "0": { - "name": "keyword.other.aggStageOperators.setWindowFields.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$searchMeta\\b", - "captures": { - "0": { - "name": "keyword.other.aggStageOperators.searchMeta.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$sample\\b", - "captures": { - "0": { - "name": "keyword.other.aggStageOperators.sample.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$replaceRoot\\b", - "captures": { - "0": { - "name": "keyword.other.aggStageOperators.replaceRoot.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$redact\\b", - "captures": { - "0": { - "name": "keyword.other.aggStageOperators.redact.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$project\\b", - "captures": { - "0": { - "name": "keyword.other.aggStageOperators.project.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$out\\b", - "captures": { - "0": { - "name": "keyword.other.aggStageOperators.out.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$match\\b", - "captures": { - "0": { - "name": "keyword.other.aggStageOperators.match.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$lookup\\b", - "captures": { - "0": { - "name": "keyword.other.aggStageOperators.lookup.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$limit\\b", - "captures": { - "0": { - "name": "keyword.other.aggStageOperators.limit.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$indexStats\\b", - "captures": { - "0": { - "name": "keyword.other.aggStageOperators.indexStats.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$group\\b", - "captures": { - "0": { - "name": "keyword.other.aggStageOperators.group.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$graphLookup\\b", - "captures": { - "0": { - "name": "keyword.other.aggStageOperators.graphLookup.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$geoNear\\b", - "captures": { - "0": { - "name": "keyword.other.aggStageOperators.geoNear.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$facet\\b", - "captures": { - "0": { - "name": "keyword.other.aggStageOperators.facet.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$documents\\b", - "captures": { - "0": { - "name": "keyword.other.aggStageOperators.documents.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$densify\\b", - "captures": { - "0": { - "name": "keyword.other.aggStageOperators.densify.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$count\\b", - "captures": { - "0": { - "name": "keyword.other.aggStageOperators.count.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$collStats\\b", - "captures": { - "0": { - "name": "keyword.other.aggStageOperators.collStats.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$bucketAuto\\b", - "captures": { - "0": { - "name": "keyword.other.aggStageOperators.bucketAuto.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$bucket\\b", - "captures": { - "0": { - "name": "keyword.other.aggStageOperators.bucket.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$addFields\\b", - "captures": { - "0": { - "name": "keyword.other.aggStageOperators.addFields.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$where\\b", - "captures": { - "0": { - "name": "keyword.other.QueryOperators.where.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$type\\b", - "captures": { - "0": { - "name": "keyword.other.QueryOperators.type.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$text\\b", - "captures": { - "0": { - "name": "keyword.other.QueryOperators.text.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$slice\\b", - "captures": { - "0": { - "name": "keyword.other.QueryOperators.slice.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$size\\b", - "captures": { - "0": { - "name": "keyword.other.QueryOperators.size.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$regex\\b", - "captures": { - "0": { - "name": "keyword.other.QueryOperators.regex.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$or\\b", - "captures": { - "0": { - "name": "keyword.other.QueryOperators.or.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$nor\\b", - "captures": { - "0": { - "name": "keyword.other.QueryOperators.nor.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$not\\b", - "captures": { - "0": { - "name": "keyword.other.QueryOperators.not.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$nin\\b", - "captures": { - "0": { - "name": "keyword.other.QueryOperators.nin.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$nearSphere\\b", - "captures": { - "0": { - "name": "keyword.other.QueryOperators.nearSphere.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$near\\b", - "captures": { - "0": { - "name": "keyword.other.QueryOperators.near.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$ne\\b", - "captures": { - "0": { - "name": "keyword.other.QueryOperators.ne.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$mod\\b", - "captures": { - "0": { - "name": "keyword.other.QueryOperators.mod.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$lte\\b", - "captures": { - "0": { - "name": "keyword.other.QueryOperators.lte.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$lt\\b", - "captures": { - "0": { - "name": "keyword.other.QueryOperators.lt.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$jsonSchema\\b", - "captures": { - "0": { - "name": "keyword.other.QueryOperators.jsonSchema.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$in\\b", - "captures": { - "0": { - "name": "keyword.other.QueryOperators.in.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$gte\\b", - "captures": { - "0": { - "name": "keyword.other.QueryOperators.gte.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$gt\\b", - "captures": { - "0": { - "name": "keyword.other.QueryOperators.gt.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$geoWithin\\b", - "captures": { - "0": { - "name": "keyword.other.QueryOperators.geoWithin.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$geoIntersects\\b", - "captures": { - "0": { - "name": "keyword.other.QueryOperators.geoIntersects.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$expr\\b", - "captures": { - "0": { - "name": "keyword.other.QueryOperators.expr.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$exists\\b", - "captures": { - "0": { - "name": "keyword.other.QueryOperators.exists.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$eq\\b", - "captures": { - "0": { - "name": "keyword.other.QueryOperators.eq.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$elemMatch\\b", - "captures": { - "0": { - "name": "keyword.other.QueryOperators.elemMatch.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$comment\\b", - "captures": { - "0": { - "name": "keyword.other.QueryOperators.comment.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$bitsAnySet\\b", - "captures": { - "0": { - "name": "keyword.other.QueryOperators.bitsAnySet.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$bitsAnyClear\\b", - "captures": { - "0": { - "name": "keyword.other.QueryOperators.bitsAnyClear.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$bitsAllSet\\b", - "captures": { - "0": { - "name": "keyword.other.QueryOperators.bitsAllSet.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$bitsAllClear\\b", - "captures": { - "0": { - "name": "keyword.other.QueryOperators.bitsAllClear.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$and\\b", - "captures": { - "0": { - "name": "keyword.other.QueryOperators.and.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$all\\b", - "captures": { - "0": { - "name": "keyword.other.QueryOperators.all.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$zip\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.zip.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$year\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.year.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$week\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.week.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$type\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.type.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$trunc\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.trunc.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$tsIncrement\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.tsIncrement.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$tsSecond\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.tsSecond.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$toUpper\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.toUpper.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$toLower\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.toLower.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$switch\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.switch.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$subtract\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.subtract.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$substrCP\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.substrCP.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$substrBytes\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.substrBytes.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$substr\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.substr.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$strLenCP\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.strLenCP.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$strLenBytes\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.strLenBytes.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$strcasecmp\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.strcasecmp.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$sqrt\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.sqrt.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$split\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.split.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$slice\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.slice.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$size\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.size.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$setUnion\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.setUnion.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$setIsSubset\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.setIsSubset.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$setIntersection\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.setIntersection.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$setEquals\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.setEquals.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$setDifference\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.setDifference.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$second\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.second.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$reverseArray\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.reverseArray.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$reduce\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.reduce.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$range\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.range.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$pow\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.pow.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$or\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.or.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$objectToArray\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.objectToArray.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$not\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.not.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$new\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.new.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$multiply\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.multiply.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$month\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.month.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$mod\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.mod.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$minute\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.minute.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$millisecond\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.millisecond.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$meta\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.meta.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$mergeObjects\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.mergeObjects.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$map\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.map.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$log10\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.log10.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$log\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.log.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$ln\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.ln.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$lt\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.lt.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$literal\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.literal.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$let\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.let.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$isoWeekYear\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.isoWeekYear.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$isoWeek\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.isoWeek.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$isoDayOfWeek\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.isoDayOfWeek.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$isArray\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.isArray.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$indexOfCP\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.indexOfCP.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$indexOfBytes\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.indexOfBytes.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$indexOfArray\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.indexOfArray.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$in\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.in.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$ifNull\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.ifNull.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$hour\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.hour.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$gte\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.gte.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$gt\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.gt.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$getField\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.getField.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$floor\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.floor.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$filter\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.filter.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$exp\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.exp.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$eq\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.eq.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$divide\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.divide.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$dayOfYear\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.dayOfYear.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$dayOfWeek\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.dayOfWeek.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$dayOfMonth\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.dayOfMonth.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$dateTrunc\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.dateTrunc.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$dateToString\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.dateToString.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$dateToParts\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.dateToParts.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$dateSubtract\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.dateSubtract.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$dateFromString\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.dateFromString.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$dateFromParts\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.dateFromParts.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$dateDiff\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.dateDiff.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$dateAdd\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.dateAdd.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$cond\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.cond.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$concatArrays\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.concatArrays.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$concat\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.concat.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$cmp\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.cmp.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$ceil\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.ceil.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$arrayToObject\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.arrayToObject.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$arrayElemAt\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.arrayElemAt.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$anyElementTrue\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.anyElementTrue.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$and\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.and.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$allElementsTrue\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.allElementsTrue.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$add\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.add.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$abs\\b", - "captures": { - "0": { - "name": "keyword.other.aggExpressionOperators.abs.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$trim\\b", - "captures": { - "0": { - "name": "keyword.other.aggConverters.trim.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$toString\\b", - "captures": { - "0": { - "name": "keyword.other.aggConverters.toString.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$toObjectId\\b", - "captures": { - "0": { - "name": "keyword.other.aggConverters.toObjectId.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$toLong\\b", - "captures": { - "0": { - "name": "keyword.other.aggConverters.toLong.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$toInt\\b", - "captures": { - "0": { - "name": "keyword.other.aggConverters.toInt.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$toDouble\\b", - "captures": { - "0": { - "name": "keyword.other.aggConverters.toDouble.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$toDecimal\\b", - "captures": { - "0": { - "name": "keyword.other.aggConverters.toDecimal.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$toDate\\b", - "captures": { - "0": { - "name": "keyword.other.aggConverters.toDate.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$toBool\\b", - "captures": { - "0": { - "name": "keyword.other.aggConverters.toBool.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$rtrim\\b", - "captures": { - "0": { - "name": "keyword.other.aggConverters.rtrim.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$ltrim\\b", - "captures": { - "0": { - "name": "keyword.other.aggConverters.ltrim.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$convert\\b", - "captures": { - "0": { - "name": "keyword.other.aggConverters.convert.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$sum\\b", - "captures": { - "0": { - "name": "keyword.other.aggAccumulators.sum.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$shift\\b", - "captures": { - "0": { - "name": "keyword.other.aggAccumulators.shift.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$stdDevSamp\\b", - "captures": { - "0": { - "name": "keyword.other.aggAccumulators.stdDevSamp.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$stdDevPop\\b", - "captures": { - "0": { - "name": "keyword.other.aggAccumulators.stdDevPop.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$rank\\b", - "captures": { - "0": { - "name": "keyword.other.aggAccumulators.rank.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$push\\b", - "captures": { - "0": { - "name": "keyword.other.aggAccumulators.push.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$min\\b", - "captures": { - "0": { - "name": "keyword.other.aggAccumulators.min.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$max\\b", - "captures": { - "0": { - "name": "keyword.other.aggAccumulators.max.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$last\\b", - "captures": { - "0": { - "name": "keyword.other.aggAccumulators.last.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$integral\\b", - "captures": { - "0": { - "name": "keyword.other.aggAccumulators.integral.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$first\\b", - "captures": { - "0": { - "name": "keyword.other.aggAccumulators.first.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$expMovingAvg\\b", - "captures": { - "0": { - "name": "keyword.other.aggAccumulators.expMovingAvg.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$documentNumber\\b", - "captures": { - "0": { - "name": "keyword.other.aggAccumulators.documentNumber.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$denseRank\\b", - "captures": { - "0": { - "name": "keyword.other.aggAccumulators.denseRank.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$derivative\\b", - "captures": { - "0": { - "name": "keyword.other.aggAccumulators.derivative.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$count\\b", - "captures": { - "0": { - "name": "keyword.other.aggAccumulators.count.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$covarianceSamp\\b", - "captures": { - "0": { - "name": "keyword.other.aggAccumulators.covarianceSamp.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$covariancePop\\b", - "captures": { - "0": { - "name": "keyword.other.aggAccumulators.covariancePop.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$avg\\b", - "captures": { - "0": { - "name": "keyword.other.aggAccumulators.avg.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "\\$addToSet\\b", - "captures": { - "0": { - "name": "keyword.other.aggAccumulators.addToSet.mongodb" - } - } - }, - { - "include": "#comment" - }, - { - "include": "#object-literal-method-declaration" - }, - { - "name": "meta.object.member.mongodb meta.object-literal.key.mongodb", - "begin": "(?=\\[)", - "end": "(?=:)|((?<=[\\]])(?=\\s*[\\(\\<]))", - "patterns": [ - { - "include": "#comment" - }, - { - "include": "#array-literal" - } - ] - }, - { - "name": "meta.object.member.mongodb meta.object-literal.key.mongodb", - "begin": "(?=[\\'\\\"\\`])", - "end": "(?=:)|((?<=[\\'\\\"\\`])(?=((\\s*[\\(\\<,}])|(\\s+(as)\\s+))))", - "patterns": [ - { - "include": "#comment" - }, - { - "include": "#string" - } - ] - }, - { - "name": "meta.object.member.mongodb meta.object-literal.key.mongodb", - "begin": "(?x)(?=(\\b(?)\n )) |\n ((async\\s*)?(\n ((<\\s*$)|((<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?[\\(]\\s*((([\\{\\[]\\s*)?$)|((\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})\\s*((:\\s*\\{?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))|((\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])\\s*((:\\s*\\[?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))))) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?\n [(]\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)? # typeparameters\n \\(\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\.\\.\\.\\s*[_$[:alpha:]]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", - "captures": { - "0": { - "name": "meta.object-literal.key.mongodb" - }, - "1": { - "name": "entity.name.function.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "(?:[_$[:alpha:]][_$[:alnum:]]*)\\s*(?=(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*:)", - "captures": { - "0": { - "name": "meta.object-literal.key.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "begin": "\\.\\.\\.", - "beginCaptures": { - "0": { - "name": "keyword.operator.spread.mongodb" - } - }, - "end": "(?=,|\\})", - "patterns": [ - { - "include": "#expression" - } - ] - }, - { - "name": "meta.object.member.mongodb", - "match": "([_$[:alpha:]][_$[:alnum:]]*)\\s*(?=,|\\}|$|\\/\\/|\\/\\*)", - "captures": { - "1": { - "name": "variable.other.readwrite.mongodb" - } - } - }, - { - "name": "meta.object.member.mongodb", - "match": "(?]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)\\(\\s*((([\\{\\[]\\s*)?$)|((\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})\\s*((:\\s*\\{?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))|((\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])\\s*((:\\s*\\[?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))))", - "beginCaptures": { - "1": { - "name": "storage.modifier.async.mongodb" - } - }, - "end": "(?<=\\))", - "patterns": [ - { - "include": "#type-parameters" - }, - { - "begin": "\\(", - "beginCaptures": { - "0": { - "name": "meta.brace.round.mongodb" - } - }, - "end": "\\)", - "endCaptures": { - "0": { - "name": "meta.brace.round.mongodb" - } - }, - "patterns": [ - { - "include": "#expression-inside-possibly-arrow-parens" - } - ] - } - ] - }, - { - "begin": "(?<=:)\\s*(async)?\\s*(\\()(?=\\s*((([\\{\\[]\\s*)?$)|((\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})\\s*((:\\s*\\{?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))|((\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])\\s*((:\\s*\\[?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))))", - "beginCaptures": { - "1": { - "name": "storage.modifier.async.mongodb" - }, - "2": { - "name": "meta.brace.round.mongodb" - } - }, - "end": "\\)", - "endCaptures": { - "0": { - "name": "meta.brace.round.mongodb" - } - }, - "patterns": [ - { - "include": "#expression-inside-possibly-arrow-parens" - } - ] - }, - { - "begin": "(?<=:)\\s*(async)?\\s*(?=\\<\\s*$)", - "beginCaptures": { - "1": { - "name": "storage.modifier.async.mongodb" - } - }, - "end": "(?<=\\>)", - "patterns": [ - { - "include": "#type-parameters" - } - ] - }, - { - "begin": "(?<=\\>)\\s*(\\()(?=\\s*((([\\{\\[]\\s*)?$)|((\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})\\s*((:\\s*\\{?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))|((\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])\\s*((:\\s*\\[?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))))", - "beginCaptures": { - "1": { - "name": "meta.brace.round.mongodb" - } - }, - "end": "\\)", - "endCaptures": { - "0": { - "name": "meta.brace.round.mongodb" - } - }, - "patterns": [ - { - "include": "#expression-inside-possibly-arrow-parens" - } - ] - }, - { - "include": "#possibly-arrow-return-type" - }, - { - "include": "#expression" - } - ] - }, - { - "include": "#punctuation-comma" - } - ] - }, - "ternary-expression": { - "begin": "(?!\\?\\.\\s*[^[:digit:]])(\\?)(?!\\?)", - "beginCaptures": { - "1": { - "name": "keyword.operator.ternary.mongodb" - } - }, - "end": "\\s*(:)", - "endCaptures": { - "1": { - "name": "keyword.operator.ternary.mongodb" - } - }, - "patterns": [ - { - "include": "#expression" - } - ] - }, - "function-call": { - "begin": "(?=(((([_$[:alpha:]][_$[:alnum:]]*)(\\s*\\??\\.\\s*(\\#?[_$[:alpha:]][_$[:alnum:]]*))*)|(\\??\\.\\s*\\#?[_$[:alpha:]][_$[:alnum:]]*))|(?<=[\\)]))\\s*(?:(\\?\\.\\s*)|(\\!))?(<\\s*(((keyof|infer|typeof|readonly)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer|typeof|readonly)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))(([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer|typeof|readonly)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?))*(?)*(?\\s*)?\\()", - "end": "(?<=\\))(?!(((([_$[:alpha:]][_$[:alnum:]]*)(\\s*\\??\\.\\s*(\\#?[_$[:alpha:]][_$[:alnum:]]*))*)|(\\??\\.\\s*\\#?[_$[:alpha:]][_$[:alnum:]]*))|(?<=[\\)]))\\s*(?:(\\?\\.\\s*)|(\\!))?(<\\s*(((keyof|infer|typeof|readonly)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer|typeof|readonly)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))(([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer|typeof|readonly)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?))*(?)*(?\\s*)?\\()", - "patterns": [ - { - "name": "meta.function-call.mongodb", - "begin": "(?=(([_$[:alpha:]][_$[:alnum:]]*)(\\s*\\??\\.\\s*(\\#?[_$[:alpha:]][_$[:alnum:]]*))*)|(\\??\\.\\s*\\#?[_$[:alpha:]][_$[:alnum:]]*))", - "end": "(?=\\s*(?:(\\?\\.\\s*)|(\\!))?(<\\s*(((keyof|infer|typeof|readonly)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer|typeof|readonly)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))(([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer|typeof|readonly)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?))*(?)*(?\\s*)?\\()", - "patterns": [ - { - "include": "#support-function-call-identifiers" - }, - { - "name": "entity.name.function.mongodb", - "match": "(\\#?[_$[:alpha:]][_$[:alnum:]]*)" - } - ] - }, - { - "include": "#comment" - }, - { - "name": "meta.function-call.mongodb punctuation.accessor.optional.mongodb", - "match": "\\?\\." - }, - { - "name": "meta.function-call.mongodb keyword.operator.definiteassignment.mongodb", - "match": "\\!" - }, - { - "include": "#type-arguments" - }, - { - "include": "#paren-expression" - } - ] - }, - "support-function-call-identifiers": { - "patterns": [ - { - "include": "#literal" - }, - { - "include": "#support-objects" - }, - { - "include": "#object-identifiers" - }, - { - "include": "#punctuation-accessor" - }, - { - "name": "keyword.operator.expression.import.mongodb", - "match": "(?:(?]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*))?\\(\\s*((([\\{\\[]\\s*)?$)|((\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})\\s*((:\\s*\\{?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))|((\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])\\s*((:\\s*\\[?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))))", - "beginCaptures": { - "1": { - "name": "storage.modifier.async.mongodb" - } - }, - "end": "(?<=\\))", - "patterns": [ - { - "include": "#paren-expression-possibly-arrow-with-typeparameters" - } - ] - }, - { - "begin": "(?<=[(=,]|=>|^return|[^\\._$[:alnum:]]return)\\s*(async)?(?=\\s*((((<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*))?\\()|(<))\\s*$)", - "beginCaptures": { - "1": { - "name": "storage.modifier.async.mongodb" - } - }, - "end": "(?<=\\))", - "patterns": [ - { - "include": "#paren-expression-possibly-arrow-with-typeparameters" - } - ] - }, - { - "include": "#possibly-arrow-return-type" - } - ] - }, - "paren-expression-possibly-arrow-with-typeparameters": { - "patterns": [ - { - "include": "#type-parameters" - }, - { - "begin": "\\(", - "beginCaptures": { - "0": { - "name": "meta.brace.round.mongodb" - } - }, - "end": "\\)", - "endCaptures": { - "0": { - "name": "meta.brace.round.mongodb" - } - }, - "patterns": [ - { - "include": "#expression-inside-possibly-arrow-parens" - } - ] - } - ] - }, - "expression-inside-possibly-arrow-parens": { - "patterns": [ - { - "include": "#expressionWithoutIdentifiers" - }, - { - "include": "#comment" - }, - { - "include": "#string" - }, - { - "include": "#decorator" - }, - { - "include": "#destructuring-parameter" - }, - { - "match": "(?)\n )) |\n ((async\\s*)?(\n ((<\\s*$)|((<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?[\\(]\\s*((([\\{\\[]\\s*)?$)|((\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})\\s*((:\\s*\\{?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))|((\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])\\s*((:\\s*\\[?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))))) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?\n [(]\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)? # typeparameters\n \\(\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\.\\.\\.\\s*[_$[:alpha:]]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(?]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?[\\(]\\s*((([\\{\\[]\\s*)?$)|((\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})\\s*((:\\s*\\{?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))|((\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])\\s*((:\\s*\\[?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*))))))) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ((<\\s*$)|((<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?[\\(]\\s*((([\\{\\[]\\s*)?$)|((\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})\\s*((:\\s*\\{?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))|((\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])\\s*((:\\s*\\[?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))))) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?\n [(]\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)? # typeparameters\n \\(\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\.\\.\\.\\s*[_$[:alpha:]]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", - "captures": { - "1": { - "name": "storage.modifier.mongodb" - }, - "2": { - "name": "keyword.operator.rest.mongodb" - }, - "3": { - "name": "entity.name.function.mongodb variable.language.this.mongodb" - }, - "4": { - "name": "entity.name.function.mongodb" - }, - "5": { - "name": "keyword.operator.optional.mongodb" - } - } - }, - { - "match": "(?x)(?:(?)", - "captures": { - "1": { - "name": "meta.brace.angle.mongodb" - }, - "2": { - "name": "storage.modifier.mongodb" - }, - "3": { - "name": "meta.brace.angle.mongodb" - } - } - }, - { - "name": "cast.expr.mongodb", - "begin": "(?:(?*?\\&\\|\\^]|[^_$[:alnum:]](?:\\+\\+|\\-\\-)|[^\\+]\\+|[^\\-]\\-))\\s*(<)(?!)", - "endCaptures": { - "1": { - "name": "meta.brace.angle.mongodb" - } - }, - "patterns": [ - { - "include": "#type" - } - ] - }, - { - "name": "cast.expr.mongodb", - "begin": "(?:(?<=^))\\s*(<)(?=[_$[:alpha:]][_$[:alnum:]]*\\s*>)", - "beginCaptures": { - "1": { - "name": "meta.brace.angle.mongodb" - } - }, - "end": "(\\>)", - "endCaptures": { - "1": { - "name": "meta.brace.angle.mongodb" - } - }, - "patterns": [ - { - "include": "#type" - } - ] - } - ] - }, - "expression-operators": { - "patterns": [ - { - "name": "keyword.control.flow.mongodb", - "match": "(?>=|>>>=|\\|=" - }, - { - "name": "keyword.operator.bitwise.shift.mongodb", - "match": "<<|>>>|>>" - }, - { - "name": "keyword.operator.comparison.mongodb", - "match": "===|!==|==|!=" - }, - { - "name": "keyword.operator.relational.mongodb", - "match": "<=|>=|<>|<|>" - }, - { - "match": "(\\!)\\s*(/)(?![/*])", - "captures": { - "1": { - "name": "keyword.operator.logical.mongodb" - }, - "2": { - "name": "keyword.operator.arithmetic.mongodb" - } - } - }, - { - "name": "keyword.operator.logical.mongodb", - "match": "\\!|&&|\\|\\||\\?\\?" - }, - { - "name": "keyword.operator.bitwise.mongodb", - "match": "\\&|~|\\^|\\|" - }, - { - "name": "keyword.operator.assignment.mongodb", - "match": "\\=" - }, - { - "name": "keyword.operator.decrement.mongodb", - "match": "--" - }, - { - "name": "keyword.operator.increment.mongodb", - "match": "\\+\\+" - }, - { - "name": "keyword.operator.arithmetic.mongodb", - "match": "%|\\*|/|-|\\+" - }, - { - "begin": "(?<=[_$[:alnum:])\\]])\\s*(?=(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)+(/)(?![/*]))", - "end": "(/)(?!\\*([^\\*]|(\\*[^\\/]))*\\*\\/)", - "endCaptures": { - "1": { - "name": "keyword.operator.arithmetic.mongodb" - } - }, - "patterns": [ - { - "include": "#comment" - } - ] - }, - { - "match": "(?<=[_$[:alnum:])\\]])\\s*(/)(?![/*])", - "captures": { - "1": { - "name": "keyword.operator.arithmetic.mongodb" - } - } - } - ] - }, - "typeof-operator": { - "name": "keyword.operator.expression.typeof.mongodb", - "match": "(?]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?\\())\n |\n (?:(EPSILON|MAX_SAFE_INTEGER|MAX_VALUE|MIN_SAFE_INTEGER|MIN_VALUE|NEGATIVE_INFINITY|POSITIVE_INFINITY)\\b(?!\\$)))", - "captures": { - "1": { - "name": "punctuation.accessor.mongodb" - }, - "2": { - "name": "punctuation.accessor.optional.mongodb" - }, - "3": { - "name": "support.variable.property.mongodb" - }, - "4": { - "name": "support.constant.mongodb" - } - } - }, - { - "match": "(?x) (?]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?\\()", - "captures": { - "1": { - "name": "punctuation.accessor.mongodb" - }, - "2": { - "name": "punctuation.accessor.optional.mongodb" - }, - "3": { - "name": "support.constant.dom.mongodb" - }, - "4": { - "name": "support.variable.property.dom.mongodb" - } - } - }, - { - "name": "support.class.node.mongodb", - "match": "(?x)(?)\n )) |\n ((async\\s*)?(\n ((<\\s*$)|((<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?[\\(]\\s*((([\\{\\[]\\s*)?$)|((\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})\\s*((:\\s*\\{?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))|((\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])\\s*((:\\s*\\[?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))))) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?\n [(]\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)? # typeparameters\n \\(\\s*(\\/\\*([^\\*]|(\\*[^\\/]))*\\*\\/\\s*)*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\.\\.\\.\\s*[_$[:alpha:]]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+)? # return type\n \\s*=> # arrow operator\n)\n ))\n))", - "captures": { - "1": { - "name": "punctuation.accessor.mongodb" - }, - "2": { - "name": "punctuation.accessor.optional.mongodb" - }, - "3": { - "name": "entity.name.function.mongodb" - } - } - }, - { - "match": "(?:(\\.)|(\\?\\.(?!\\s*[[:digit:]])))\\s*(\\#?[[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])", - "captures": { - "1": { - "name": "punctuation.accessor.mongodb" - }, - "2": { - "name": "punctuation.accessor.optional.mongodb" - }, - "3": { - "name": "variable.other.constant.property.mongodb" - } - } - }, - { - "match": "(?:(\\.)|(\\?\\.(?!\\s*[[:digit:]])))\\s*(\\#?[_$[:alpha:]][_$[:alnum:]]*)", - "captures": { - "1": { - "name": "punctuation.accessor.mongodb" - }, - "2": { - "name": "punctuation.accessor.optional.mongodb" - }, - "3": { - "name": "variable.other.property.mongodb" - } - } - }, - { - "name": "variable.other.constant.mongodb", - "match": "([[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])" - }, - { - "name": "variable.other.readwrite.mongodb", - "match": "[_$[:alpha:]][_$[:alnum:]]*" - } - ] - }, - "object-identifiers": { - "patterns": [ - { - "name": "support.class.mongodb", - "match": "([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*\\??\\.\\s*prototype\\b(?!\\$))" - }, - { - "match": "(?x)(?:(\\.)|(\\?\\.(?!\\s*[[:digit:]])))\\s*(?:\n (\\#?[[:upper:]][_$[:digit:][:upper:]]*) |\n (\\#?[_$[:alpha:]][_$[:alnum:]]*)\n)(?=\\s*\\??\\.\\s*\\#?[_$[:alpha:]][_$[:alnum:]]*)", - "captures": { - "1": { - "name": "punctuation.accessor.mongodb" - }, - "2": { - "name": "punctuation.accessor.optional.mongodb" - }, - "3": { - "name": "variable.other.constant.object.property.mongodb" - }, - "4": { - "name": "variable.other.object.property.mongodb" - } - } - }, - { - "match": "(?x)(?:\n ([[:upper:]][_$[:digit:][:upper:]]*) |\n ([_$[:alpha:]][_$[:alnum:]]*)\n)(?=\\s*\\??\\.\\s*\\#?[_$[:alpha:]][_$[:alnum:]]*)", - "captures": { - "1": { - "name": "variable.other.constant.object.mongodb" - }, - "2": { - "name": "variable.other.object.mongodb" - } - } - } - ] - }, - "type-annotation": { - "patterns": [ - { - "name": "meta.type.annotation.mongodb", - "begin": "(:)(?=\\s*\\S)", - "beginCaptures": { - "1": { - "name": "keyword.operator.type.annotation.mongodb" - } - }, - "end": "(?])|((?<=[\\}>\\]\\)]|[_$[:alpha:]])\\s*(?=\\{)))", - "patterns": [ - { - "include": "#type" - } - ] - }, - { - "name": "meta.type.annotation.mongodb", - "begin": "(:)", - "beginCaptures": { - "1": { - "name": "keyword.operator.type.annotation.mongodb" - } - }, - "end": "(?])|(?=^\\s*$)|((?<=\\S)(?=\\s*$))|((?<=[\\}>\\]\\)]|[_$[:alpha:]])\\s*(?=\\{)))", - "patterns": [ - { - "include": "#type" - } - ] - } - ] - }, - "parameter-type-annotation": { - "patterns": [ - { - "name": "meta.type.annotation.mongodb", - "begin": "(:)", - "beginCaptures": { - "1": { - "name": "keyword.operator.type.annotation.mongodb" - } - }, - "end": "(?=[,)])|(?==[^>])", - "patterns": [ - { - "include": "#type" - } - ] - } - ] - }, - "return-type": { - "patterns": [ - { - "name": "meta.return.type.mongodb", - "begin": "(?<=\\))\\s*(:)(?=\\s*\\S)", - "beginCaptures": { - "1": { - "name": "keyword.operator.type.annotation.mongodb" - } - }, - "end": "(?|\\{|(^\\s*(export|function|class|interface|let|var|const|import|enum|namespace|module|type|abstract|declare)\\s+))", - "patterns": [ - { - "include": "#arrow-return-type-body" - } - ] - }, - "possibly-arrow-return-type": { - "begin": "(?<=\\)|^)\\s*(:)(?=\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*=>)", - "beginCaptures": { - "1": { - "name": "meta.arrow.mongodb meta.return.type.arrow.mongodb keyword.operator.type.annotation.mongodb" - } - }, - "end": "(?==>|\\{|(^\\s*(export|function|class|interface|let|var|const|import|enum|namespace|module|type|abstract|declare)\\s+))", - "contentName": "meta.arrow.mongodb meta.return.type.arrow.mongodb", - "patterns": [ - { - "include": "#arrow-return-type-body" - } - ] - }, - "arrow-return-type-body": { - "patterns": [ - { - "begin": "(?<=[:])(?=\\s*\\{)", - "end": "(?<=\\})", - "patterns": [ - { - "include": "#type-object" - } - ] - }, - { - "include": "#type-predicate-operator" - }, - { - "include": "#type" - } - ] - }, - "type-parameters": { - "name": "meta.type.parameters.mongodb", - "begin": "(<)", - "beginCaptures": { - "1": { - "name": "punctuation.definition.typeparameters.begin.mongodb" - } - }, - "end": "(>)", - "endCaptures": { - "1": { - "name": "punctuation.definition.typeparameters.end.mongodb" - } - }, - "patterns": [ - { - "include": "#comment" - }, - { - "name": "storage.modifier.mongodb", - "match": "(?)" - } - ] - }, - "type-arguments": { - "name": "meta.type.parameters.mongodb", - "begin": "\\<", - "beginCaptures": { - "0": { - "name": "punctuation.definition.typeparameters.begin.mongodb" - } - }, - "end": "\\>", - "endCaptures": { - "0": { - "name": "punctuation.definition.typeparameters.end.mongodb" - } - }, - "patterns": [ - { - "include": "#type-arguments-body" - } - ] - }, - "type-arguments-body": { - "patterns": [ - { - "match": "(?)\n ))\n ))\n)) |\n(:\\s*(?]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*\\>)*>\\s*)?[\\(]\\s*((([\\{\\[]\\s*)?$)|((\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})\\s*((:\\s*\\{?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*)))|((\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])\\s*((:\\s*\\[?$)|((\\s*([^<>\\(\\)\\{\\}]|\\<([^<>]|\\<[^<>]+\\>)+\\>|\\([^\\(\\)]+\\)|\\{[^\\{\\}]+\\})+\\s*)?=\\s*))))))))", - "captures": { - "1": { - "name": "storage.modifier.mongodb" - }, - "2": { - "name": "keyword.operator.rest.mongodb" - }, - "3": { - "name": "entity.name.function.mongodb variable.language.this.mongodb" - }, - "4": { - "name": "entity.name.function.mongodb" - }, - "5": { - "name": "keyword.operator.optional.mongodb" - } - } - }, - { - "match": "(?x)(?:(?)", - "patterns": [ - { - "include": "#comment" - }, - { - "include": "#type-parameters" - } - ] - }, - { - "name": "meta.type.constructor.mongodb", - "begin": "(?)\n ))\n )\n )\n)", - "end": "(?<=\\))", - "patterns": [ - { - "include": "#function-parameters" - } - ] - } - ] - }, - "type-function-return-type": { - "patterns": [ - { - "name": "meta.type.function.return.mongodb", - "begin": "(=>)(?=\\s*\\S)", - "beginCaptures": { - "1": { - "name": "storage.type.function.arrow.mongodb" - } - }, - "end": "(?)(?:\\?]|//|$)", - "patterns": [ - { - "include": "#type-function-return-type-core" - } - ] - }, - { - "name": "meta.type.function.return.mongodb", - "begin": "=>", - "beginCaptures": { - "0": { - "name": "storage.type.function.arrow.mongodb" - } - }, - "end": "(?)(?]|//|^\\s*$)|((?<=\\S)(?=\\s*$)))", - "patterns": [ - { - "include": "#type-function-return-type-core" - } - ] - } - ] - }, - "type-function-return-type-core": { - "patterns": [ - { - "include": "#comment" - }, - { - "begin": "(?<==>)(?=\\s*\\{)", - "end": "(?<=\\})", - "patterns": [ - { - "include": "#type-object" - } - ] - }, - { - "include": "#type-predicate-operator" - }, - { - "include": "#type" - } - ] - }, - "type-operators": { - "patterns": [ - { - "include": "#typeof-operator" - }, - { - "begin": "([&|])(?=\\s*\\{)", - "beginCaptures": { - "0": { - "name": "keyword.operator.type.mongodb" - } - }, - "end": "(?<=\\})", - "patterns": [ - { - "include": "#type-object" - } - ] - }, - { - "begin": "[&|]", - "beginCaptures": { - "0": { - "name": "keyword.operator.type.mongodb" - } - }, - "end": "(?=\\S)" - }, - { - "name": "keyword.operator.expression.keyof.mongodb", - "match": "(?)", - "endCaptures": { - "1": { - "name": "meta.type.parameters.mongodb punctuation.definition.typeparameters.end.mongodb" - } - }, - "contentName": "meta.type.parameters.mongodb", - "patterns": [ - { - "include": "#type-arguments-body" - } - ] - }, - { - "begin": "([_$[:alpha:]][_$[:alnum:]]*)\\s*(<)", - "beginCaptures": { - "1": { - "name": "entity.name.type.mongodb" - }, - "2": { - "name": "meta.type.parameters.mongodb punctuation.definition.typeparameters.begin.mongodb" - } - }, - "end": "(>)", - "endCaptures": { - "1": { - "name": "meta.type.parameters.mongodb punctuation.definition.typeparameters.end.mongodb" - } - }, - "contentName": "meta.type.parameters.mongodb", - "patterns": [ - { - "include": "#type-arguments-body" - } - ] - }, - { - "match": "([_$[:alpha:]][_$[:alnum:]]*)\\s*(?:(\\.)|(\\?\\.(?!\\s*[[:digit:]])))", - "captures": { - "1": { - "name": "entity.name.type.module.mongodb" - }, - "2": { - "name": "punctuation.accessor.mongodb" - }, - "3": { - "name": "punctuation.accessor.optional.mongodb" - } - } - }, - { - "name": "entity.name.type.mongodb", - "match": "[_$[:alpha:]][_$[:alnum:]]*" - } - ] - }, - "punctuation-comma": { - "name": "punctuation.separator.comma.mongodb", - "match": "," - }, - "punctuation-semicolon": { - "name": "punctuation.terminator.statement.mongodb", - "match": ";" - }, - "punctuation-accessor": { - "match": "(?:(\\.)|(\\?\\.(?!\\s*[[:digit:]])))", - "captures": { - "1": { - "name": "punctuation.accessor.mongodb" - }, - "2": { - "name": "punctuation.accessor.optional.mongodb" - } - } - }, - "string": { - "patterns": [ - { - "include": "#qstring-single" - }, - { - "include": "#qstring-double" - }, - { - "include": "#template" - } - ] - }, - "qstring-double": { - "name": "string.quoted.double.mongodb", - "begin": "\"", - "beginCaptures": { - "0": { - "name": "punctuation.definition.string.begin.mongodb" - } - }, - "end": "(\")|((?:[^\\\\\\n])$)", - "endCaptures": { - "1": { - "name": "punctuation.definition.string.end.mongodb" - }, - "2": { - "name": "invalid.illegal.newline.mongodb" - } - }, - "patterns": [ - { - "include": "#string-character-escape" - } - ] - }, - "qstring-single": { - "name": "string.quoted.single.mongodb", - "begin": "'", - "beginCaptures": { - "0": { - "name": "punctuation.definition.string.begin.mongodb" - } - }, - "end": "(\\')|((?:[^\\\\\\n])$)", - "endCaptures": { - "1": { - "name": "punctuation.definition.string.end.mongodb" - }, - "2": { - "name": "invalid.illegal.newline.mongodb" - } - }, - "patterns": [ - { - "include": "#string-character-escape" - } - ] - }, - "string-character-escape": { - "name": "constant.character.escape.mongodb", - "match": "\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4}|u\\{[0-9A-Fa-f]+\\}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.|$)" - }, - "template": { - "patterns": [ - { - "name": "string.template.mongodb", - "begin": "(?=(([_$[:alpha:]][_$[:alnum:]]*\\s*\\??\\.\\s*)*|(\\??\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*)(<\\s*(((keyof|infer|typeof|readonly)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer|typeof|readonly)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))(([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer|typeof|readonly)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?))*(?)*(?\\s*)?`)", - "end": "(?=`)", - "patterns": [ - { - "begin": "(?=(([_$[:alpha:]][_$[:alnum:]]*\\s*\\??\\.\\s*)*|(\\??\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*))", - "end": "(?=(<\\s*(((keyof|infer|typeof|readonly)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer|typeof|readonly)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))(([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer|typeof|readonly)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?))*(?)*(?\\s*)?`)", - "patterns": [ - { - "include": "#support-function-call-identifiers" - }, - { - "name": "entity.name.function.tagged-template.mongodb", - "match": "([_$[:alpha:]][_$[:alnum:]]*)" - } - ] - }, - { - "include": "#type-arguments" - } - ] - }, - { - "name": "string.template.mongodb", - "begin": "([_$[:alpha:]][_$[:alnum:]]*)\\s*(?=(<\\s*(((keyof|infer|typeof|readonly)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer|typeof|readonly)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))(([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer|typeof|readonly)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?))*(?)*(?\\s*)`)", - "beginCaptures": { - "1": { - "name": "entity.name.function.tagged-template.mongodb" - } - }, - "end": "(?=`)", - "patterns": [ - { - "include": "#type-arguments" - } - ] - }, - { - "name": "string.template.mongodb", - "begin": "([_$[:alpha:]][_$[:alnum:]]*)?(`)", - "beginCaptures": { - "1": { - "name": "entity.name.function.tagged-template.mongodb" - }, - "2": { - "name": "punctuation.definition.string.template.begin.mongodb" - } - }, - "end": "`", - "endCaptures": { - "0": { - "name": "punctuation.definition.string.template.end.mongodb" - } - }, - "patterns": [ - { - "include": "#template-substitution-element" - }, - { - "include": "#string-character-escape" - } - ] - } - ] - }, - "template-substitution-element": { - "name": "meta.template.expression.mongodb", - "begin": "\\$\\{", - "beginCaptures": { - "0": { - "name": "punctuation.definition.template-expression.begin.mongodb" - } - }, - "end": "\\}", - "endCaptures": { - "0": { - "name": "punctuation.definition.template-expression.end.mongodb" - } - }, - "patterns": [ - { - "include": "#expression" - } - ], - "contentName": "meta.embedded.line.mongodb" - }, - "regex": { - "patterns": [ - { - "name": "string.regexp.mongodb", - "begin": "(?|&&|\\|\\||\\*\\/)\\s*(\\/)(?![\\/*])(?=(?:[^\\/\\\\\\[\\()]|\\\\.|\\[([^\\]\\\\]|\\\\.)+\\]|\\(([^\\)\\\\]|\\\\.)+\\))+\\/([gimsuy]+|(?![\\/\\*])|(?=\\/\\*))(?!\\s*[a-zA-Z0-9_$]))", - "beginCaptures": { - "1": { - "name": "punctuation.definition.string.begin.mongodb" - } - }, - "end": "(/)([gimsuy]*)", - "endCaptures": { - "1": { - "name": "punctuation.definition.string.end.mongodb" - }, - "2": { - "name": "keyword.other.mongodb" - } - }, - "patterns": [ - { - "include": "#regexp" - } - ] - }, - { - "name": "string.regexp.mongodb", - "begin": "((?", - "captures": { - "0": { - "name": "keyword.other.back-reference.regexp" - }, - "1": { - "name": "variable.other.regexp" - } - } - }, - { - "name": "keyword.operator.quantifier.regexp", - "match": "[?+*]|\\{(\\d+,\\d+|\\d+,|,\\d+|\\d+)\\}\\??" - }, - { - "name": "keyword.operator.or.regexp", - "match": "\\|" - }, - { - "name": "meta.group.assertion.regexp", - "begin": "(\\()((\\?=)|(\\?!)|(\\?<=)|(\\?))?", - "beginCaptures": { - "0": { - "name": "punctuation.definition.group.regexp" - }, - "1": { - "name": "punctuation.definition.group.no-capture.regexp" - }, - "2": { - "name": "variable.other.regexp" - } - }, - "end": "\\)", - "endCaptures": { - "0": { - "name": "punctuation.definition.group.regexp" - } - }, - "patterns": [ - { - "include": "#regexp" - } - ] - }, - { - "name": "constant.other.character-class.set.regexp", - "begin": "(\\[)(\\^)?", - "beginCaptures": { - "1": { - "name": "punctuation.definition.character-class.regexp" - }, - "2": { - "name": "keyword.operator.negation.regexp" - } - }, - "end": "(\\])", - "endCaptures": { - "1": { - "name": "punctuation.definition.character-class.regexp" - } - }, - "patterns": [ - { - "name": "constant.other.character-class.range.regexp", - "match": "(?:.|(\\\\(?:[0-7]{3}|x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4}))|(\\\\c[A-Z])|(\\\\.))\\-(?:[^\\]\\\\]|(\\\\(?:[0-7]{3}|x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4}))|(\\\\c[A-Z])|(\\\\.))", - "captures": { - "1": { - "name": "constant.character.numeric.regexp" - }, - "2": { - "name": "constant.character.control.regexp" - }, - "3": { - "name": "constant.character.escape.backslash.regexp" - }, - "4": { - "name": "constant.character.numeric.regexp" - }, - "5": { - "name": "constant.character.control.regexp" - }, - "6": { - "name": "constant.character.escape.backslash.regexp" - } - } - }, - { - "include": "#regex-character-class" - } - ] - }, - { - "include": "#regex-character-class" - } - ] - }, - "regex-character-class": { - "patterns": [ - { - "name": "constant.other.character-class.regexp", - "match": "\\\\[wWsSdDtrnvf]|\\." - }, - { - "name": "constant.character.numeric.regexp", - "match": "\\\\([0-7]{3}|x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4})" - }, - { - "name": "constant.character.control.regexp", - "match": "\\\\c[A-Z]" - }, - { - "name": "constant.character.escape.backslash.regexp", - "match": "\\\\." - } - ] - }, - "comment": { - "patterns": [ - { - "name": "comment.block.documentation.mongodb", - "begin": "/\\*\\*(?!/)", - "beginCaptures": { - "0": { - "name": "punctuation.definition.comment.mongodb" - } - }, - "end": "\\*/", - "endCaptures": { - "0": { - "name": "punctuation.definition.comment.mongodb" - } - }, - "patterns": [ - { - "include": "#docblock" - } - ] - }, - { - "name": "comment.block.mongodb", - "begin": "(/\\*)(?:\\s*((@)internal)(?=\\s|(\\*/)))?", - "beginCaptures": { - "1": { - "name": "punctuation.definition.comment.mongodb" - }, - "2": { - "name": "storage.type.internaldeclaration.mongodb" - }, - "3": { - "name": "punctuation.decorator.internaldeclaration.mongodb" - } - }, - "end": "\\*/", - "endCaptures": { - "0": { - "name": "punctuation.definition.comment.mongodb" - } - } - }, - { - "begin": "(^[ \\t]+)?((//)(?:\\s*((@)internal)(?=\\s|$))?)", - "beginCaptures": { - "1": { - "name": "punctuation.whitespace.comment.leading.mongodb" - }, - "2": { - "name": "comment.line.double-slash.mongodb" - }, - "3": { - "name": "punctuation.definition.comment.mongodb" - }, - "4": { - "name": "storage.type.internaldeclaration.mongodb" - }, - "5": { - "name": "punctuation.decorator.internaldeclaration.mongodb" - } - }, - "end": "(?=$)", - "contentName": "comment.line.double-slash.mongodb" - } - ] - }, - "single-line-comment-consuming-line-ending": { - "begin": "(^[ \\t]+)?((//)(?:\\s*((@)internal)(?=\\s|$))?)", - "beginCaptures": { - "1": { - "name": "punctuation.whitespace.comment.leading.mongodb" - }, - "2": { - "name": "comment.line.double-slash.mongodb" - }, - "3": { - "name": "punctuation.definition.comment.mongodb" - }, - "4": { - "name": "storage.type.internaldeclaration.mongodb" - }, - "5": { - "name": "punctuation.decorator.internaldeclaration.mongodb" - } - }, - "end": "(?=^)", - "contentName": "comment.line.double-slash.mongodb" - }, - "directives": { - "name": "comment.line.triple-slash.directive.mongodb", - "begin": "^(///)\\s*(?=<(reference|amd-dependency|amd-module)(\\s+(path|types|no-default-lib|lib|name)\\s*=\\s*((\\'([^\\'\\\\]|\\\\.)*\\')|(\\\"([^\\\"\\\\]|\\\\.)*\\\")|(\\`([^\\`\\\\]|\\\\.)*\\`)))+\\s*/>\\s*$)", - "beginCaptures": { - "1": { - "name": "punctuation.definition.comment.mongodb" - } - }, - "end": "(?=$)", - "patterns": [ - { - "name": "meta.tag.mongodb", - "begin": "(<)(reference|amd-dependency|amd-module)", - "beginCaptures": { - "1": { - "name": "punctuation.definition.tag.directive.mongodb" - }, - "2": { - "name": "entity.name.tag.directive.mongodb" - } - }, - "end": "/>", - "endCaptures": { - "0": { - "name": "punctuation.definition.tag.directive.mongodb" - } - }, - "patterns": [ - { - "name": "entity.other.attribute-name.directive.mongodb", - "match": "path|types|no-default-lib|lib|name" - }, - { - "name": "keyword.operator.assignment.mongodb", - "match": "=" - }, - { - "include": "#string" - } - ] - } - ] - }, - "docblock": { - "patterns": [ - { - "match": "(?x)\n((@)(?:access|api))\n\\s+\n(private|protected|public)\n\\b", - "captures": { - "1": { - "name": "storage.type.class.jsdoc" - }, - "2": { - "name": "punctuation.definition.block.tag.jsdoc" - }, - "3": { - "name": "constant.language.access-type.jsdoc" - } - } - }, - { - "match": "(?x)\n((@)author)\n\\s+\n(\n [^@\\s<>*/]\n (?:[^@<>*/]|\\*[^/])*\n)\n(?:\n \\s*\n (<)\n ([^>\\s]+)\n (>)\n)?", - "captures": { - "1": { - "name": "storage.type.class.jsdoc" - }, - "2": { - "name": "punctuation.definition.block.tag.jsdoc" - }, - "3": { - "name": "entity.name.type.instance.jsdoc" - }, - "4": { - "name": "punctuation.definition.bracket.angle.begin.jsdoc" - }, - "5": { - "name": "constant.other.email.link.underline.jsdoc" - }, - "6": { - "name": "punctuation.definition.bracket.angle.end.jsdoc" - } - } - }, - { - "match": "(?x)\n((@)borrows) \\s+\n((?:[^@\\s*/]|\\*[^/])+) # \n\\s+ (as) \\s+ # as\n((?:[^@\\s*/]|\\*[^/])+) # ", - "captures": { - "1": { - "name": "storage.type.class.jsdoc" - }, - "2": { - "name": "punctuation.definition.block.tag.jsdoc" - }, - "3": { - "name": "entity.name.type.instance.jsdoc" - }, - "4": { - "name": "keyword.operator.control.jsdoc" - }, - "5": { - "name": "entity.name.type.instance.jsdoc" - } - } - }, - { - "name": "meta.example.jsdoc", - "begin": "((@)example)\\s+", - "end": "(?=@|\\*/)", - "beginCaptures": { - "1": { - "name": "storage.type.class.jsdoc" - }, - "2": { - "name": "punctuation.definition.block.tag.jsdoc" - } - }, - "patterns": [ - { - "match": "^\\s\\*\\s+" - }, - { - "contentName": "constant.other.description.jsdoc", - "begin": "\\G(<)caption(>)", - "beginCaptures": { - "0": { - "name": "entity.name.tag.inline.jsdoc" - }, - "1": { - "name": "punctuation.definition.bracket.angle.begin.jsdoc" - }, - "2": { - "name": "punctuation.definition.bracket.angle.end.jsdoc" - } - }, - "end": "()|(?=\\*/)", - "endCaptures": { - "0": { - "name": "entity.name.tag.inline.jsdoc" - }, - "1": { - "name": "punctuation.definition.bracket.angle.begin.jsdoc" - }, - "2": { - "name": "punctuation.definition.bracket.angle.end.jsdoc" - } - } - }, - { - "match": "[^\\s@*](?:[^*]|\\*[^/])*", - "captures": { - "0": { - "name": "source.embedded.mongodb" - } - } - } - ] - }, - { - "match": "(?x) ((@)kind) \\s+ (class|constant|event|external|file|function|member|mixin|module|namespace|typedef) \\b", - "captures": { - "1": { - "name": "storage.type.class.jsdoc" - }, - "2": { - "name": "punctuation.definition.block.tag.jsdoc" - }, - "3": { - "name": "constant.language.symbol-type.jsdoc" - } - } - }, - { - "match": "(?x)\n((@)see)\n\\s+\n(?:\n # URL\n (\n (?=https?://)\n (?:[^\\s*]|\\*[^/])+\n )\n |\n # JSDoc namepath\n (\n (?!\n # Avoid matching bare URIs (also acceptable as links)\n https?://\n |\n # Avoid matching {@inline tags}; we match those below\n (?:\\[[^\\[\\]]*\\])? # Possible description [preceding]{@tag}\n {@(?:link|linkcode|linkplain|tutorial)\\b\n )\n # Matched namepath\n (?:[^@\\s*/]|\\*[^/])+\n )\n)", - "captures": { - "1": { - "name": "storage.type.class.jsdoc" - }, - "2": { - "name": "punctuation.definition.block.tag.jsdoc" - }, - "3": { - "name": "variable.other.link.underline.jsdoc" - }, - "4": { - "name": "entity.name.type.instance.jsdoc" - } - } - }, - { - "match": "(?x)\n((@)template)\n\\s+\n# One or more valid identifiers\n(\n [A-Za-z_$] # First character: non-numeric word character\n [\\w$.\\[\\]]* # Rest of identifier\n (?: # Possible list of additional identifiers\n \\s* , \\s*\n [A-Za-z_$]\n [\\w$.\\[\\]]*\n )*\n)", - "captures": { - "1": { - "name": "storage.type.class.jsdoc" - }, - "2": { - "name": "punctuation.definition.block.tag.jsdoc" - }, - "3": { - "name": "variable.other.jsdoc" - } - } - }, - { - "match": "(?x)\n(\n (@)\n (?:arg|argument|const|constant|member|namespace|param|var)\n)\n\\s+\n(\n [A-Za-z_$]\n [\\w$.\\[\\]]*\n)", - "captures": { - "1": { - "name": "storage.type.class.jsdoc" - }, - "2": { - "name": "punctuation.definition.block.tag.jsdoc" - }, - "3": { - "name": "variable.other.jsdoc" - } - } - }, - { - "begin": "((@)typedef)\\s+(?={)", - "beginCaptures": { - "1": { - "name": "storage.type.class.jsdoc" - }, - "2": { - "name": "punctuation.definition.block.tag.jsdoc" - } - }, - "end": "(?=\\s|\\*/|[^{}\\[\\]A-Za-z_$])", - "patterns": [ - { - "include": "#jsdoctype" - }, - { - "name": "entity.name.type.instance.jsdoc", - "match": "(?:[^@\\s*/]|\\*[^/])+" - } - ] - }, - { - "begin": "((@)(?:arg|argument|const|constant|member|namespace|param|prop|property|var))\\s+(?={)", - "beginCaptures": { - "1": { - "name": "storage.type.class.jsdoc" - }, - "2": { - "name": "punctuation.definition.block.tag.jsdoc" - } - }, - "end": "(?=\\s|\\*/|[^{}\\[\\]A-Za-z_$])", - "patterns": [ - { - "include": "#jsdoctype" - }, - { - "name": "variable.other.jsdoc", - "match": "([A-Za-z_$][\\w$.\\[\\]]*)" - }, - { - "name": "variable.other.jsdoc", - "match": "(?x)\n(\\[)\\s*\n[\\w$]+\n(?:\n (?:\\[\\])? # Foo[ ].bar properties within an array\n \\. # Foo.Bar namespaced parameter\n [\\w$]+\n)*\n(?:\n \\s*\n (=) # [foo=bar] Default parameter value\n \\s*\n (\n # The inner regexes are to stop the match early at */ and to not stop at escaped quotes\n (?>\n \"(?:(?:\\*(?!/))|(?:\\\\(?!\"))|[^*\\\\])*?\" | # [foo=\"bar\"] Double-quoted\n '(?:(?:\\*(?!/))|(?:\\\\(?!'))|[^*\\\\])*?' | # [foo='bar'] Single-quoted\n \\[ (?:(?:\\*(?!/))|[^*])*? \\] | # [foo=[1,2]] Array literal\n (?:(?:\\*(?!/))|\\s(?!\\s*\\])|\\[.*?(?:\\]|(?=\\*/))|[^*\\s\\[\\]])* # Everything else\n )*\n )\n)?\n\\s*(?:(\\])((?:[^*\\s]|\\*[^\\s/])+)?|(?=\\*/))", - "captures": { - "1": { - "name": "punctuation.definition.optional-value.begin.bracket.square.jsdoc" - }, - "2": { - "name": "keyword.operator.assignment.jsdoc" - }, - "3": { - "name": "source.embedded.mongodb" - }, - "4": { - "name": "punctuation.definition.optional-value.end.bracket.square.jsdoc" - }, - "5": { - "name": "invalid.illegal.syntax.jsdoc" - } - } - } - ] - }, - { - "begin": "(?x)\n(\n (@)\n (?:define|enum|exception|export|extends|lends|implements|modifies\n |namespace|private|protected|returns?|suppress|this|throws|type\n |yields?)\n)\n\\s+(?={)", - "beginCaptures": { - "1": { - "name": "storage.type.class.jsdoc" - }, - "2": { - "name": "punctuation.definition.block.tag.jsdoc" - } - }, - "end": "(?=\\s|\\*/|[^{}\\[\\]A-Za-z_$])", - "patterns": [ - { - "include": "#jsdoctype" - } - ] - }, - { - "match": "(?x)\n(\n (@)\n (?:alias|augments|callback|constructs|emits|event|fires|exports?\n |extends|external|function|func|host|lends|listens|interface|memberof!?\n |method|module|mixes|mixin|name|requires|see|this|typedef|uses)\n)\n\\s+\n(\n (?:\n [^{}@\\s*] | \\*[^/]\n )+\n)", - "captures": { - "1": { - "name": "storage.type.class.jsdoc" - }, - "2": { - "name": "punctuation.definition.block.tag.jsdoc" - }, - "3": { - "name": "entity.name.type.instance.jsdoc" - } - } - }, - { - "contentName": "variable.other.jsdoc", - "begin": "((@)(?:default(?:value)?|license|version))\\s+(([''\"]))", - "beginCaptures": { - "1": { - "name": "storage.type.class.jsdoc" - }, - "2": { - "name": "punctuation.definition.block.tag.jsdoc" - }, - "3": { - "name": "variable.other.jsdoc" - }, - "4": { - "name": "punctuation.definition.string.begin.jsdoc" - } - }, - "end": "(\\3)|(?=$|\\*/)", - "endCaptures": { - "0": { - "name": "variable.other.jsdoc" - }, - "1": { - "name": "punctuation.definition.string.end.jsdoc" - } - } - }, - { - "match": "((@)(?:default(?:value)?|license|tutorial|variation|version))\\s+([^\\s*]+)", - "captures": { - "1": { - "name": "storage.type.class.jsdoc" - }, - "2": { - "name": "punctuation.definition.block.tag.jsdoc" - }, - "3": { - "name": "variable.other.jsdoc" - } - } - }, - { - "name": "storage.type.class.jsdoc", - "match": "(?x) (@) (?:abstract|access|alias|api|arg|argument|async|attribute|augments|author|beta|borrows|bubbles |callback|chainable|class|classdesc|code|config|const|constant|constructor|constructs|copyright |default|defaultvalue|define|deprecated|desc|description|dict|emits|enum|event|example|exception |exports?|extends|extension(?:_?for)?|external|externs|file|fileoverview|final|fires|for|func |function|generator|global|hideconstructor|host|ignore|implements|implicitCast|inherit[Dd]oc |inner|instance|interface|internal|kind|lends|license|listens|main|member|memberof!?|method |mixes|mixins?|modifies|module|name|namespace|noalias|nocollapse|nocompile|nosideeffects |override|overview|package|param|polymer(?:Behavior)?|preserve|private|prop|property|protected |public|read[Oo]nly|record|require[ds]|returns?|see|since|static|struct|submodule|summary |suppress|template|this|throws|todo|tutorial|type|typedef|unrestricted|uses|var|variation |version|virtual|writeOnce|yields?) \\b", - "captures": { - "1": { - "name": "punctuation.definition.block.tag.jsdoc" - } - } - }, - { - "include": "#inline-tags" - }, - { - "match": "((@)(?:[_$[:alpha:]][_$[:alnum:]]*))(?=\\s+)", - "captures": { - "1": { - "name": "storage.type.class.jsdoc" - }, - "2": { - "name": "punctuation.definition.block.tag.jsdoc" - } - } - } - ] - }, - "brackets": { - "patterns": [ - { - "begin": "{", - "end": "}|(?=\\*/)", - "patterns": [ - { - "include": "#brackets" - } - ] - }, - { - "begin": "\\[", - "end": "\\]|(?=\\*/)", - "patterns": [ - { - "include": "#brackets" - } - ] - } - ] - }, - "inline-tags": { - "patterns": [ - { - "name": "constant.other.description.jsdoc", - "match": "(\\[)[^\\]]+(\\])(?={@(?:link|linkcode|linkplain|tutorial))", - "captures": { - "1": { - "name": "punctuation.definition.bracket.square.begin.jsdoc" - }, - "2": { - "name": "punctuation.definition.bracket.square.end.jsdoc" - } - } - }, - { - "name": "entity.name.type.instance.jsdoc", - "begin": "({)((@)(?:link(?:code|plain)?|tutorial))\\s*", - "beginCaptures": { - "1": { - "name": "punctuation.definition.bracket.curly.begin.jsdoc" - }, - "2": { - "name": "storage.type.class.jsdoc" - }, - "3": { - "name": "punctuation.definition.inline.tag.jsdoc" - } - }, - "end": "}|(?=\\*/)", - "endCaptures": { - "0": { - "name": "punctuation.definition.bracket.curly.end.jsdoc" - } - }, - "patterns": [ - { - "match": "\\G((?=https?://)(?:[^|}\\s*]|\\*[/])+)(\\|)?", - "captures": { - "1": { - "name": "variable.other.link.underline.jsdoc" - }, - "2": { - "name": "punctuation.separator.pipe.jsdoc" - } - } - }, - { - "match": "\\G((?:[^{}@\\s|*]|\\*[^/])+)(\\|)?", - "captures": { - "1": { - "name": "variable.other.description.jsdoc" - }, - "2": { - "name": "punctuation.separator.pipe.jsdoc" - } - } - } - ] - } - ] - }, - "jsdoctype": { - "patterns": [ - { - "name": "invalid.illegal.type.jsdoc", - "match": "\\G{(?:[^}*]|\\*[^/}])+$" - }, - { - "contentName": "entity.name.type.instance.jsdoc", - "begin": "\\G({)", - "beginCaptures": { - "0": { - "name": "entity.name.type.instance.jsdoc" - }, - "1": { - "name": "punctuation.definition.bracket.curly.begin.jsdoc" - } - }, - "end": "((}))\\s*|(?=\\*/)", - "endCaptures": { - "1": { - "name": "entity.name.type.instance.jsdoc" - }, - "2": { - "name": "punctuation.definition.bracket.curly.end.jsdoc" - } - }, - "patterns": [ - { - "include": "#brackets" - } - ] - } - ] - } - } -} \ No newline at end of file From 93fdf8c44a6eacbea9090f3608c54defd5cba4ed Mon Sep 17 00:00:00 2001 From: Alena Khineika Date: Thu, 2 Feb 2023 17:27:40 +0100 Subject: [PATCH 03/36] feat: save playgrounds as mongodb ext --- package-lock.json | 503 ++++++++++-------- package.json | 1 + src/editors/playgroundController.ts | 20 +- src/explorer/playgroundsTree.ts | 98 +--- src/mdbExtensionController.ts | 1 + .../suite/editors/codeActionProvider.test.ts | 1 + .../editors/playgroundController.test.ts | 5 + .../language/languageServerController.test.ts | 3 + src/utils/filesystem.ts | 90 ++++ 9 files changed, 411 insertions(+), 311 deletions(-) create mode 100644 src/utils/filesystem.ts diff --git a/package-lock.json b/package-lock.json index 05f68e5f8..8d1687c0e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -61,16 +61,18 @@ "@types/enzyme": "^3.10.12", "@types/glob": "^7.2.0", "@types/jest": "^26.0.24", + "@types/micromatch": "^4.0.2", "@types/mocha": "^8.2.3", "@types/node": "^14.18.29", "@types/react": "^17.0.50", "@types/react-dom": "^17.0.17", "@types/sinon": "^9.0.11", "@types/uuid": "^8.3.4", - "@types/vscode": "^1.71.0", + "@types/vscode": "^1.74.0", "@typescript-eslint/eslint-plugin": "^5.38.0", "@typescript-eslint/parser": "^5.38.0", "@vscode/test-electron": "^2.1.5", + "@vscode/vsce": "^2.16.0", "autoprefixer": "^9.8.8", "buffer": "^6.0.3", "chai": "^4.3.6", @@ -120,7 +122,7 @@ "ts-loader": "^9.4.1", "ts-node": "^10.9.1", "typescript": "^4.8.3", - "vsce": "^2.11.0", + "vscode-html-languageservice": "^5.0.3", "webpack": "^5.74.0", "webpack-cli": "^4.10.0", "xvfb-maybe": "^0.2.1", @@ -2534,6 +2536,12 @@ "@babel/types": "^7.3.0" } }, + "node_modules/@types/braces": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/braces/-/braces-3.0.1.tgz", + "integrity": "sha512-+euflG6ygo4bn0JHtn4pYqcXwRtLvElQ7/nnjDu7iYG56H0+OhCd7d6Ug0IE3WcFpZozBKW2+80FUbv5QGk5AQ==", + "dev": true + }, "node_modules/@types/chai": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.3.tgz", @@ -2765,6 +2773,15 @@ "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", "dev": true }, + "node_modules/@types/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-oqXqVb0ci19GtH0vOA/U2TmHTcRY9kuZl4mqUxe0QmJAlIW13kzhuK5pi1i9+ngav8FjpSb9FVS/GE00GLX1VA==", + "dev": true, + "dependencies": { + "@types/braces": "*" + } + }, "node_modules/@types/minimatch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", @@ -2892,9 +2909,9 @@ "dev": true }, "node_modules/@types/vscode": { - "version": "1.71.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.71.0.tgz", - "integrity": "sha512-nB50bBC9H/x2CpwW9FzRRRDrTZ7G0/POttJojvN/LiVfzTGfLyQIje1L1QRMdFXK9G41k5UJN/1B9S4of7CSzA==", + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.74.0.tgz", + "integrity": "sha512-LyeCIU3jb9d38w0MXFwta9r0Jx23ugujkAxdwLTNCyspdZTKUc43t7ppPbCiPoQ/Ivd/pnDFZrb4hWd45wrsgA==", "dev": true }, "node_modules/@types/webidl-conversions": { @@ -3125,6 +3142,12 @@ "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", "dev": true }, + "node_modules/@vscode/l10n": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/@vscode/l10n/-/l10n-0.0.11.tgz", + "integrity": "sha512-ukOMWnCg1tCvT7WnDfsUKQOFDQGsyR5tNgRpwmqi+5/vzU3ghdDXzvIM4IOPdSb3OeSsBNvmSL8nxIVOqi2WXA==", + "dev": true + }, "node_modules/@vscode/test-electron": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.1.5.tgz", @@ -3140,6 +3163,110 @@ "node": ">=8.9.3" } }, + "node_modules/@vscode/vsce": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-2.17.0.tgz", + "integrity": "sha512-W4HN5MtTVj/mroQU1d82bUEeWM3dUykMFnMYZPtZ6jrMiHN1PUoN3RGcS896N0r2rIq8KpWDtufcQHgK8VfgpA==", + "dev": true, + "dependencies": { + "azure-devops-node-api": "^11.0.1", + "chalk": "^2.4.2", + "cheerio": "^1.0.0-rc.9", + "commander": "^6.1.0", + "glob": "^7.0.6", + "hosted-git-info": "^4.0.2", + "leven": "^3.1.0", + "markdown-it": "^12.3.2", + "mime": "^1.3.4", + "minimatch": "^3.0.3", + "parse-semver": "^1.1.1", + "read": "^1.0.7", + "semver": "^5.1.0", + "tmp": "^0.2.1", + "typed-rest-client": "^1.8.4", + "url-join": "^4.0.1", + "xml2js": "^0.4.23", + "yauzl": "^2.3.1", + "yazl": "^2.2.2" + }, + "bin": { + "vsce": "vsce" + }, + "engines": { + "node": ">= 14" + }, + "optionalDependencies": { + "keytar": "^7.7.0" + } + }, + "node_modules/@vscode/vsce/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@vscode/vsce/node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@vscode/vsce/node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@vscode/vsce/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@vscode/vsce/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@vscode/vsce/node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, "node_modules/@vue/compiler-core": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.1.4.tgz", @@ -13001,15 +13128,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/jest-validate/node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/jest-validate/node_modules/pretty-format": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", @@ -13840,6 +13958,15 @@ "node": ">=0.10.0" } }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -21838,115 +21965,16 @@ "extsprintf": "^1.2.0" } }, - "node_modules/vsce": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/vsce/-/vsce-2.11.0.tgz", - "integrity": "sha512-pr9Y0va/HCer0tTifeqaUrK24JJSpRd6oLeF/PY6FtrY41e+lwxiAq6jfMXx4ShAZglYg2rFKoKROwa7E7SEqQ==", - "dev": true, - "dependencies": { - "azure-devops-node-api": "^11.0.1", - "chalk": "^2.4.2", - "cheerio": "^1.0.0-rc.9", - "commander": "^6.1.0", - "glob": "^7.0.6", - "hosted-git-info": "^4.0.2", - "keytar": "^7.7.0", - "leven": "^3.1.0", - "markdown-it": "^12.3.2", - "mime": "^1.3.4", - "minimatch": "^3.0.3", - "parse-semver": "^1.1.1", - "read": "^1.0.7", - "semver": "^5.1.0", - "tmp": "^0.2.1", - "typed-rest-client": "^1.8.4", - "url-join": "^4.0.1", - "xml2js": "^0.4.23", - "yauzl": "^2.3.1", - "yazl": "^2.2.2" - }, - "bin": { - "vsce": "vsce" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/vsce/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/vsce/node_modules/commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/vsce/node_modules/hosted-git-info": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", - "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/vsce/node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/vsce/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/vsce/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/vscode-html-languageservice": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/vscode-html-languageservice/-/vscode-html-languageservice-5.0.4.tgz", + "integrity": "sha512-tvrySfpglu4B2rQgWGVO/IL+skvU7kBkQotRlxA7ocSyRXOZUd6GA13XHkxo8LPe07KWjeoBlN1aVGqdfTK4xA==", "dev": true, "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/vsce/node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dev": true, - "dependencies": { - "rimraf": "^3.0.0" - }, - "engines": { - "node": ">=8.17.0" + "@vscode/l10n": "^0.0.11", + "vscode-languageserver-textdocument": "^1.0.8", + "vscode-languageserver-types": "^3.17.2", + "vscode-uri": "^3.0.7" } }, "node_modules/vscode-jsonrpc": { @@ -21991,15 +22019,21 @@ } }, "node_modules/vscode-languageserver-textdocument": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.7.tgz", - "integrity": "sha512-bFJH7UQxlXT8kKeyiyu41r22jCZXG8kuuVVA33OEJn1diWOZK5n8zBSPZFHVBOu8kXZ6h0LIRhf5UnCo61J4Hg==" + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz", + "integrity": "sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==" }, "node_modules/vscode-languageserver-types": { "version": "3.17.2", "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.2.tgz", "integrity": "sha512-zHhCWatviizPIq9B7Vh9uvrH6x3sK8itC84HkamnBWoDFJtzBf7SWlpLCZUit72b3os45h6RWQNC9xHRDF8dRA==" }, + "node_modules/vscode-uri": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.7.tgz", + "integrity": "sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==", + "dev": true + }, "node_modules/w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", @@ -24744,6 +24778,12 @@ "@babel/types": "^7.3.0" } }, + "@types/braces": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/braces/-/braces-3.0.1.tgz", + "integrity": "sha512-+euflG6ygo4bn0JHtn4pYqcXwRtLvElQ7/nnjDu7iYG56H0+OhCd7d6Ug0IE3WcFpZozBKW2+80FUbv5QGk5AQ==", + "dev": true + }, "@types/chai": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.3.tgz", @@ -24962,6 +25002,15 @@ "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", "dev": true }, + "@types/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-oqXqVb0ci19GtH0vOA/U2TmHTcRY9kuZl4mqUxe0QmJAlIW13kzhuK5pi1i9+ngav8FjpSb9FVS/GE00GLX1VA==", + "dev": true, + "requires": { + "@types/braces": "*" + } + }, "@types/minimatch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", @@ -25089,9 +25138,9 @@ "dev": true }, "@types/vscode": { - "version": "1.71.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.71.0.tgz", - "integrity": "sha512-nB50bBC9H/x2CpwW9FzRRRDrTZ7G0/POttJojvN/LiVfzTGfLyQIje1L1QRMdFXK9G41k5UJN/1B9S4of7CSzA==", + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.74.0.tgz", + "integrity": "sha512-LyeCIU3jb9d38w0MXFwta9r0Jx23ugujkAxdwLTNCyspdZTKUc43t7ppPbCiPoQ/Ivd/pnDFZrb4hWd45wrsgA==", "dev": true }, "@types/webidl-conversions": { @@ -25231,6 +25280,12 @@ "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", "dev": true }, + "@vscode/l10n": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/@vscode/l10n/-/l10n-0.0.11.tgz", + "integrity": "sha512-ukOMWnCg1tCvT7WnDfsUKQOFDQGsyR5tNgRpwmqi+5/vzU3ghdDXzvIM4IOPdSb3OeSsBNvmSL8nxIVOqi2WXA==", + "dev": true + }, "@vscode/test-electron": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.1.5.tgz", @@ -25243,6 +25298,86 @@ "unzipper": "^0.10.11" } }, + "@vscode/vsce": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-2.17.0.tgz", + "integrity": "sha512-W4HN5MtTVj/mroQU1d82bUEeWM3dUykMFnMYZPtZ6jrMiHN1PUoN3RGcS896N0r2rIq8KpWDtufcQHgK8VfgpA==", + "dev": true, + "requires": { + "azure-devops-node-api": "^11.0.1", + "chalk": "^2.4.2", + "cheerio": "^1.0.0-rc.9", + "commander": "^6.1.0", + "glob": "^7.0.6", + "hosted-git-info": "^4.0.2", + "keytar": "^7.7.0", + "leven": "^3.1.0", + "markdown-it": "^12.3.2", + "mime": "^1.3.4", + "minimatch": "^3.0.3", + "parse-semver": "^1.1.1", + "read": "^1.0.7", + "semver": "^5.1.0", + "tmp": "^0.2.1", + "typed-rest-client": "^1.8.4", + "url-join": "^4.0.1", + "xml2js": "^0.4.23", + "yauzl": "^2.3.1", + "yazl": "^2.2.2" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true + }, + "hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + } + } + } + }, "@vue/compiler-core": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.1.4.tgz", @@ -33555,12 +33690,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, "pretty-format": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", @@ -34033,6 +34162,12 @@ } } }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "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", @@ -40425,90 +40560,16 @@ "extsprintf": "^1.2.0" } }, - "vsce": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/vsce/-/vsce-2.11.0.tgz", - "integrity": "sha512-pr9Y0va/HCer0tTifeqaUrK24JJSpRd6oLeF/PY6FtrY41e+lwxiAq6jfMXx4ShAZglYg2rFKoKROwa7E7SEqQ==", + "vscode-html-languageservice": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/vscode-html-languageservice/-/vscode-html-languageservice-5.0.4.tgz", + "integrity": "sha512-tvrySfpglu4B2rQgWGVO/IL+skvU7kBkQotRlxA7ocSyRXOZUd6GA13XHkxo8LPe07KWjeoBlN1aVGqdfTK4xA==", "dev": true, "requires": { - "azure-devops-node-api": "^11.0.1", - "chalk": "^2.4.2", - "cheerio": "^1.0.0-rc.9", - "commander": "^6.1.0", - "glob": "^7.0.6", - "hosted-git-info": "^4.0.2", - "keytar": "^7.7.0", - "leven": "^3.1.0", - "markdown-it": "^12.3.2", - "mime": "^1.3.4", - "minimatch": "^3.0.3", - "parse-semver": "^1.1.1", - "read": "^1.0.7", - "semver": "^5.1.0", - "tmp": "^0.2.1", - "typed-rest-client": "^1.8.4", - "url-join": "^4.0.1", - "xml2js": "^0.4.23", - "yauzl": "^2.3.1", - "yazl": "^2.2.2" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "dev": true - }, - "hosted-git-info": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", - "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dev": true, - "requires": { - "rimraf": "^3.0.0" - } - } + "@vscode/l10n": "^0.0.11", + "vscode-languageserver-textdocument": "^1.0.8", + "vscode-languageserver-types": "^3.17.2", + "vscode-uri": "^3.0.7" } }, "vscode-jsonrpc": { @@ -40544,15 +40605,21 @@ } }, "vscode-languageserver-textdocument": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.7.tgz", - "integrity": "sha512-bFJH7UQxlXT8kKeyiyu41r22jCZXG8kuuVVA33OEJn1diWOZK5n8zBSPZFHVBOu8kXZ6h0LIRhf5UnCo61J4Hg==" + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz", + "integrity": "sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==" }, "vscode-languageserver-types": { "version": "3.17.2", "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.2.tgz", "integrity": "sha512-zHhCWatviizPIq9B7Vh9uvrH6x3sK8itC84HkamnBWoDFJtzBf7SWlpLCZUit72b3os45h6RWQNC9xHRDF8dRA==" }, + "vscode-uri": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.7.tgz", + "integrity": "sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==", + "dev": true + }, "w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", diff --git a/package.json b/package.json index 255654606..73243884e 100644 --- a/package.json +++ b/package.json @@ -990,6 +990,7 @@ "@types/enzyme": "^3.10.12", "@types/glob": "^7.2.0", "@types/jest": "^26.0.24", + "@types/micromatch": "^4.0.2", "@types/mocha": "^8.2.3", "@types/node": "^14.18.29", "@types/react": "^17.0.50", diff --git a/src/editors/playgroundController.ts b/src/editors/playgroundController.ts index d6e5e83f2..159824e63 100644 --- a/src/editors/playgroundController.ts +++ b/src/editors/playgroundController.ts @@ -1,6 +1,8 @@ import * as vscode from 'vscode'; +import path from 'path'; import { OutputChannel, ProgressLocation, TextEditor } from 'vscode'; import vm from 'vm'; +import * as os from 'os'; // eslint-disable-next-line @typescript-eslint/no-unused-vars import * as util from 'util'; @@ -37,6 +39,7 @@ import playgroundSearchTemplate from '../templates/playgroundSearchTemplate'; import playgroundTemplate from '../templates/playgroundTemplate'; import { StatusView } from '../views'; import TelemetryService from '../telemetry/telemetryService'; +import { readDirectory } from '../utils/filesystem'; const log = createLogger('playground controller'); const transpiler = require('bson-transpilers'); @@ -95,6 +98,7 @@ const countAggregationStagesInString = (str: string) => { * This controller manages playground. */ export default class PlaygroundController { + _context: vscode.ExtensionContext; _connectionController: ConnectionController; _activeTextEditor?: TextEditor; _playgroundResult?: PlaygroundResult; @@ -117,6 +121,7 @@ export default class PlaygroundController { private _codeToEvaluate = ''; constructor( + context: vscode.ExtensionContext, connectionController: ConnectionController, languageServerController: LanguageServerController, telemetryService: TelemetryService, @@ -127,6 +132,7 @@ export default class PlaygroundController { codeActionProvider: CodeActionProvider, explorerController: ExplorerController ) { + this._context = context; this._connectionController = connectionController; this._languageServerController = languageServerController; this._telemetryService = telemetryService; @@ -257,10 +263,18 @@ export default class PlaygroundController { content: string | undefined ): Promise { try { - // Create untitled file. const numberUntitledDocuments = vscode.workspace.textDocuments.filter((doc) => (doc.uri.scheme === 'untitled')).length; - const fileName = `Untitled-${numberUntitledDocuments + 1}`; - const newUri = vscode.Uri.file(fileName).with({ scheme: 'untitled', fragment: 'mongodb' }); // http://localhost/?#mongodb + const workspaceFolder = vscode.workspace.workspaceFolders?.[0]; + const filePath = workspaceFolder?.uri.fsPath || os.tmpdir(); + const playgrounds = await readDirectory(filePath); + const numberSavedPlaygrounds = playgrounds.length; + const fileName = path.join(filePath, `Untitled-${numberUntitledDocuments + numberSavedPlaygrounds + 1}.mongodb`); + + // Create untitled file: untitled:/extensionPath/Untitled-1#mongodb + const newUri = vscode.Uri.file(fileName).with({ + scheme: 'untitled', + fragment: 'mongodb' + }); // Before: vscode.workspace.openTextDocument({ language: 'mongodb', content }); const document = await vscode.workspace.openTextDocument(newUri); diff --git a/src/explorer/playgroundsTree.ts b/src/explorer/playgroundsTree.ts index 09e3fb18c..00c98cf72 100644 --- a/src/explorer/playgroundsTree.ts +++ b/src/explorer/playgroundsTree.ts @@ -1,57 +1,13 @@ import * as vscode from 'vscode'; -import * as fs from 'fs'; -import * as path from 'path'; import PlaygroundsTreeHeader from './playgroundsTreeHeader'; import { PLAYGROUND_ITEM } from './playgroundsTreeItem'; import { createLogger } from '../logging'; import PlaygroundsTreeItem from './playgroundsTreeItem'; import EXTENSION_COMMANDS from '../commands'; +import { readDirectory } from '../utils/filesystem'; -const micromatch = require('micromatch'); const log = createLogger('playgrounds tree controller'); -export class FileStat implements vscode.FileStat { - constructor(private fsStat: fs.Stats) {} - - get type(): vscode.FileType { - if (this.fsStat.isFile()) { - return vscode.FileType.File; - } - if (this.fsStat.isDirectory()) { - return vscode.FileType.Directory; - } - if (this.fsStat.isSymbolicLink()) { - return vscode.FileType.SymbolicLink; - } - - return vscode.FileType.Unknown; - } - - get isFile(): boolean | undefined { - return this.fsStat.isFile(); - } - - get isDirectory(): boolean | undefined { - return this.fsStat.isDirectory(); - } - - get isSymbolicLink(): boolean | undefined { - return this.fsStat.isSymbolicLink(); - } - - get size(): number { - return this.fsStat.size; - } - - get ctime(): number { - return this.fsStat.ctime.getTime(); - } - - get mtime(): number { - return this.fsStat.mtime.getTime(); - } -} - export default class PlaygroundsTree implements vscode.TreeDataProvider { @@ -144,54 +100,16 @@ export default class PlaygroundsTree return element; } - private async getFileNames(filePath: string): Promise { - return await fs.promises.readdir(filePath); - } - - private async stat(filePath: string): Promise { - return await fs.promises.stat(filePath); - } - - private async getStat(filePath: string): Promise { - return new FileStat(await this.stat(filePath)); - } - - public async readDirectory(uri: vscode.Uri): Promise { - const fileNames = await this.getFileNames(uri.fsPath); - - for (let i = 0; i < fileNames.length; i++) { - const fileName = fileNames[i]; - - try { - const stat = await this.getStat(path.join(uri.fsPath, fileName)); - const fileUri = vscode.Uri.file(path.join(uri.fsPath, fileName)); - const fileNameParts = fileName.split('.'); - - if ( - stat.type === vscode.FileType.File && - fileNameParts.length > 1 && - fileNameParts.pop() === 'mongodb' - ) { - this._playgroundsTreeItems[fileUri.fsPath] = new PlaygroundsTreeItem( - fileName, - fileUri.fsPath - ); - } else if ( - stat.type === vscode.FileType.Directory && - !micromatch.isMatch(fileName, this.excludeFromPlaygroundsSearch) - ) { - await this.readDirectory(fileUri); - } - } catch (error) { - /* */ - } - } - } - public async getPlaygrounds(folderUri: vscode.Uri): Promise { + const playgrounds = await readDirectory(folderUri.fsPath); this._playgroundsTreeItems = {}; - await this.readDirectory(folderUri); + playgrounds.forEach(element => { + this._playgroundsTreeItems[element.path] = new PlaygroundsTreeItem( + element.name, + element.path + ); + }); return this._playgroundsTreeItems; } diff --git a/src/mdbExtensionController.ts b/src/mdbExtensionController.ts index 418f50b2b..45cc5bec9 100644 --- a/src/mdbExtensionController.ts +++ b/src/mdbExtensionController.ts @@ -98,6 +98,7 @@ export default class MDBExtensionController implements vscode.Disposable { new ExportToLanguageCodeLensProvider(); this._codeActionProvider = new CodeActionProvider(); this._playgroundController = new PlaygroundController( + context, this._connectionController, this._languageServerController, this._telemetryService, diff --git a/src/test/suite/editors/codeActionProvider.test.ts b/src/test/suite/editors/codeActionProvider.test.ts index 43cbfbe8e..540a2c5d6 100644 --- a/src/test/suite/editors/codeActionProvider.test.ts +++ b/src/test/suite/editors/codeActionProvider.test.ts @@ -53,6 +53,7 @@ suite('Code Action Provider Test Suite', function () { mdbTestExtension.testExtensionController._playgroundController = new PlaygroundController( + testExtensionContext, mdbTestExtension.testExtensionController._connectionController, mdbTestExtension.testExtensionController._languageServerController, mdbTestExtension.testExtensionController._telemetryService, diff --git a/src/test/suite/editors/playgroundController.test.ts b/src/test/suite/editors/playgroundController.test.ts index 760b28e77..5e2690fa2 100644 --- a/src/test/suite/editors/playgroundController.test.ts +++ b/src/test/suite/editors/playgroundController.test.ts @@ -62,7 +62,10 @@ suite('Playground Controller Test Suite', function () { const testExplorerController = new ExplorerController( testConnectionController ); + const testExtensionContext = new TestExtensionContext(); + testExtensionContext.extensionPath = '../../'; const testPlaygroundController = new PlaygroundController( + testExtensionContext, testConnectionController, mockLanguageServerController as LanguageServerController, testTelemetryService, @@ -459,6 +462,7 @@ suite('Playground Controller Test Suite', function () { testConnectionController ); const playgroundControllerTest = new PlaygroundController( + testExtensionContext, testConnectionController, mockLanguageServerController as LanguageServerController, testTelemetryService, @@ -480,6 +484,7 @@ suite('Playground Controller Test Suite', function () { testConnectionController ); const playgroundControllerTest = new PlaygroundController( + testExtensionContext, testConnectionController, mockLanguageServerController as LanguageServerController, testTelemetryService, diff --git a/src/test/suite/language/languageServerController.test.ts b/src/test/suite/language/languageServerController.test.ts index facfb09b4..9ee9a5cd1 100644 --- a/src/test/suite/language/languageServerController.test.ts +++ b/src/test/suite/language/languageServerController.test.ts @@ -59,7 +59,10 @@ suite('Language Server Controller Test Suite', () => { const testExportToLanguageCodeLensProvider = new ExportToLanguageCodeLensProvider(); const testCodeActionProvider = new CodeActionProvider(); + const testExtensionContext = new TestExtensionContext(); + testExtensionContext.extensionPath = '../../'; const testPlaygroundController = new PlaygroundController( + testExtensionContext, testConnectionController, testLanguageServerController, testTelemetryService, diff --git a/src/utils/filesystem.ts b/src/utils/filesystem.ts new file mode 100644 index 000000000..b43e62baf --- /dev/null +++ b/src/utils/filesystem.ts @@ -0,0 +1,90 @@ +import * as vscode from 'vscode'; +import micromatch from 'micromatch'; +import * as fs from 'fs'; +import * as path from 'path'; + +export class FileStat implements vscode.FileStat { + constructor(private fsStat: fs.Stats) {} + + get type(): vscode.FileType { + if (this.fsStat.isFile()) { + return vscode.FileType.File; + } + if (this.fsStat.isDirectory()) { + return vscode.FileType.Directory; + } + if (this.fsStat.isSymbolicLink()) { + return vscode.FileType.SymbolicLink; + } + + return vscode.FileType.Unknown; + } + + get isFile(): boolean | undefined { + return this.fsStat.isFile(); + } + + get isDirectory(): boolean | undefined { + return this.fsStat.isDirectory(); + } + + get isSymbolicLink(): boolean | undefined { + return this.fsStat.isSymbolicLink(); + } + + get size(): number { + return this.fsStat.size; + } + + get ctime(): number { + return this.fsStat.ctime.getTime(); + } + + get mtime(): number { + return this.fsStat.mtime.getTime(); + } +} + +const getFileNames = (filePath: string): Promise => { + return fs.promises.readdir(filePath); +} + +const getStat = async (filePath: string): Promise => { + return new FileStat(await stat(filePath)); +} + +const stat = (filePath: string): Promise => { + return fs.promises.stat(filePath); +} + +export const readDirectory = async (fsPath: string, excludeFromPlaygroundsSearch?: string[]): Promise<{ name: string, path: string }[]> => { + const fileNames = await getFileNames(fsPath); + const playgrounds: { name: string, path: string }[] = []; + + for (let i = 0; i < fileNames.length; i++) { + const fileName = fileNames[i]; + + try { + const stat = await getStat(path.join(fsPath, fileName)); + const fileUri = vscode.Uri.file(path.join(fsPath, fileName)); + const fileNameParts = fileName.split('.'); + + if ( + stat.type === vscode.FileType.File && + fileNameParts.length > 1 && + fileNameParts.pop() === 'mongodb' + ) { + playgrounds.push({ name: fileName, path: fileUri.fsPath }); + } else if ( + (stat.type === vscode.FileType.Directory && !excludeFromPlaygroundsSearch) || + (stat.type === vscode.FileType.Directory && excludeFromPlaygroundsSearch && !micromatch.isMatch(fileName, excludeFromPlaygroundsSearch)) + ) { + await readDirectory(fileUri.fsPath); + } + } catch (error) { + /* */ + } + } + + return playgrounds; +} From 4b3c70c18f4ff17ec1ec5c6b3d0a1d3d25a7a06a Mon Sep 17 00:00:00 2001 From: Alena Khineika Date: Thu, 2 Feb 2023 17:43:39 +0100 Subject: [PATCH 04/36] docs: add comment about read-only root --- src/editors/playgroundController.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/editors/playgroundController.ts b/src/editors/playgroundController.ts index 159824e63..a441764f8 100644 --- a/src/editors/playgroundController.ts +++ b/src/editors/playgroundController.ts @@ -265,6 +265,9 @@ export default class PlaygroundController { try { const numberUntitledDocuments = vscode.workspace.textDocuments.filter((doc) => (doc.uri.scheme === 'untitled')).length; const workspaceFolder = vscode.workspace.workspaceFolders?.[0]; + // The MacOS default folder for saving files would be the read-only root (/) directory, + // therefore we explicitly specify the workspace folder path + // or OS temp directory if a user has not opened workspaces. const filePath = workspaceFolder?.uri.fsPath || os.tmpdir(); const playgrounds = await readDirectory(filePath); const numberSavedPlaygrounds = playgrounds.length; From 78647685b2cee8a6b3078d3e1b9a8f2b0deb2ad0 Mon Sep 17 00:00:00 2001 From: Alena Khineika Date: Thu, 2 Feb 2023 18:09:33 +0100 Subject: [PATCH 05/36] refactor: clean up --- package.json | 1 - src/editors/playgroundController.ts | 6 ------ src/mdbExtensionController.ts | 1 - src/test/suite/editors/codeActionProvider.test.ts | 1 - src/test/suite/editors/playgroundController.test.ts | 5 ----- src/test/suite/language/languageServerController.test.ts | 3 --- 6 files changed, 17 deletions(-) diff --git a/package.json b/package.json index 73243884e..ba627e104 100644 --- a/package.json +++ b/package.json @@ -1051,7 +1051,6 @@ "ts-loader": "^9.4.1", "ts-node": "^10.9.1", "typescript": "^4.8.3", - "vscode-html-languageservice": "^5.0.3", "webpack": "^5.74.0", "webpack-cli": "^4.10.0", "xvfb-maybe": "^0.2.1", diff --git a/src/editors/playgroundController.ts b/src/editors/playgroundController.ts index a441764f8..cf1fc74b9 100644 --- a/src/editors/playgroundController.ts +++ b/src/editors/playgroundController.ts @@ -4,9 +4,6 @@ import { OutputChannel, ProgressLocation, TextEditor } from 'vscode'; import vm from 'vm'; import * as os from 'os'; -// eslint-disable-next-line @typescript-eslint/no-unused-vars -import * as util from 'util'; - import ActiveConnectionCodeLensProvider from './activeConnectionCodeLensProvider'; import CodeActionProvider from './codeActionProvider'; import ConnectionController, { @@ -98,7 +95,6 @@ const countAggregationStagesInString = (str: string) => { * This controller manages playground. */ export default class PlaygroundController { - _context: vscode.ExtensionContext; _connectionController: ConnectionController; _activeTextEditor?: TextEditor; _playgroundResult?: PlaygroundResult; @@ -121,7 +117,6 @@ export default class PlaygroundController { private _codeToEvaluate = ''; constructor( - context: vscode.ExtensionContext, connectionController: ConnectionController, languageServerController: LanguageServerController, telemetryService: TelemetryService, @@ -132,7 +127,6 @@ export default class PlaygroundController { codeActionProvider: CodeActionProvider, explorerController: ExplorerController ) { - this._context = context; this._connectionController = connectionController; this._languageServerController = languageServerController; this._telemetryService = telemetryService; diff --git a/src/mdbExtensionController.ts b/src/mdbExtensionController.ts index 45cc5bec9..418f50b2b 100644 --- a/src/mdbExtensionController.ts +++ b/src/mdbExtensionController.ts @@ -98,7 +98,6 @@ export default class MDBExtensionController implements vscode.Disposable { new ExportToLanguageCodeLensProvider(); this._codeActionProvider = new CodeActionProvider(); this._playgroundController = new PlaygroundController( - context, this._connectionController, this._languageServerController, this._telemetryService, diff --git a/src/test/suite/editors/codeActionProvider.test.ts b/src/test/suite/editors/codeActionProvider.test.ts index 540a2c5d6..43cbfbe8e 100644 --- a/src/test/suite/editors/codeActionProvider.test.ts +++ b/src/test/suite/editors/codeActionProvider.test.ts @@ -53,7 +53,6 @@ suite('Code Action Provider Test Suite', function () { mdbTestExtension.testExtensionController._playgroundController = new PlaygroundController( - testExtensionContext, mdbTestExtension.testExtensionController._connectionController, mdbTestExtension.testExtensionController._languageServerController, mdbTestExtension.testExtensionController._telemetryService, diff --git a/src/test/suite/editors/playgroundController.test.ts b/src/test/suite/editors/playgroundController.test.ts index 5e2690fa2..760b28e77 100644 --- a/src/test/suite/editors/playgroundController.test.ts +++ b/src/test/suite/editors/playgroundController.test.ts @@ -62,10 +62,7 @@ suite('Playground Controller Test Suite', function () { const testExplorerController = new ExplorerController( testConnectionController ); - const testExtensionContext = new TestExtensionContext(); - testExtensionContext.extensionPath = '../../'; const testPlaygroundController = new PlaygroundController( - testExtensionContext, testConnectionController, mockLanguageServerController as LanguageServerController, testTelemetryService, @@ -462,7 +459,6 @@ suite('Playground Controller Test Suite', function () { testConnectionController ); const playgroundControllerTest = new PlaygroundController( - testExtensionContext, testConnectionController, mockLanguageServerController as LanguageServerController, testTelemetryService, @@ -484,7 +480,6 @@ suite('Playground Controller Test Suite', function () { testConnectionController ); const playgroundControllerTest = new PlaygroundController( - testExtensionContext, testConnectionController, mockLanguageServerController as LanguageServerController, testTelemetryService, diff --git a/src/test/suite/language/languageServerController.test.ts b/src/test/suite/language/languageServerController.test.ts index 9ee9a5cd1..facfb09b4 100644 --- a/src/test/suite/language/languageServerController.test.ts +++ b/src/test/suite/language/languageServerController.test.ts @@ -59,10 +59,7 @@ suite('Language Server Controller Test Suite', () => { const testExportToLanguageCodeLensProvider = new ExportToLanguageCodeLensProvider(); const testCodeActionProvider = new CodeActionProvider(); - const testExtensionContext = new TestExtensionContext(); - testExtensionContext.extensionPath = '../../'; const testPlaygroundController = new PlaygroundController( - testExtensionContext, testConnectionController, testLanguageServerController, testTelemetryService, From be082150b3a80f79a3f4800a0c9f234591e97923 Mon Sep 17 00:00:00 2001 From: Alena Khineika Date: Fri, 3 Feb 2023 12:27:31 +0100 Subject: [PATCH 06/36] refactor: better handling new files --- .../activeConnectionCodeLensProvider.ts | 5 +- src/editors/codeActionProvider.ts | 3 +- src/editors/playgroundController.ts | 55 +++++++++---------- src/explorer/playgroundsTree.ts | 2 +- src/utils/{filesystem.ts => playground.ts} | 32 +++++++++-- 5 files changed, 59 insertions(+), 38 deletions(-) rename src/utils/{filesystem.ts => playground.ts} (75%) diff --git a/src/editors/activeConnectionCodeLensProvider.ts b/src/editors/activeConnectionCodeLensProvider.ts index 4e61ddc5b..f3bf327e6 100644 --- a/src/editors/activeConnectionCodeLensProvider.ts +++ b/src/editors/activeConnectionCodeLensProvider.ts @@ -2,6 +2,7 @@ import * as vscode from 'vscode'; import { TextEditor } from 'vscode'; import EXTENSION_COMMANDS from '../commands'; import ConnectionController from '../connectionController'; +import { isPlayground } from '../utils/playground'; export default class ActiveConnectionCodeLensProvider implements vscode.CodeLensProvider @@ -16,6 +17,7 @@ export default class ActiveConnectionCodeLensProvider constructor(connectionController: ConnectionController) { this._connectionController = connectionController; + this._activeTextEditor = vscode.window.activeTextEditor; vscode.workspace.onDidChangeConfiguration(() => { this._onDidChangeCodeLenses.fire(); @@ -34,7 +36,8 @@ export default class ActiveConnectionCodeLensProvider provideCodeLenses(): vscode.CodeLens[] { const editorUri = this._activeTextEditor?.document.uri; - if (editorUri?.fragment !== 'mongodb' && editorUri?.path.split('.').pop() !== 'mongodb') { + + if (!isPlayground(editorUri)) { return []; } diff --git a/src/editors/codeActionProvider.ts b/src/editors/codeActionProvider.ts index 017e0f439..d3f9881c6 100644 --- a/src/editors/codeActionProvider.ts +++ b/src/editors/codeActionProvider.ts @@ -3,6 +3,7 @@ import { TextEditor } from 'vscode'; import EXTENSION_COMMANDS from '../commands'; import { ExportToLanguageMode } from '../types/playgroundType'; +import { isPlayground } from '../utils/playground'; export default class CodeActionProvider implements vscode.CodeActionProvider { _onDidChangeCodeCodeAction: vscode.EventEmitter = @@ -42,7 +43,7 @@ export default class CodeActionProvider implements vscode.CodeActionProvider { provideCodeActions(): vscode.CodeAction[] | undefined { const editorUri = this._activeTextEditor?.document.uri; - if (!this.selection || (editorUri?.fragment !== 'mongodb' && editorUri?.path.split('.').pop() !== 'mongodb')) { + if (!this.selection || !isPlayground(editorUri)) { return; } diff --git a/src/editors/playgroundController.ts b/src/editors/playgroundController.ts index cf1fc74b9..1ecbd3727 100644 --- a/src/editors/playgroundController.ts +++ b/src/editors/playgroundController.ts @@ -36,7 +36,7 @@ import playgroundSearchTemplate from '../templates/playgroundSearchTemplate'; import playgroundTemplate from '../templates/playgroundTemplate'; import { StatusView } from '../views'; import TelemetryService from '../telemetry/telemetryService'; -import { readDirectory } from '../utils/filesystem'; +import { isPlayground } from '../utils/playground'; const log = createLogger('playground controller'); const transpiler = require('bson-transpilers'); @@ -128,6 +128,7 @@ export default class PlaygroundController { explorerController: ExplorerController ) { this._connectionController = connectionController; + this._activeTextEditor = vscode.window.activeTextEditor; this._languageServerController = languageServerController; this._telemetryService = telemetryService; this._statusView = statusView; @@ -154,7 +155,7 @@ export default class PlaygroundController { this._playgroundResultTextDocument = editor?.document; } - if (editor?.document.uri.fragment === 'mongodb' || editor?.document.uri.path.split('.').pop() === 'mongodb') { + if (isPlayground(editor?.document.uri)) { void vscode.commands.executeCommand('setContext', 'mdb.showRunPlaygroundButton', true); } else { void vscode.commands.executeCommand('setContext', 'mdb.showRunPlaygroundButton', false); @@ -167,7 +168,7 @@ export default class PlaygroundController { }; vscode.workspace.textDocuments.forEach((document) => { - if (document.uri.path.split('.').pop() === 'mongodb') { + if (isPlayground(document.uri)) { void vscode.languages.setTextDocumentLanguage( document, 'javascript' @@ -179,7 +180,7 @@ export default class PlaygroundController { onDidChangeActiveTextEditor(vscode.window.activeTextEditor); vscode.workspace.onDidOpenTextDocument(async (document) => { - if (document.uri.path.split('.').pop() === 'mongodb') { + if (isPlayground(document.uri)) { await vscode.languages.setTextDocumentLanguage( document, 'javascript' @@ -189,7 +190,7 @@ export default class PlaygroundController { vscode.window.onDidChangeTextEditorSelection( async (changeEvent: vscode.TextEditorSelectionChangeEvent) => { - if (changeEvent?.textEditor?.document?.uri.fragment !== 'mongodb') { + if (isPlayground(changeEvent?.textEditor?.document?.uri)) { return; } @@ -257,36 +258,38 @@ export default class PlaygroundController { content: string | undefined ): Promise { try { - const numberUntitledDocuments = vscode.workspace.textDocuments.filter((doc) => (doc.uri.scheme === 'untitled')).length; - const workspaceFolder = vscode.workspace.workspaceFolders?.[0]; // The MacOS default folder for saving files would be the read-only root (/) directory, // therefore we explicitly specify the workspace folder path // or OS temp directory if a user has not opened workspaces. + const workspaceFolder = vscode.workspace.workspaceFolders?.[0]; const filePath = workspaceFolder?.uri.fsPath || os.tmpdir(); - const playgrounds = await readDirectory(filePath); - const numberSavedPlaygrounds = playgrounds.length; - const fileName = path.join(filePath, `Untitled-${numberUntitledDocuments + numberSavedPlaygrounds + 1}.mongodb`); - // Create untitled file: untitled:/extensionPath/Untitled-1#mongodb - const newUri = vscode.Uri.file(fileName).with({ + const numberUntitledPlaygrounds = vscode.workspace.textDocuments.filter((doc) => isPlayground(doc.uri)).length; + const fileName = path.join(filePath, `playground-${numberUntitledPlaygrounds + 1}.mongodb`); + + // Create untitled file: untitled:/extensionPath/playground-1.mongodb.js#mongodb + // Before: vscode.workspace.openTextDocument({ language: 'mongodb', content }); + const documentUri = vscode.Uri.from({ + path: fileName, scheme: 'untitled', fragment: 'mongodb' }); - // Before: vscode.workspace.openTextDocument({ language: 'mongodb', content }); - const document = await vscode.workspace.openTextDocument(newUri); - await vscode.languages.setTextDocumentLanguage( - document, - 'javascript' - ); - // Fill in initial content. const edit = new vscode.WorkspaceEdit(); - edit.insert(newUri, new vscode.Position(0, 0), `${content}`); + edit.insert(documentUri, new vscode.Position(0, 0), `${content}`); await vscode.workspace.applyEdit(edit); // Actually show the editor. - await vscode.commands.executeCommand('vscode.open', newUri); + // await vscode.commands.executeCommand('vscode.open', documentUri); + const document = await vscode.workspace.openTextDocument(documentUri); + + // Ensure that the playground language is JavaScript. + await vscode.languages.setTextDocumentLanguage( + document, + 'javascript' + ); + await vscode.window.showTextDocument(document); return true; } catch (error) { @@ -572,10 +575,7 @@ export default class PlaygroundController { } runAllPlaygroundBlocks(): Promise { - if ( - !this._activeTextEditor || - this._activeTextEditor.document.uri.fragment !== 'mongodb' - ) { + if (!this._activeTextEditor || !isPlayground(this._activeTextEditor.document.uri)) { void vscode.window.showErrorMessage( "Please open a '.mongodb' playground file before running it." ); @@ -590,10 +590,7 @@ export default class PlaygroundController { } runAllOrSelectedPlaygroundBlocks(): Promise { - if ( - !this._activeTextEditor || - this._activeTextEditor.document.uri.fragment !== 'mongodb' - ) { + if (!this._activeTextEditor || !isPlayground(this._activeTextEditor.document.uri)) { void vscode.window.showErrorMessage( "Please open a '.mongodb' playground file before running it." ); diff --git a/src/explorer/playgroundsTree.ts b/src/explorer/playgroundsTree.ts index 00c98cf72..d5f2f5cc9 100644 --- a/src/explorer/playgroundsTree.ts +++ b/src/explorer/playgroundsTree.ts @@ -4,7 +4,7 @@ import { PLAYGROUND_ITEM } from './playgroundsTreeItem'; import { createLogger } from '../logging'; import PlaygroundsTreeItem from './playgroundsTreeItem'; import EXTENSION_COMMANDS from '../commands'; -import { readDirectory } from '../utils/filesystem'; +import { readDirectory } from '../utils/playground'; const log = createLogger('playgrounds tree controller'); diff --git a/src/utils/filesystem.ts b/src/utils/playground.ts similarity index 75% rename from src/utils/filesystem.ts rename to src/utils/playground.ts index b43e62baf..5a4e3018d 100644 --- a/src/utils/filesystem.ts +++ b/src/utils/playground.ts @@ -57,6 +57,31 @@ const stat = (filePath: string): Promise => { return fs.promises.stat(filePath); } +export const isPlayground = (fileUri?: vscode.Uri) => { + if (!fileUri) { + return false; + } + + if (fileUri.scheme === 'untitled' && fileUri.fragment === 'mongodb') { + return true; + } + + const fileNameParts = fileUri.fsPath.split('.'); + + if (fileNameParts.length < 2) { + return false; + } + + if (fileNameParts.length === 2) { + return fileNameParts[fileNameParts.length - 1] === 'mongodb'; + } + + const extension = fileNameParts[fileNameParts.length - 1]; + const secondaryExtension = fileNameParts[fileNameParts.length - 2]; + + return fileNameParts.length > 1 && (extension === 'mongodb' || (extension === 'js' && secondaryExtension === 'mongodb')); +} + export const readDirectory = async (fsPath: string, excludeFromPlaygroundsSearch?: string[]): Promise<{ name: string, path: string }[]> => { const fileNames = await getFileNames(fsPath); const playgrounds: { name: string, path: string }[] = []; @@ -67,13 +92,8 @@ export const readDirectory = async (fsPath: string, excludeFromPlaygroundsSearch try { const stat = await getStat(path.join(fsPath, fileName)); const fileUri = vscode.Uri.file(path.join(fsPath, fileName)); - const fileNameParts = fileName.split('.'); - if ( - stat.type === vscode.FileType.File && - fileNameParts.length > 1 && - fileNameParts.pop() === 'mongodb' - ) { + if (stat.type === vscode.FileType.File && isPlayground(fileUri)) { playgrounds.push({ name: fileName, path: fileUri.fsPath }); } else if ( (stat.type === vscode.FileType.Directory && !excludeFromPlaygroundsSearch) || From 5b3cc4f34724d52c6bff2f940b722a5852318db0 Mon Sep 17 00:00:00 2001 From: Alena Khineika Date: Fri, 3 Feb 2023 12:32:18 +0100 Subject: [PATCH 07/36] refactor: drop fragment --- src/editors/playgroundController.ts | 9 +++------ src/utils/playground.ts | 6 ++---- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/src/editors/playgroundController.ts b/src/editors/playgroundController.ts index 1ecbd3727..90b6e7f80 100644 --- a/src/editors/playgroundController.ts +++ b/src/editors/playgroundController.ts @@ -267,13 +267,9 @@ export default class PlaygroundController { const numberUntitledPlaygrounds = vscode.workspace.textDocuments.filter((doc) => isPlayground(doc.uri)).length; const fileName = path.join(filePath, `playground-${numberUntitledPlaygrounds + 1}.mongodb`); - // Create untitled file: untitled:/extensionPath/playground-1.mongodb.js#mongodb + // Create untitled file: untitled:/extensionPath/playground-1.mongodb.js // Before: vscode.workspace.openTextDocument({ language: 'mongodb', content }); - const documentUri = vscode.Uri.from({ - path: fileName, - scheme: 'untitled', - fragment: 'mongodb' - }); + const documentUri = vscode.Uri.from({ path: fileName, scheme: 'untitled' }); // Fill in initial content. const edit = new vscode.WorkspaceEdit(); @@ -289,6 +285,7 @@ export default class PlaygroundController { document, 'javascript' ); + // Focus new text document. await vscode.window.showTextDocument(document); return true; diff --git a/src/utils/playground.ts b/src/utils/playground.ts index 5a4e3018d..f0e3ee38a 100644 --- a/src/utils/playground.ts +++ b/src/utils/playground.ts @@ -62,20 +62,18 @@ export const isPlayground = (fileUri?: vscode.Uri) => { return false; } - if (fileUri.scheme === 'untitled' && fileUri.fragment === 'mongodb') { - return true; - } - const fileNameParts = fileUri.fsPath.split('.'); if (fileNameParts.length < 2) { return false; } + // Allow users to save playgrounds with `.mongodb` extension. if (fileNameParts.length === 2) { return fileNameParts[fileNameParts.length - 1] === 'mongodb'; } + // The default playgrounds extension is `.mongodb.js`. const extension = fileNameParts[fileNameParts.length - 1]; const secondaryExtension = fileNameParts[fileNameParts.length - 2]; From ed9554cfad4ee28de621412a674f7ca59df48fd8 Mon Sep 17 00:00:00 2001 From: Alena Khineika Date: Thu, 16 Feb 2023 18:45:16 +0100 Subject: [PATCH 08/36] feat: add mongodb grammar injection --- package-lock.json | 49 ----------------------- package.json | 7 ++++ src/editors/playgroundController.ts | 12 ++---- src/language/server.ts | 2 +- syntaxes/mongodbInjection.tmLanguage.json | 24 +++++++++++ 5 files changed, 35 insertions(+), 59 deletions(-) create mode 100644 syntaxes/mongodbInjection.tmLanguage.json diff --git a/package-lock.json b/package-lock.json index 8d1687c0e..4bbf74698 100644 --- a/package-lock.json +++ b/package-lock.json @@ -122,7 +122,6 @@ "ts-loader": "^9.4.1", "ts-node": "^10.9.1", "typescript": "^4.8.3", - "vscode-html-languageservice": "^5.0.3", "webpack": "^5.74.0", "webpack-cli": "^4.10.0", "xvfb-maybe": "^0.2.1", @@ -3142,12 +3141,6 @@ "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", "dev": true }, - "node_modules/@vscode/l10n": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/@vscode/l10n/-/l10n-0.0.11.tgz", - "integrity": "sha512-ukOMWnCg1tCvT7WnDfsUKQOFDQGsyR5tNgRpwmqi+5/vzU3ghdDXzvIM4IOPdSb3OeSsBNvmSL8nxIVOqi2WXA==", - "dev": true - }, "node_modules/@vscode/test-electron": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.1.5.tgz", @@ -21965,18 +21958,6 @@ "extsprintf": "^1.2.0" } }, - "node_modules/vscode-html-languageservice": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/vscode-html-languageservice/-/vscode-html-languageservice-5.0.4.tgz", - "integrity": "sha512-tvrySfpglu4B2rQgWGVO/IL+skvU7kBkQotRlxA7ocSyRXOZUd6GA13XHkxo8LPe07KWjeoBlN1aVGqdfTK4xA==", - "dev": true, - "dependencies": { - "@vscode/l10n": "^0.0.11", - "vscode-languageserver-textdocument": "^1.0.8", - "vscode-languageserver-types": "^3.17.2", - "vscode-uri": "^3.0.7" - } - }, "node_modules/vscode-jsonrpc": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.0.2.tgz", @@ -22028,12 +22009,6 @@ "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.2.tgz", "integrity": "sha512-zHhCWatviizPIq9B7Vh9uvrH6x3sK8itC84HkamnBWoDFJtzBf7SWlpLCZUit72b3os45h6RWQNC9xHRDF8dRA==" }, - "node_modules/vscode-uri": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.7.tgz", - "integrity": "sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==", - "dev": true - }, "node_modules/w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", @@ -25280,12 +25255,6 @@ "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", "dev": true }, - "@vscode/l10n": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/@vscode/l10n/-/l10n-0.0.11.tgz", - "integrity": "sha512-ukOMWnCg1tCvT7WnDfsUKQOFDQGsyR5tNgRpwmqi+5/vzU3ghdDXzvIM4IOPdSb3OeSsBNvmSL8nxIVOqi2WXA==", - "dev": true - }, "@vscode/test-electron": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.1.5.tgz", @@ -40560,18 +40529,6 @@ "extsprintf": "^1.2.0" } }, - "vscode-html-languageservice": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/vscode-html-languageservice/-/vscode-html-languageservice-5.0.4.tgz", - "integrity": "sha512-tvrySfpglu4B2rQgWGVO/IL+skvU7kBkQotRlxA7ocSyRXOZUd6GA13XHkxo8LPe07KWjeoBlN1aVGqdfTK4xA==", - "dev": true, - "requires": { - "@vscode/l10n": "^0.0.11", - "vscode-languageserver-textdocument": "^1.0.8", - "vscode-languageserver-types": "^3.17.2", - "vscode-uri": "^3.0.7" - } - }, "vscode-jsonrpc": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.0.2.tgz", @@ -40614,12 +40571,6 @@ "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.2.tgz", "integrity": "sha512-zHhCWatviizPIq9B7Vh9uvrH6x3sK8itC84HkamnBWoDFJtzBf7SWlpLCZUit72b3os45h6RWQNC9xHRDF8dRA==" }, - "vscode-uri": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.7.tgz", - "integrity": "sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==", - "dev": true - }, "w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", diff --git a/package.json b/package.json index ba627e104..6bb5b7edb 100644 --- a/package.json +++ b/package.json @@ -122,6 +122,13 @@ ] } ], + "grammars": [ + { + "path": "./syntaxes/mongodbInjection.tmLanguage.json", + "scopeName": "mongodb.injection", + "injectTo": ["source.js"] + } + ], "snippets": [ { "language": "terraform", diff --git a/src/editors/playgroundController.ts b/src/editors/playgroundController.ts index 90b6e7f80..4ba873596 100644 --- a/src/editors/playgroundController.ts +++ b/src/editors/playgroundController.ts @@ -258,17 +258,16 @@ export default class PlaygroundController { content: string | undefined ): Promise { try { - // The MacOS default folder for saving files would be the read-only root (/) directory, + // The MacOS default folder for saving files is a read-only root (/) directory, // therefore we explicitly specify the workspace folder path // or OS temp directory if a user has not opened workspaces. const workspaceFolder = vscode.workspace.workspaceFolders?.[0]; const filePath = workspaceFolder?.uri.fsPath || os.tmpdir(); const numberUntitledPlaygrounds = vscode.workspace.textDocuments.filter((doc) => isPlayground(doc.uri)).length; - const fileName = path.join(filePath, `playground-${numberUntitledPlaygrounds + 1}.mongodb`); + const fileName = path.join(filePath, `playground-${numberUntitledPlaygrounds + 1}.mongodb.js`); - // Create untitled file: untitled:/extensionPath/playground-1.mongodb.js - // Before: vscode.workspace.openTextDocument({ language: 'mongodb', content }); + // Create an untitled file URI: untitled:/extensionPath/playground-1.mongodb.js const documentUri = vscode.Uri.from({ path: fileName, scheme: 'untitled' }); // Fill in initial content. @@ -280,11 +279,6 @@ export default class PlaygroundController { // await vscode.commands.executeCommand('vscode.open', documentUri); const document = await vscode.workspace.openTextDocument(documentUri); - // Ensure that the playground language is JavaScript. - await vscode.languages.setTextDocumentLanguage( - document, - 'javascript' - ); // Focus new text document. await vscode.window.showTextDocument(document); diff --git a/src/language/server.ts b/src/language/server.ts index 9e27007ed..70e5c5621 100644 --- a/src/language/server.ts +++ b/src/language/server.ts @@ -57,7 +57,7 @@ connection.onInitialize((params: InitializeParams) => { // Tell the client that the server supports code completion completionProvider: { resolveProvider: true, - triggerCharacters: ['.'], + triggerCharacters: ['.', '$'], }, // documentFormattingProvider: true, // documentRangeFormattingProvider: true, diff --git a/syntaxes/mongodbInjection.tmLanguage.json b/syntaxes/mongodbInjection.tmLanguage.json new file mode 100644 index 000000000..79b3c1957 --- /dev/null +++ b/syntaxes/mongodbInjection.tmLanguage.json @@ -0,0 +1,24 @@ +{ + "scopeName": "mongodb.injection", + "injectionSelector": "L:meta.objectliteral.js", + "patterns": [ + { + "include": "#object-member" + } + ], + "repository": { + "object-member": { + "patterns": [ + { + "name": "meta.object.member.mongodb", + "match": "\\$match\\b", + "captures": { + "0": { + "name": "keyword.other.match.mongodb" + } + } + } + ] + } + } +} From bc1b98234971bb1c2a39e1eda26dc98b3d05d82f Mon Sep 17 00:00:00 2001 From: Alena Khineika Date: Mon, 20 Feb 2023 13:41:31 +0100 Subject: [PATCH 09/36] refactor: restore update-grammar script --- .prettierignore | 1 + CONTRIBUTING.md | 11 ++++++----- package.json | 4 ++-- scripts/update-grammar.ts | 1 + src/editors/playgroundController.ts | 3 ++- src/language/mongoDBService.ts | 2 +- 6 files changed, 13 insertions(+), 9 deletions(-) create mode 100644 scripts/update-grammar.ts diff --git a/.prettierignore b/.prettierignore index d969a3158..6de1b6b4d 100644 --- a/.prettierignore +++ b/.prettierignore @@ -9,6 +9,7 @@ out playgrounds resources snippets +syntaxes CHANGELOG.md README.md constants.json diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0ac81eff8..3bc2c2c0f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -37,12 +37,13 @@ npm run watch #### Code Tour -- `out` compiled extension code -- `images` Icons, logos, etc. -- `snippets` [Bundled MongoDB Snippets][snippet guide] +- `out` - Compiled extension code +- `images` - Icons, logos, etc. +- `snippets` - Bundled MongoDB Snippets +- `syntaxes` [Syntax highlighting](https://code.visualstudio.com/api/language-extensions/syntax-highlight-guide#injection-grammars) for MongoDB keywords - `src` - - `test/suite` where tests live with files names `*.test.ts` -- `scripts` project helper scripts + - `test/suite` - Where tests live with '`*.test.ts`' files names +- `scripts` - Project helper scripts ## Releases diff --git a/package.json b/package.json index 6bb5b7edb..90c36bc70 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "precompile": "npm run clean", "compile": "npm-run-all compile:*", "compile:keyfile": "ts-node ./scripts/generate-keyfile.ts", - "compile:resources": "npm run update-snippets", + "compile:resources": "npm run update-grammar && npm run update-snippets", "compile:extension": "tsc -p ./", "compile:extension-bundles": "webpack --mode development", "watch": "npm run compile && npm-run-all -p watch:*", @@ -68,7 +68,7 @@ "activationEvents": [ "onView:mongoDB", "onLanguage:json", - "onLanguage:javasript", + "onLanguage:javascript", "onLanguage:plaintext" ], "contributes": { diff --git a/scripts/update-grammar.ts b/scripts/update-grammar.ts new file mode 100644 index 000000000..16632cea1 --- /dev/null +++ b/scripts/update-grammar.ts @@ -0,0 +1 @@ +// TODO: Update ./syntaxes/mongodbInjection.tmLanguage.json with the latest with the most recent `mongodb-constants`. diff --git a/src/editors/playgroundController.ts b/src/editors/playgroundController.ts index 4ba873596..a5fa5d873 100644 --- a/src/editors/playgroundController.ts +++ b/src/editors/playgroundController.ts @@ -267,7 +267,8 @@ export default class PlaygroundController { const numberUntitledPlaygrounds = vscode.workspace.textDocuments.filter((doc) => isPlayground(doc.uri)).length; const fileName = path.join(filePath, `playground-${numberUntitledPlaygrounds + 1}.mongodb.js`); - // Create an untitled file URI: untitled:/extensionPath/playground-1.mongodb.js + // Does not create a physical file, it only creates a URI from specified component parts. + // An untitled file URI: untitled:/extensionPath/playground-1.mongodb.js const documentUri = vscode.Uri.from({ path: fileName, scheme: 'untitled' }); // Fill in initial content. diff --git a/src/language/mongoDBService.ts b/src/language/mongoDBService.ts index 012e4560d..12ec27111 100644 --- a/src/language/mongoDBService.ts +++ b/src/language/mongoDBService.ts @@ -425,7 +425,7 @@ export default class MongoDBService { return { label: item, - kind: CompletionItemKind.Method, + kind: CompletionItemKind.Keyword, documentation: markdownDocumentation, detail, }; From 3a3c5204aa62c974d52e2a8f8d2c7b1d489f275c Mon Sep 17 00:00:00 2001 From: Alena Khineika Date: Mon, 20 Feb 2023 13:45:32 +0100 Subject: [PATCH 10/36] docs: update contributing page --- CONTRIBUTING.md | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index da1d3b386..594e55cda 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -37,13 +37,12 @@ npm run watch #### Code Tour -- `out` - Compiled extension code -- `images` - Icons, logos, etc. -- `snippets` - Bundled MongoDB Snippets +- `out` Compiled extension code +- `images` Icons, logos, etc. +- `snippets` Bundled MongoDB Snippets - `syntaxes` [Syntax highlighting](https://code.visualstudio.com/api/language-extensions/syntax-highlight-guide#injection-grammars) for MongoDB keywords -- `src` - - `test/suite` - Where tests live with '`*.test.ts`' files names -- `scripts` - Project helper scripts +- `src/test/suite` Where tests live with '`*.test.ts`' files names +- `scripts` Project helper scripts ## Releases From 4fda3fa6db01b65352d0a1c60804bd6a5216f417 Mon Sep 17 00:00:00 2001 From: Alena Khineika Date: Mon, 20 Feb 2023 13:46:24 +0100 Subject: [PATCH 11/36] refactor: update-grammar --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index b71686feb..0115ee1b3 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "scripts": { "clean": "rimraf ./out/* ./dist/* ", "lint": "eslint . && prettier --check .", + "update-grammar": "ts-node ./scripts/update-grammar.ts", "update-snippets": "ts-node ./scripts/update-snippets.ts", "precompile": "npm run clean", "compile": "npm-run-all compile:*", From 2296df84a6c08bb4f3fe74f9e2da756c5386b3df Mon Sep 17 00:00:00 2001 From: Alena Khineika Date: Mon, 20 Feb 2023 14:30:50 +0100 Subject: [PATCH 12/36] feat: update mongodb injection grammar --- scripts/update-grammar.ts | 58 +- src/editors/playgroundController.ts | 1 - syntaxes/mongodbInjection.tmLanguage.json | 2002 ++++++++++++++++++++- 3 files changed, 2057 insertions(+), 4 deletions(-) diff --git a/scripts/update-grammar.ts b/scripts/update-grammar.ts index 16632cea1..3d4d996b6 100644 --- a/scripts/update-grammar.ts +++ b/scripts/update-grammar.ts @@ -1 +1,57 @@ -// TODO: Update ./syntaxes/mongodbInjection.tmLanguage.json with the latest with the most recent `mongodb-constants`. +#! /usr/bin/env ts-node + +import path from 'path'; +import mkdirp from 'mkdirp'; +import ora from 'ora'; +import fs from 'fs'; +import { promisify } from 'util'; + +import { + ACCUMULATORS, + CONVERSION_OPERATORS, + EXPRESSION_OPERATORS, + QUERY_OPERATORS, + STAGE_OPERATORS +} from '@mongodb-js/mongodb-constants'; + +const writeFile = promisify(fs.writeFile); +const SYNTAXES_DIR = path.join(__dirname, '..', 'syntaxes'); + +const mongodbeywords = [ + ...ACCUMULATORS, + ...CONVERSION_OPERATORS, + ...EXPRESSION_OPERATORS, + ...QUERY_OPERATORS, + ...STAGE_OPERATORS +]; + +const injectionGrammar = { + scopeName: 'mongodb.injection', + injectionSelector: 'L:meta.objectliteral.js', + patterns: [{ include: '#object-member' }], + repository: { + 'object-member': { + patterns: mongodbeywords.map((keyword) => ({ + name: 'meta.object.member.mongodb', + match: `\\${keyword.name}\\b`, + captures: { + 0: { + name: `keyword.other.${keyword.name}.mongodb` + } + } + })) + } + } +}; + +(async () => { + const ui = ora().start(); + ui.info('Creating the MongoDB injection grammar...'); + await mkdirp(SYNTAXES_DIR); + ui.succeed(`The '${SYNTAXES_DIR}' folder has been created`); + await writeFile( + `${SYNTAXES_DIR}/mongodbInjection.tmLanguage.json`, + JSON.stringify(injectionGrammar, null, 2) + ); + ui.succeed('MongoDB injection grammar has been saved'); +})(); diff --git a/src/editors/playgroundController.ts b/src/editors/playgroundController.ts index ab37c622d..15d86d962 100644 --- a/src/editors/playgroundController.ts +++ b/src/editors/playgroundController.ts @@ -278,7 +278,6 @@ export default class PlaygroundController { await vscode.workspace.applyEdit(edit); // Actually show the editor. - // await vscode.commands.executeCommand('vscode.open', documentUri); const document = await vscode.workspace.openTextDocument(documentUri); // Focus new text document. diff --git a/syntaxes/mongodbInjection.tmLanguage.json b/syntaxes/mongodbInjection.tmLanguage.json index 79b3c1957..a6fc81f2b 100644 --- a/syntaxes/mongodbInjection.tmLanguage.json +++ b/syntaxes/mongodbInjection.tmLanguage.json @@ -9,16 +9,2014 @@ "repository": { "object-member": { "patterns": [ + { + "name": "meta.object.member.mongodb", + "match": "\\$accumulator\\b", + "captures": { + "0": { + "name": "keyword.other.$accumulator.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$addToSet\\b", + "captures": { + "0": { + "name": "keyword.other.$addToSet.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$avg\\b", + "captures": { + "0": { + "name": "keyword.other.$avg.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$bottom\\b", + "captures": { + "0": { + "name": "keyword.other.$bottom.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$bottomN\\b", + "captures": { + "0": { + "name": "keyword.other.$bottomN.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$covariancePop\\b", + "captures": { + "0": { + "name": "keyword.other.$covariancePop.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$covarianceSamp\\b", + "captures": { + "0": { + "name": "keyword.other.$covarianceSamp.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$count\\b", + "captures": { + "0": { + "name": "keyword.other.$count.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$derivative\\b", + "captures": { + "0": { + "name": "keyword.other.$derivative.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$denseRank\\b", + "captures": { + "0": { + "name": "keyword.other.$denseRank.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$documentNumber\\b", + "captures": { + "0": { + "name": "keyword.other.$documentNumber.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$expMovingAvg\\b", + "captures": { + "0": { + "name": "keyword.other.$expMovingAvg.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$first\\b", + "captures": { + "0": { + "name": "keyword.other.$first.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$firstN\\b", + "captures": { + "0": { + "name": "keyword.other.$firstN.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$integral\\b", + "captures": { + "0": { + "name": "keyword.other.$integral.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$last\\b", + "captures": { + "0": { + "name": "keyword.other.$last.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$lastN\\b", + "captures": { + "0": { + "name": "keyword.other.$lastN.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$max\\b", + "captures": { + "0": { + "name": "keyword.other.$max.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$maxN\\b", + "captures": { + "0": { + "name": "keyword.other.$maxN.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$min\\b", + "captures": { + "0": { + "name": "keyword.other.$min.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$minN\\b", + "captures": { + "0": { + "name": "keyword.other.$minN.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$push\\b", + "captures": { + "0": { + "name": "keyword.other.$push.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$rank\\b", + "captures": { + "0": { + "name": "keyword.other.$rank.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$stdDevPop\\b", + "captures": { + "0": { + "name": "keyword.other.$stdDevPop.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$stdDevSamp\\b", + "captures": { + "0": { + "name": "keyword.other.$stdDevSamp.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$shift\\b", + "captures": { + "0": { + "name": "keyword.other.$shift.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$sum\\b", + "captures": { + "0": { + "name": "keyword.other.$sum.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$top\\b", + "captures": { + "0": { + "name": "keyword.other.$top.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$topN\\b", + "captures": { + "0": { + "name": "keyword.other.$topN.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$locf\\b", + "captures": { + "0": { + "name": "keyword.other.$locf.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$linearFill\\b", + "captures": { + "0": { + "name": "keyword.other.$linearFill.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$convert\\b", + "captures": { + "0": { + "name": "keyword.other.$convert.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$ltrim\\b", + "captures": { + "0": { + "name": "keyword.other.$ltrim.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$rtrim\\b", + "captures": { + "0": { + "name": "keyword.other.$rtrim.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$toBool\\b", + "captures": { + "0": { + "name": "keyword.other.$toBool.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$toDate\\b", + "captures": { + "0": { + "name": "keyword.other.$toDate.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$toDecimal\\b", + "captures": { + "0": { + "name": "keyword.other.$toDecimal.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$toDouble\\b", + "captures": { + "0": { + "name": "keyword.other.$toDouble.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$toInt\\b", + "captures": { + "0": { + "name": "keyword.other.$toInt.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$toLong\\b", + "captures": { + "0": { + "name": "keyword.other.$toLong.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$toObjectId\\b", + "captures": { + "0": { + "name": "keyword.other.$toObjectId.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$toString\\b", + "captures": { + "0": { + "name": "keyword.other.$toString.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$trim\\b", + "captures": { + "0": { + "name": "keyword.other.$trim.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$abs\\b", + "captures": { + "0": { + "name": "keyword.other.$abs.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$accumulator\\b", + "captures": { + "0": { + "name": "keyword.other.$accumulator.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$add\\b", + "captures": { + "0": { + "name": "keyword.other.$add.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$allElementsTrue\\b", + "captures": { + "0": { + "name": "keyword.other.$allElementsTrue.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$and\\b", + "captures": { + "0": { + "name": "keyword.other.$and.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$anyElementTrue\\b", + "captures": { + "0": { + "name": "keyword.other.$anyElementTrue.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$arrayElemAt\\b", + "captures": { + "0": { + "name": "keyword.other.$arrayElemAt.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$arrayToObject\\b", + "captures": { + "0": { + "name": "keyword.other.$arrayToObject.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$binarySize\\b", + "captures": { + "0": { + "name": "keyword.other.$binarySize.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$bsonSize\\b", + "captures": { + "0": { + "name": "keyword.other.$bsonSize.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$ceil\\b", + "captures": { + "0": { + "name": "keyword.other.$ceil.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$cmp\\b", + "captures": { + "0": { + "name": "keyword.other.$cmp.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$concat\\b", + "captures": { + "0": { + "name": "keyword.other.$concat.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$concatArrays\\b", + "captures": { + "0": { + "name": "keyword.other.$concatArrays.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$cond\\b", + "captures": { + "0": { + "name": "keyword.other.$cond.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$dateAdd\\b", + "captures": { + "0": { + "name": "keyword.other.$dateAdd.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$dateDiff\\b", + "captures": { + "0": { + "name": "keyword.other.$dateDiff.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$dateFromParts\\b", + "captures": { + "0": { + "name": "keyword.other.$dateFromParts.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$dateFromString\\b", + "captures": { + "0": { + "name": "keyword.other.$dateFromString.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$dateSubtract\\b", + "captures": { + "0": { + "name": "keyword.other.$dateSubtract.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$dateToParts\\b", + "captures": { + "0": { + "name": "keyword.other.$dateToParts.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$dateToString\\b", + "captures": { + "0": { + "name": "keyword.other.$dateToString.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$dateTrunc\\b", + "captures": { + "0": { + "name": "keyword.other.$dateTrunc.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$dayOfMonth\\b", + "captures": { + "0": { + "name": "keyword.other.$dayOfMonth.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$dayOfWeek\\b", + "captures": { + "0": { + "name": "keyword.other.$dayOfWeek.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$dayOfYear\\b", + "captures": { + "0": { + "name": "keyword.other.$dayOfYear.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$dateToString\\b", + "captures": { + "0": { + "name": "keyword.other.$dateToString.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$divide\\b", + "captures": { + "0": { + "name": "keyword.other.$divide.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$eq\\b", + "captures": { + "0": { + "name": "keyword.other.$eq.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$exp\\b", + "captures": { + "0": { + "name": "keyword.other.$exp.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$filter\\b", + "captures": { + "0": { + "name": "keyword.other.$filter.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$first\\b", + "captures": { + "0": { + "name": "keyword.other.$first.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$floor\\b", + "captures": { + "0": { + "name": "keyword.other.$floor.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$function\\b", + "captures": { + "0": { + "name": "keyword.other.$function.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$getField\\b", + "captures": { + "0": { + "name": "keyword.other.$getField.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$gt\\b", + "captures": { + "0": { + "name": "keyword.other.$gt.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$gte\\b", + "captures": { + "0": { + "name": "keyword.other.$gte.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$hour\\b", + "captures": { + "0": { + "name": "keyword.other.$hour.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$ifNull\\b", + "captures": { + "0": { + "name": "keyword.other.$ifNull.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$in\\b", + "captures": { + "0": { + "name": "keyword.other.$in.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$indexOfArray\\b", + "captures": { + "0": { + "name": "keyword.other.$indexOfArray.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$indexOfBytes\\b", + "captures": { + "0": { + "name": "keyword.other.$indexOfBytes.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$indexOfCP\\b", + "captures": { + "0": { + "name": "keyword.other.$indexOfCP.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$isArray\\b", + "captures": { + "0": { + "name": "keyword.other.$isArray.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$isNumber\\b", + "captures": { + "0": { + "name": "keyword.other.$isNumber.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$isoDayOfWeek\\b", + "captures": { + "0": { + "name": "keyword.other.$isoDayOfWeek.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$isoWeek\\b", + "captures": { + "0": { + "name": "keyword.other.$isoWeek.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$isoWeekYear\\b", + "captures": { + "0": { + "name": "keyword.other.$isoWeekYear.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$last\\b", + "captures": { + "0": { + "name": "keyword.other.$last.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$let\\b", + "captures": { + "0": { + "name": "keyword.other.$let.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$literal\\b", + "captures": { + "0": { + "name": "keyword.other.$literal.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$lt\\b", + "captures": { + "0": { + "name": "keyword.other.$lt.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$lt\\b", + "captures": { + "0": { + "name": "keyword.other.$lt.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$ln\\b", + "captures": { + "0": { + "name": "keyword.other.$ln.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$log\\b", + "captures": { + "0": { + "name": "keyword.other.$log.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$log10\\b", + "captures": { + "0": { + "name": "keyword.other.$log10.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$map\\b", + "captures": { + "0": { + "name": "keyword.other.$map.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$mergeObjects\\b", + "captures": { + "0": { + "name": "keyword.other.$mergeObjects.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$meta\\b", + "captures": { + "0": { + "name": "keyword.other.$meta.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$millisecond\\b", + "captures": { + "0": { + "name": "keyword.other.$millisecond.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$minute\\b", + "captures": { + "0": { + "name": "keyword.other.$minute.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$mod\\b", + "captures": { + "0": { + "name": "keyword.other.$mod.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$month\\b", + "captures": { + "0": { + "name": "keyword.other.$month.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$multiply\\b", + "captures": { + "0": { + "name": "keyword.other.$multiply.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$new\\b", + "captures": { + "0": { + "name": "keyword.other.$new.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$not\\b", + "captures": { + "0": { + "name": "keyword.other.$not.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$objectToArray\\b", + "captures": { + "0": { + "name": "keyword.other.$objectToArray.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$or\\b", + "captures": { + "0": { + "name": "keyword.other.$or.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$pow\\b", + "captures": { + "0": { + "name": "keyword.other.$pow.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$range\\b", + "captures": { + "0": { + "name": "keyword.other.$range.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$reduce\\b", + "captures": { + "0": { + "name": "keyword.other.$reduce.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$regexFind\\b", + "captures": { + "0": { + "name": "keyword.other.$regexFind.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$regexFindAll\\b", + "captures": { + "0": { + "name": "keyword.other.$regexFindAll.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$regexMatch\\b", + "captures": { + "0": { + "name": "keyword.other.$regexMatch.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$replaceAll\\b", + "captures": { + "0": { + "name": "keyword.other.$replaceAll.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$replaceOne\\b", + "captures": { + "0": { + "name": "keyword.other.$replaceOne.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$reverseArray\\b", + "captures": { + "0": { + "name": "keyword.other.$reverseArray.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$second\\b", + "captures": { + "0": { + "name": "keyword.other.$second.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$setDifference\\b", + "captures": { + "0": { + "name": "keyword.other.$setDifference.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$setEquals\\b", + "captures": { + "0": { + "name": "keyword.other.$setEquals.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$setIntersection\\b", + "captures": { + "0": { + "name": "keyword.other.$setIntersection.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$setIsSubset\\b", + "captures": { + "0": { + "name": "keyword.other.$setIsSubset.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$setUnion\\b", + "captures": { + "0": { + "name": "keyword.other.$setUnion.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$size\\b", + "captures": { + "0": { + "name": "keyword.other.$size.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$slice\\b", + "captures": { + "0": { + "name": "keyword.other.$slice.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$sortArray\\b", + "captures": { + "0": { + "name": "keyword.other.$sortArray.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$split\\b", + "captures": { + "0": { + "name": "keyword.other.$split.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$sqrt\\b", + "captures": { + "0": { + "name": "keyword.other.$sqrt.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$strcasecmp\\b", + "captures": { + "0": { + "name": "keyword.other.$strcasecmp.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$strLenBytes\\b", + "captures": { + "0": { + "name": "keyword.other.$strLenBytes.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$strLenCP\\b", + "captures": { + "0": { + "name": "keyword.other.$strLenCP.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$substr\\b", + "captures": { + "0": { + "name": "keyword.other.$substr.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$substrBytes\\b", + "captures": { + "0": { + "name": "keyword.other.$substrBytes.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$substrCP\\b", + "captures": { + "0": { + "name": "keyword.other.$substrCP.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$subtract\\b", + "captures": { + "0": { + "name": "keyword.other.$subtract.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$switch\\b", + "captures": { + "0": { + "name": "keyword.other.$switch.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$toLower\\b", + "captures": { + "0": { + "name": "keyword.other.$toLower.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$toUpper\\b", + "captures": { + "0": { + "name": "keyword.other.$toUpper.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$tsSecond\\b", + "captures": { + "0": { + "name": "keyword.other.$tsSecond.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$tsIncrement\\b", + "captures": { + "0": { + "name": "keyword.other.$tsIncrement.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$trunc\\b", + "captures": { + "0": { + "name": "keyword.other.$trunc.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$type\\b", + "captures": { + "0": { + "name": "keyword.other.$type.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$week\\b", + "captures": { + "0": { + "name": "keyword.other.$week.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$year\\b", + "captures": { + "0": { + "name": "keyword.other.$year.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$zip\\b", + "captures": { + "0": { + "name": "keyword.other.$zip.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$bitAnd\\b", + "captures": { + "0": { + "name": "keyword.other.$bitAnd.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$bitOr\\b", + "captures": { + "0": { + "name": "keyword.other.$bitOr.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$bitXor\\b", + "captures": { + "0": { + "name": "keyword.other.$bitXor.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$bitNot\\b", + "captures": { + "0": { + "name": "keyword.other.$bitNot.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$all\\b", + "captures": { + "0": { + "name": "keyword.other.$all.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$and\\b", + "captures": { + "0": { + "name": "keyword.other.$and.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$bitsAllClear\\b", + "captures": { + "0": { + "name": "keyword.other.$bitsAllClear.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$bitsAllSet\\b", + "captures": { + "0": { + "name": "keyword.other.$bitsAllSet.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$bitsAnyClear\\b", + "captures": { + "0": { + "name": "keyword.other.$bitsAnyClear.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$bitsAnySet\\b", + "captures": { + "0": { + "name": "keyword.other.$bitsAnySet.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$comment\\b", + "captures": { + "0": { + "name": "keyword.other.$comment.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$elemMatch\\b", + "captures": { + "0": { + "name": "keyword.other.$elemMatch.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$eq\\b", + "captures": { + "0": { + "name": "keyword.other.$eq.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$exists\\b", + "captures": { + "0": { + "name": "keyword.other.$exists.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$expr\\b", + "captures": { + "0": { + "name": "keyword.other.$expr.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$geoIntersects\\b", + "captures": { + "0": { + "name": "keyword.other.$geoIntersects.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$geoWithin\\b", + "captures": { + "0": { + "name": "keyword.other.$geoWithin.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$gt\\b", + "captures": { + "0": { + "name": "keyword.other.$gt.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$gte\\b", + "captures": { + "0": { + "name": "keyword.other.$gte.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$in\\b", + "captures": { + "0": { + "name": "keyword.other.$in.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$jsonSchema\\b", + "captures": { + "0": { + "name": "keyword.other.$jsonSchema.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$lt\\b", + "captures": { + "0": { + "name": "keyword.other.$lt.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$lte\\b", + "captures": { + "0": { + "name": "keyword.other.$lte.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$mod\\b", + "captures": { + "0": { + "name": "keyword.other.$mod.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$ne\\b", + "captures": { + "0": { + "name": "keyword.other.$ne.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$near\\b", + "captures": { + "0": { + "name": "keyword.other.$near.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$nearSphere\\b", + "captures": { + "0": { + "name": "keyword.other.$nearSphere.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$nin\\b", + "captures": { + "0": { + "name": "keyword.other.$nin.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$not\\b", + "captures": { + "0": { + "name": "keyword.other.$not.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$nor\\b", + "captures": { + "0": { + "name": "keyword.other.$nor.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$or\\b", + "captures": { + "0": { + "name": "keyword.other.$or.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$regex\\b", + "captures": { + "0": { + "name": "keyword.other.$regex.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$size\\b", + "captures": { + "0": { + "name": "keyword.other.$size.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$slice\\b", + "captures": { + "0": { + "name": "keyword.other.$slice.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$text\\b", + "captures": { + "0": { + "name": "keyword.other.$text.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$type\\b", + "captures": { + "0": { + "name": "keyword.other.$type.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$where\\b", + "captures": { + "0": { + "name": "keyword.other.$where.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$addFields\\b", + "captures": { + "0": { + "name": "keyword.other.$addFields.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$bucket\\b", + "captures": { + "0": { + "name": "keyword.other.$bucket.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$bucketAuto\\b", + "captures": { + "0": { + "name": "keyword.other.$bucketAuto.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$collStats\\b", + "captures": { + "0": { + "name": "keyword.other.$collStats.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$count\\b", + "captures": { + "0": { + "name": "keyword.other.$count.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$densify\\b", + "captures": { + "0": { + "name": "keyword.other.$densify.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$documents\\b", + "captures": { + "0": { + "name": "keyword.other.$documents.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$facet\\b", + "captures": { + "0": { + "name": "keyword.other.$facet.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$fill\\b", + "captures": { + "0": { + "name": "keyword.other.$fill.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$geoNear\\b", + "captures": { + "0": { + "name": "keyword.other.$geoNear.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$graphLookup\\b", + "captures": { + "0": { + "name": "keyword.other.$graphLookup.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$group\\b", + "captures": { + "0": { + "name": "keyword.other.$group.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$indexStats\\b", + "captures": { + "0": { + "name": "keyword.other.$indexStats.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$limit\\b", + "captures": { + "0": { + "name": "keyword.other.$limit.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$lookup\\b", + "captures": { + "0": { + "name": "keyword.other.$lookup.mongodb" + } + } + }, { "name": "meta.object.member.mongodb", "match": "\\$match\\b", "captures": { "0": { - "name": "keyword.other.match.mongodb" + "name": "keyword.other.$match.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$merge\\b", + "captures": { + "0": { + "name": "keyword.other.$merge.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$merge\\b", + "captures": { + "0": { + "name": "keyword.other.$merge.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$out\\b", + "captures": { + "0": { + "name": "keyword.other.$out.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$out\\b", + "captures": { + "0": { + "name": "keyword.other.$out.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$project\\b", + "captures": { + "0": { + "name": "keyword.other.$project.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$redact\\b", + "captures": { + "0": { + "name": "keyword.other.$redact.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$replaceWith\\b", + "captures": { + "0": { + "name": "keyword.other.$replaceWith.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$replaceRoot\\b", + "captures": { + "0": { + "name": "keyword.other.$replaceRoot.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$sample\\b", + "captures": { + "0": { + "name": "keyword.other.$sample.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$search\\b", + "captures": { + "0": { + "name": "keyword.other.$search.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$searchMeta\\b", + "captures": { + "0": { + "name": "keyword.other.$searchMeta.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$set\\b", + "captures": { + "0": { + "name": "keyword.other.$set.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$setWindowFields\\b", + "captures": { + "0": { + "name": "keyword.other.$setWindowFields.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$skip\\b", + "captures": { + "0": { + "name": "keyword.other.$skip.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$sort\\b", + "captures": { + "0": { + "name": "keyword.other.$sort.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$sortByCount\\b", + "captures": { + "0": { + "name": "keyword.other.$sortByCount.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$unionWith\\b", + "captures": { + "0": { + "name": "keyword.other.$unionWith.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$unset\\b", + "captures": { + "0": { + "name": "keyword.other.$unset.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$unwind\\b", + "captures": { + "0": { + "name": "keyword.other.$unwind.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$changeStream\\b", + "captures": { + "0": { + "name": "keyword.other.$changeStream.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$currentOp\\b", + "captures": { + "0": { + "name": "keyword.other.$currentOp.mongodb" + } + } + }, + { + "name": "meta.object.member.mongodb", + "match": "\\$listLocalSessions\\b", + "captures": { + "0": { + "name": "keyword.other.$listLocalSessions.mongodb" } } } ] } } -} +} \ No newline at end of file From c924b697c60120783de2c66bdec8d8fd0512c385 Mon Sep 17 00:00:00 2001 From: Alena Khineika Date: Mon, 20 Feb 2023 18:50:12 +0100 Subject: [PATCH 13/36] test: update for playgrounds in js --- package.json | 4 +- scripts/update-grammar.ts | 16 +- .../activeConnectionCodeLensProvider.ts | 15 +- src/editors/editorsController.ts | 13 +- src/editors/playgroundController.ts | 97 +++- ...> playgroundSelectedCodeActionProvider.ts} | 21 +- src/explorer/playgroundsTree.ts | 19 +- src/language/mongoDBService.ts | 2 +- src/mdbExtensionController.ts | 11 +- src/telemetry/telemetryService.ts | 16 - .../activeConnectionCodeLensProvider.test.ts | 227 ++++++++ .../editors/activeDBCodeLensProvider.test.ts | 108 ---- .../suite/editors/codeActionProvider.test.ts | 478 ---------------- .../editors/playgroundController.test.ts | 24 +- ...aygroundSelectedCodeActionProvider.test.ts | 536 ++++++++++++++++++ .../explorer/playgroundsExplorer.test.ts | 27 +- .../language/languageServerController.test.ts | 4 +- src/test/suite/mdbExtensionController.test.ts | 169 ++---- .../suite/telemetry/telemetryService.test.ts | 49 +- src/utils/playground.ts | 43 +- 20 files changed, 999 insertions(+), 880 deletions(-) rename src/editors/{codeActionProvider.ts => playgroundSelectedCodeActionProvider.ts} (89%) create mode 100644 src/test/suite/editors/activeConnectionCodeLensProvider.test.ts delete mode 100644 src/test/suite/editors/activeDBCodeLensProvider.test.ts delete mode 100644 src/test/suite/editors/codeActionProvider.test.ts create mode 100644 src/test/suite/editors/playgroundSelectedCodeActionProvider.test.ts diff --git a/package.json b/package.json index 0115ee1b3..f3ef71d94 100644 --- a/package.json +++ b/package.json @@ -127,7 +127,9 @@ { "path": "./syntaxes/mongodbInjection.tmLanguage.json", "scopeName": "mongodb.injection", - "injectTo": ["source.js"] + "injectTo": [ + "source.js" + ] } ], "snippets": [ diff --git a/scripts/update-grammar.ts b/scripts/update-grammar.ts index 3d4d996b6..dd7526cdc 100644 --- a/scripts/update-grammar.ts +++ b/scripts/update-grammar.ts @@ -11,7 +11,7 @@ import { CONVERSION_OPERATORS, EXPRESSION_OPERATORS, QUERY_OPERATORS, - STAGE_OPERATORS + STAGE_OPERATORS, } from '@mongodb-js/mongodb-constants'; const writeFile = promisify(fs.writeFile); @@ -22,7 +22,7 @@ const mongodbeywords = [ ...CONVERSION_OPERATORS, ...EXPRESSION_OPERATORS, ...QUERY_OPERATORS, - ...STAGE_OPERATORS + ...STAGE_OPERATORS, ]; const injectionGrammar = { @@ -36,12 +36,12 @@ const injectionGrammar = { match: `\\${keyword.name}\\b`, captures: { 0: { - name: `keyword.other.${keyword.name}.mongodb` - } - } - })) - } - } + name: `keyword.other.${keyword.name}.mongodb`, + }, + }, + })), + }, + }, }; (async () => { diff --git a/src/editors/activeConnectionCodeLensProvider.ts b/src/editors/activeConnectionCodeLensProvider.ts index f3bf327e6..4fc53c54d 100644 --- a/src/editors/activeConnectionCodeLensProvider.ts +++ b/src/editors/activeConnectionCodeLensProvider.ts @@ -10,24 +10,23 @@ export default class ActiveConnectionCodeLensProvider _connectionController: ConnectionController; _onDidChangeCodeLenses: vscode.EventEmitter = new vscode.EventEmitter(); - _activeTextEditor?: TextEditor; + activeTextEditor?: TextEditor; readonly onDidChangeCodeLenses: vscode.Event = this._onDidChangeCodeLenses.event; constructor(connectionController: ConnectionController) { this._connectionController = connectionController; - this._activeTextEditor = vscode.window.activeTextEditor; + this.activeTextEditor = vscode.window.activeTextEditor; vscode.workspace.onDidChangeConfiguration(() => { this._onDidChangeCodeLenses.fire(); }); + } - vscode.window.onDidChangeActiveTextEditor((editor: vscode.TextEditor | undefined) => { - if (editor?.document.languageId !== 'Log') { - this._activeTextEditor = editor; - } - }); + setActiveTextEditor(activeTextEditor?: TextEditor) { + this.activeTextEditor = activeTextEditor; + this._onDidChangeCodeLenses.fire(); } refresh(): void { @@ -35,7 +34,7 @@ export default class ActiveConnectionCodeLensProvider } provideCodeLenses(): vscode.CodeLens[] { - const editorUri = this._activeTextEditor?.document.uri; + const editorUri = this.activeTextEditor?.document.uri; if (!isPlayground(editorUri)) { return []; diff --git a/src/editors/editorsController.ts b/src/editors/editorsController.ts index af7fec2f7..63528b809 100644 --- a/src/editors/editorsController.ts +++ b/src/editors/editorsController.ts @@ -3,7 +3,7 @@ import { EJSON } from 'bson'; import ActiveConnectionCodeLensProvider from './activeConnectionCodeLensProvider'; import ExportToLanguageCodeLensProvider from './exportToLanguageCodeLensProvider'; -import CodeActionProvider from './codeActionProvider'; +import PlaygroundSelectedCodeActionProvider from './playgroundSelectedCodeActionProvider'; import ConnectionController from '../connectionController'; import CollectionDocumentsCodeLensProvider from './collectionDocumentsCodeLensProvider'; import CollectionDocumentsOperationsStore from './collectionDocumentsOperationsStore'; @@ -83,7 +83,7 @@ export function getViewCollectionDocumentsUri( * new editors and the data they need. It also manages active editors. */ export default class EditorsController { - _codeActionProvider: CodeActionProvider; + _playgroundSelectedCodeActionProvider: PlaygroundSelectedCodeActionProvider; _connectionController: ConnectionController; _playgroundController: PlaygroundController; _collectionDocumentsOperationsStore = @@ -110,7 +110,7 @@ export default class EditorsController { playgroundResultViewProvider: PlaygroundResultProvider, activeConnectionCodeLensProvider: ActiveConnectionCodeLensProvider, exportToLanguageCodeLensProvider: ExportToLanguageCodeLensProvider, - codeActionProvider: CodeActionProvider, + codeActionProvider: PlaygroundSelectedCodeActionProvider, editDocumentCodeLensProvider: EditDocumentCodeLensProvider ) { log.info('activating...'); @@ -143,7 +143,7 @@ export default class EditorsController { new CollectionDocumentsCodeLensProvider( this._collectionDocumentsOperationsStore ); - this._codeActionProvider = codeActionProvider; + this._playgroundSelectedCodeActionProvider = codeActionProvider; vscode.workspace.onDidCloseTextDocument((e) => { const uriParams = new URLSearchParams(e.uri.query); @@ -433,9 +433,10 @@ export default class EditorsController { this._context.subscriptions.push( vscode.languages.registerCodeActionsProvider( 'javascript', - this._codeActionProvider, + this._playgroundSelectedCodeActionProvider, { - providedCodeActionKinds: CodeActionProvider.providedCodeActionKinds, + providedCodeActionKinds: + PlaygroundSelectedCodeActionProvider.providedCodeActionKinds, } ) ); diff --git a/src/editors/playgroundController.ts b/src/editors/playgroundController.ts index 15d86d962..b268521c3 100644 --- a/src/editors/playgroundController.ts +++ b/src/editors/playgroundController.ts @@ -5,7 +5,7 @@ import vm from 'vm'; import * as os from 'os'; import ActiveConnectionCodeLensProvider from './activeConnectionCodeLensProvider'; -import CodeActionProvider from './codeActionProvider'; +import PlaygroundSelectedCodeActionProvider from './playgroundSelectedCodeActionProvider'; import ConnectionController, { DataServiceEventTypes, } from '../connectionController'; @@ -102,11 +102,11 @@ export default class PlaygroundController { _languageServerController: LanguageServerController; _selectedText?: string; _exportToLanguageCodeLensProvider: ExportToLanguageCodeLensProvider; - _codeActionProvider: CodeActionProvider; + _playgroundSelectedCodeActionProvider: PlaygroundSelectedCodeActionProvider; + _telemetryService: TelemetryService; _isPartialRun = false; - private _telemetryService: TelemetryService; private _activeConnectionCodeLensProvider: ActiveConnectionCodeLensProvider; private _outputChannel: OutputChannel; private _playgroundResultViewColumn?: vscode.ViewColumn; @@ -125,7 +125,7 @@ export default class PlaygroundController { playgroundResultViewProvider: PlaygroundResultProvider, activeConnectionCodeLensProvider: ActiveConnectionCodeLensProvider, exportToLanguageCodeLensProvider: ExportToLanguageCodeLensProvider, - codeActionProvider: CodeActionProvider, + codeActionProvider: PlaygroundSelectedCodeActionProvider, explorerController: ExplorerController ) { this._connectionController = connectionController; @@ -138,7 +138,7 @@ export default class PlaygroundController { vscode.window.createOutputChannel('Playground output'); this._activeConnectionCodeLensProvider = activeConnectionCodeLensProvider; this._exportToLanguageCodeLensProvider = exportToLanguageCodeLensProvider; - this._codeActionProvider = codeActionProvider; + this._playgroundSelectedCodeActionProvider = codeActionProvider; this._explorerController = explorerController; this._connectionController.addEventListener( @@ -157,23 +157,34 @@ export default class PlaygroundController { } if (isPlayground(editor?.document.uri)) { - void vscode.commands.executeCommand('setContext', 'mdb.showRunPlaygroundButton', true); + void vscode.commands.executeCommand( + 'setContext', + 'mdb.showRunPlaygroundButton', + true + ); } else { - void vscode.commands.executeCommand('setContext', 'mdb.showRunPlaygroundButton', false); + void vscode.commands.executeCommand( + 'setContext', + 'mdb.showRunPlaygroundButton', + false + ); } if (editor?.document.languageId !== 'Log') { this._activeTextEditor = editor; + this._activeConnectionCodeLensProvider.setActiveTextEditor( + this._activeTextEditor + ); + this._playgroundSelectedCodeActionProvider.setActiveTextEditor( + this._activeTextEditor + ); log.info('Active editor path', editor?.document.uri?.path); } }; vscode.workspace.textDocuments.forEach((document) => { if (isPlayground(document.uri)) { - void vscode.languages.setTextDocumentLanguage( - document, - 'javascript' - ); + void vscode.languages.setTextDocumentLanguage(document, 'javascript'); } }); @@ -182,16 +193,20 @@ export default class PlaygroundController { vscode.workspace.onDidOpenTextDocument(async (document) => { if (isPlayground(document.uri)) { - await vscode.languages.setTextDocumentLanguage( - document, - 'javascript' - ); + this._telemetryService.trackPlaygroundLoaded(); + await vscode.languages.setTextDocumentLanguage(document, 'javascript'); + } + }); + + vscode.workspace.onDidSaveTextDocument((document) => { + if (isPlayground(document.uri)) { + this._telemetryService.trackPlaygroundSaved(); } }); vscode.window.onDidChangeTextEditorSelection( async (changeEvent: vscode.TextEditorSelectionChangeEvent) => { - if (isPlayground(changeEvent?.textEditor?.document?.uri)) { + if (!isPlayground(changeEvent?.textEditor?.document?.uri)) { return; } @@ -216,7 +231,7 @@ export default class PlaygroundController { selection: sortedSelections[0], }); - this._codeActionProvider.refresh({ + this._playgroundSelectedCodeActionProvider.refresh({ selection: sortedSelections[0], mode, }); @@ -265,12 +280,20 @@ export default class PlaygroundController { const workspaceFolder = vscode.workspace.workspaceFolders?.[0]; const filePath = workspaceFolder?.uri.fsPath || os.tmpdir(); - const numberUntitledPlaygrounds = vscode.workspace.textDocuments.filter((doc) => isPlayground(doc.uri)).length; - const fileName = path.join(filePath, `playground-${numberUntitledPlaygrounds + 1}.mongodb.js`); + const numberUntitledPlaygrounds = vscode.workspace.textDocuments.filter( + (doc) => isPlayground(doc.uri) + ).length; + const fileName = path.join( + filePath, + `playground-${numberUntitledPlaygrounds + 1}.mongodb.js` + ); // Does not create a physical file, it only creates a URI from specified component parts. // An untitled file URI: untitled:/extensionPath/playground-1.mongodb.js - const documentUri = vscode.Uri.from({ path: fileName, scheme: 'untitled' }); + const documentUri = vscode.Uri.from({ + path: fileName, + scheme: 'untitled', + }); // Fill in initial content. const edit = new vscode.WorkspaceEdit(); @@ -578,7 +601,10 @@ export default class PlaygroundController { } runAllPlaygroundBlocks(): Promise { - if (!this._activeTextEditor || !isPlayground(this._activeTextEditor.document.uri)) { + if ( + !this._activeTextEditor || + !isPlayground(this._activeTextEditor.document.uri) + ) { void vscode.window.showErrorMessage( "Please open a '.mongodb' playground file before running it." ); @@ -593,7 +619,10 @@ export default class PlaygroundController { } runAllOrSelectedPlaygroundBlocks(): Promise { - if (!this._activeTextEditor || !isPlayground(this._activeTextEditor.document.uri)) { + if ( + !this._activeTextEditor || + !isPlayground(this._activeTextEditor.document.uri) + ) { void vscode.window.showErrorMessage( "Please open a '.mongodb' playground file before running it." ); @@ -647,9 +676,9 @@ export default class PlaygroundController { ...this._exportToLanguageCodeLensProvider._exportToLanguageAddons, textFromEditor: this._getAllText(), selectedText: this._selectedText, - selection: this._codeActionProvider.selection, + selection: this._playgroundSelectedCodeActionProvider.selection, language, - mode: this._codeActionProvider.mode, + mode: this._playgroundSelectedCodeActionProvider.mode, }); return this._transpile(); @@ -700,9 +729,15 @@ export default class PlaygroundController { }, }; - if (this._codeActionProvider.mode === ExportToLanguageMode.AGGREGATION) { + if ( + this._playgroundSelectedCodeActionProvider.mode === + ExportToLanguageMode.AGGREGATION + ) { toCompile.aggregation = selectedText; - } else if (this._codeActionProvider.mode === ExportToLanguageMode.QUERY) { + } else if ( + this._playgroundSelectedCodeActionProvider.mode === + ExportToLanguageMode.QUERY + ) { toCompile.filter = selectedText; } @@ -758,7 +793,10 @@ export default class PlaygroundController { log.info(`Export to ${language} language result`, this._playgroundResult); /* eslint-disable camelcase */ - if (this._codeActionProvider.mode === ExportToLanguageMode.AGGREGATION) { + if ( + this._playgroundSelectedCodeActionProvider.mode === + ExportToLanguageMode.AGGREGATION + ) { const aggExportedProps = { language, num_stages: selectedText @@ -770,7 +808,10 @@ export default class PlaygroundController { }; this._telemetryService.trackAggregationExported(aggExportedProps); - } else if (this._codeActionProvider.mode === ExportToLanguageMode.QUERY) { + } else if ( + this._playgroundSelectedCodeActionProvider.mode === + ExportToLanguageMode.QUERY + ) { const queryExportedProps = { language, with_import_statements: importStatements, diff --git a/src/editors/codeActionProvider.ts b/src/editors/playgroundSelectedCodeActionProvider.ts similarity index 89% rename from src/editors/codeActionProvider.ts rename to src/editors/playgroundSelectedCodeActionProvider.ts index d3f9881c6..e651e6ee7 100644 --- a/src/editors/codeActionProvider.ts +++ b/src/editors/playgroundSelectedCodeActionProvider.ts @@ -5,30 +5,32 @@ import EXTENSION_COMMANDS from '../commands'; import { ExportToLanguageMode } from '../types/playgroundType'; import { isPlayground } from '../utils/playground'; -export default class CodeActionProvider implements vscode.CodeActionProvider { +export default class PlaygroundSelectedCodeActionProvider + implements vscode.CodeActionProvider +{ _onDidChangeCodeCodeAction: vscode.EventEmitter = new vscode.EventEmitter(); selection?: vscode.Selection; mode?: ExportToLanguageMode; - _activeTextEditor?: TextEditor; + activeTextEditor?: TextEditor; static readonly providedCodeActionKinds = [vscode.CodeActionKind.QuickFix]; constructor() { + this.activeTextEditor = vscode.window.activeTextEditor; vscode.workspace.onDidChangeConfiguration(() => { this._onDidChangeCodeCodeAction.fire(); }); - - vscode.window.onDidChangeActiveTextEditor((editor: vscode.TextEditor | undefined) => { - if (editor?.document.languageId !== 'Log') { - this._activeTextEditor = editor; - } - }); } readonly onDidChangeCodeLenses: vscode.Event = this._onDidChangeCodeCodeAction.event; + setActiveTextEditor(activeTextEditor?: TextEditor) { + this.activeTextEditor = activeTextEditor; + this._onDidChangeCodeCodeAction.fire(); + } + refresh({ selection, mode, @@ -42,7 +44,8 @@ export default class CodeActionProvider implements vscode.CodeActionProvider { } provideCodeActions(): vscode.CodeAction[] | undefined { - const editorUri = this._activeTextEditor?.document.uri; + const editorUri = this.activeTextEditor?.document.uri; + if (!this.selection || !isPlayground(editorUri)) { return; } diff --git a/src/explorer/playgroundsTree.ts b/src/explorer/playgroundsTree.ts index d5f2f5cc9..e6cc8af2f 100644 --- a/src/explorer/playgroundsTree.ts +++ b/src/explorer/playgroundsTree.ts @@ -4,7 +4,7 @@ import { PLAYGROUND_ITEM } from './playgroundsTreeItem'; import { createLogger } from '../logging'; import PlaygroundsTreeItem from './playgroundsTreeItem'; import EXTENSION_COMMANDS from '../commands'; -import { readDirectory } from '../utils/playground'; +import { getPlaygrounds } from '../utils/playground'; const log = createLogger('playgrounds tree controller'); @@ -100,11 +100,20 @@ export default class PlaygroundsTree return element; } - public async getPlaygrounds(folderUri: vscode.Uri): Promise { - const playgrounds = await readDirectory(folderUri.fsPath); + public async getPlaygrounds(fsPath: string): Promise { + const excludeFromPlaygroundsSearch: string[] = + (await vscode.workspace + .getConfiguration('mdb') + .get('excludeFromPlaygroundsSearch')) || []; + + const playgrounds = await getPlaygrounds({ + fsPath, + excludeFromPlaygroundsSearch, + }); + this._playgroundsTreeItems = {}; - playgrounds.forEach(element => { + playgrounds.forEach((element) => { this._playgroundsTreeItems[element.path] = new PlaygroundsTreeItem( element.name, element.path @@ -127,7 +136,7 @@ export default class PlaygroundsTree ); for (const folder of workspaceFolders) { - const playgrounds = await this.getPlaygrounds(folder.uri); + const playgrounds = await this.getPlaygrounds(folder.uri.fsPath); if (Object.keys(playgrounds).length > 0) { this._playgroundsTreeHeaders.push( diff --git a/src/language/mongoDBService.ts b/src/language/mongoDBService.ts index 12ec27111..012e4560d 100644 --- a/src/language/mongoDBService.ts +++ b/src/language/mongoDBService.ts @@ -425,7 +425,7 @@ export default class MongoDBService { return { label: item, - kind: CompletionItemKind.Keyword, + kind: CompletionItemKind.Method, documentation: markdownDocumentation, detail, }; diff --git a/src/mdbExtensionController.ts b/src/mdbExtensionController.ts index a65d98cc4..0f9c2d2ba 100644 --- a/src/mdbExtensionController.ts +++ b/src/mdbExtensionController.ts @@ -6,7 +6,7 @@ import * as vscode from 'vscode'; import ActiveConnectionCodeLensProvider from './editors/activeConnectionCodeLensProvider'; -import CodeActionProvider from './editors/codeActionProvider'; +import PlaygroundSelectedCodeActionProvider from './editors/playgroundSelectedCodeActionProvider'; import ConnectionController from './connectionController'; import ConnectionTreeItem from './explorer/connectionTreeItem'; import { createLogger } from './logging'; @@ -44,7 +44,7 @@ const log = createLogger('commands'); // This class is the top-level controller for our extension. // Commands which the extensions handles are defined in the function `activate`. export default class MDBExtensionController implements vscode.Disposable { - _codeActionProvider: CodeActionProvider; + _playgroundSelectedCodeActionProvider: PlaygroundSelectedCodeActionProvider; _connectionController: ConnectionController; _context: vscode.ExtensionContext; _editorsController: EditorsController; @@ -96,7 +96,8 @@ export default class MDBExtensionController implements vscode.Disposable { new ActiveConnectionCodeLensProvider(this._connectionController); this._exportToLanguageCodeLensProvider = new ExportToLanguageCodeLensProvider(); - this._codeActionProvider = new CodeActionProvider(); + this._playgroundSelectedCodeActionProvider = + new PlaygroundSelectedCodeActionProvider(); this._playgroundController = new PlaygroundController( this._connectionController, this._languageServerController, @@ -105,7 +106,7 @@ export default class MDBExtensionController implements vscode.Disposable { this._playgroundResultViewProvider, this._activeConnectionCodeLensProvider, this._exportToLanguageCodeLensProvider, - this._codeActionProvider, + this._playgroundSelectedCodeActionProvider, this._explorerController ); this._editorsController = new EditorsController( @@ -117,7 +118,7 @@ export default class MDBExtensionController implements vscode.Disposable { this._playgroundResultViewProvider, this._activeConnectionCodeLensProvider, this._exportToLanguageCodeLensProvider, - this._codeActionProvider, + this._playgroundSelectedCodeActionProvider, this._editDocumentCodeLensProvider ); this._webviewController = new WebviewController( diff --git a/src/telemetry/telemetryService.ts b/src/telemetry/telemetryService.ts index 0890c3714..479ee2be9 100644 --- a/src/telemetry/telemetryService.ts +++ b/src/telemetry/telemetryService.ts @@ -104,22 +104,6 @@ export default class TelemetryService { this._segmentUserId = userId; this._segmentAnonymousId = anonymousId; this._segmentKey = this._readSegmentKey(); - - vscode.workspace.onDidOpenTextDocument((document) => { - if ( - document && - document.languageId === 'mongodb' && - document.uri.scheme === 'file' - ) { - this.trackPlaygroundLoaded(); - } - }); - - vscode.workspace.onDidSaveTextDocument((document) => { - if (document && document.languageId === 'mongodb') { - this.trackPlaygroundSaved(); - } - }); } private _readSegmentKey(): string | undefined { diff --git a/src/test/suite/editors/activeConnectionCodeLensProvider.test.ts b/src/test/suite/editors/activeConnectionCodeLensProvider.test.ts new file mode 100644 index 000000000..ff2751f1b --- /dev/null +++ b/src/test/suite/editors/activeConnectionCodeLensProvider.test.ts @@ -0,0 +1,227 @@ +import * as vscode from 'vscode'; +import { beforeEach, afterEach } from 'mocha'; +import { DataService } from 'mongodb-data-service'; +import chai from 'chai'; +import sinon from 'sinon'; +import * as os from 'os'; +import { v4 as uuidv4 } from 'uuid'; +import path from 'path'; + +import ActiveConnectionCodeLensProvider from '../../../editors/activeConnectionCodeLensProvider'; +import ConnectionController from '../../../connectionController'; +import { StatusView } from '../../../views'; +import { StorageController } from '../../../storage'; +import { TestExtensionContext } from '../stubs'; +import TelemetryService from '../../../telemetry/telemetryService'; + +const expect = chai.expect; + +suite('Active Connection CodeLens Provider Test Suite', () => { + const mockExtensionContext = new TestExtensionContext(); + const mockStorageController = new StorageController(mockExtensionContext); + const testTelemetryService = new TelemetryService( + mockStorageController, + mockExtensionContext + ); + const testStatusView = new StatusView(mockExtensionContext); + + suite('the MongoDB playground in JS', () => { + beforeEach(async () => { + const fileName = path.join( + os.tmpdir(), + `playground-${uuidv4()}.mongodb.js` + ); + const documentUri = vscode.Uri.from({ + path: fileName, + scheme: 'untitled', + }); + const document = await vscode.workspace.openTextDocument(documentUri); + await vscode.window.showTextDocument(document); + }); + + afterEach(async () => { + await vscode.commands.executeCommand( + 'workbench.action.closeActiveEditor' + ); + }); + + suite('user is not connected', () => { + const testConnectionController = new ConnectionController( + testStatusView, + mockStorageController, + testTelemetryService + ); + const testCodeLensProvider = new ActiveConnectionCodeLensProvider( + testConnectionController + ); + const mockShowQuickPick = sinon.fake(); + + beforeEach(() => { + testCodeLensProvider.setActiveTextEditor( + vscode.window.activeTextEditor + ); + sinon.replace(vscode.window, 'showQuickPick', mockShowQuickPick); + }); + + afterEach(() => { + sinon.restore(); + }); + + test('show disconnected message in code lenses', () => { + const codeLens = testCodeLensProvider.provideCodeLenses(); + + expect(codeLens).to.be.an('array'); + expect(codeLens.length).to.be.equal(1); + expect(codeLens[0].command?.title).to.be.equal( + 'Disconnected. Click here to connect.' + ); + expect(codeLens[0].range.start.line).to.be.equal(0); + expect(codeLens[0].range.end.line).to.be.equal(0); + }); + }); + + suite('user is connected', () => { + const testConnectionController = new ConnectionController( + testStatusView, + mockStorageController, + testTelemetryService + ); + const testCodeLensProvider = new ActiveConnectionCodeLensProvider( + testConnectionController + ); + const mockActiveDataService = { + find: (namespace, filter, options, callback): void => { + return callback(null, [{ field: 'Text message' }]); + }, + instance: () => + Promise.resolve({ + dataLake: {}, + build: {}, + genuineMongoDB: {}, + host: {}, + }), + } as DataService; + + testConnectionController.setActiveDataService(mockActiveDataService); + + beforeEach(() => { + testCodeLensProvider.setActiveTextEditor( + vscode.window.activeTextEditor + ); + sinon.replace( + testConnectionController, + 'getActiveConnectionName', + sinon.fake.returns('fakeName') + ); + }); + + afterEach(() => { + sinon.restore(); + }); + + test('show active connection in code lenses', () => { + const codeLens = testCodeLensProvider.provideCodeLenses(); + + expect(codeLens).to.be.an('array'); + expect(codeLens.length).to.be.equal(1); + expect(codeLens[0].command?.title).to.be.equal( + 'Currently connected to fakeName. Click here to change connection.' + ); + expect(codeLens[0].range.start.line).to.be.equal(0); + expect(codeLens[0].range.end.line).to.be.equal(0); + expect(codeLens[0].command?.command).to.be.equal( + 'mdb.changeActiveConnection' + ); + }); + }); + }); + + suite('the regular JS file', () => { + beforeEach(async () => { + const fileName = path.join(os.tmpdir(), `regular-file-${uuidv4()}.js`); + const documentUri = vscode.Uri.from({ + path: fileName, + scheme: 'untitled', + }); + const document = await vscode.workspace.openTextDocument(documentUri); + await vscode.window.showTextDocument(document); + }); + + afterEach(async () => { + await vscode.commands.executeCommand( + 'workbench.action.closeActiveEditor' + ); + }); + + suite('user is not connected', () => { + const testConnectionController = new ConnectionController( + testStatusView, + mockStorageController, + testTelemetryService + ); + const testCodeLensProvider = new ActiveConnectionCodeLensProvider( + testConnectionController + ); + const mockShowQuickPick = sinon.fake(); + + beforeEach(() => { + sinon.replace(vscode.window, 'showQuickPick', mockShowQuickPick); + }); + + afterEach(() => { + sinon.restore(); + }); + + test('show not show the active connection code lenses', () => { + const codeLens = testCodeLensProvider.provideCodeLenses(); + + expect(codeLens).to.be.an('array'); + expect(codeLens.length).to.be.equal(0); + }); + }); + + suite('user is connected', () => { + const testConnectionController = new ConnectionController( + testStatusView, + mockStorageController, + testTelemetryService + ); + const testCodeLensProvider = new ActiveConnectionCodeLensProvider( + testConnectionController + ); + const mockActiveDataService = { + find: (namespace, filter, options, callback): void => { + return callback(null, [{ field: 'Text message' }]); + }, + instance: () => + Promise.resolve({ + dataLake: {}, + build: {}, + genuineMongoDB: {}, + host: {}, + }), + } as DataService; + + testConnectionController.setActiveDataService(mockActiveDataService); + + beforeEach(() => { + sinon.replace( + testConnectionController, + 'getActiveConnectionName', + sinon.fake.returns('fakeName') + ); + }); + + afterEach(() => { + sinon.restore(); + }); + + test('show not show the active connection code lensess', () => { + const codeLens = testCodeLensProvider.provideCodeLenses(); + + expect(codeLens).to.be.an('array'); + expect(codeLens.length).to.be.equal(0); + }); + }); + }); +}); diff --git a/src/test/suite/editors/activeDBCodeLensProvider.test.ts b/src/test/suite/editors/activeDBCodeLensProvider.test.ts deleted file mode 100644 index 725149cb6..000000000 --- a/src/test/suite/editors/activeDBCodeLensProvider.test.ts +++ /dev/null @@ -1,108 +0,0 @@ -import * as vscode from 'vscode'; -import { beforeEach, afterEach } from 'mocha'; -import { DataService } from 'mongodb-data-service'; -import chai from 'chai'; -import sinon from 'sinon'; - -import ActiveDBCodeLensProvider from '../../../editors/activeConnectionCodeLensProvider'; -import ConnectionController from '../../../connectionController'; -import { StatusView } from '../../../views'; -import { StorageController } from '../../../storage'; -import { TestExtensionContext } from '../stubs'; -import TelemetryService from '../../../telemetry/telemetryService'; - -const expect = chai.expect; - -suite('Active DB CodeLens Provider Test Suite', () => { - const mockExtensionContext = new TestExtensionContext(); - const mockStorageController = new StorageController(mockExtensionContext); - const testTelemetryService = new TelemetryService( - mockStorageController, - mockExtensionContext - ); - const testStatusView = new StatusView(mockExtensionContext); - - suite('user is not connected', () => { - const testConnectionController = new ConnectionController( - testStatusView, - mockStorageController, - testTelemetryService - ); - const testCodeLensProvider = new ActiveDBCodeLensProvider( - testConnectionController - ); - const mockShowQuickPick = sinon.fake(); - - beforeEach(() => { - sinon.replace(vscode.window, 'showQuickPick', mockShowQuickPick); - }); - - afterEach(() => { - sinon.restore(); - }); - - test('show disconnected message in code lenses', () => { - const codeLens = testCodeLensProvider.provideCodeLenses(); - - expect(codeLens).to.be.an('array'); - expect(codeLens.length).to.be.equal(1); - expect(codeLens[0].command?.title).to.be.equal( - 'Disconnected. Click here to connect.' - ); - expect(codeLens[0].range.start.line).to.be.equal(0); - expect(codeLens[0].range.end.line).to.be.equal(0); - }); - }); - - suite('user is connected', () => { - const testConnectionController = new ConnectionController( - testStatusView, - mockStorageController, - testTelemetryService - ); - const testCodeLensProvider = new ActiveDBCodeLensProvider( - testConnectionController - ); - const mockActiveDataService = { - find: (namespace, filter, options, callback): void => { - return callback(null, [{ field: 'Text message' }]); - }, - instance: () => - Promise.resolve({ - dataLake: {}, - build: {}, - genuineMongoDB: {}, - host: {}, - }), - } as DataService; - - testConnectionController.setActiveDataService(mockActiveDataService); - - beforeEach(() => { - sinon.replace( - testConnectionController, - 'getActiveConnectionName', - sinon.fake.returns('fakeName') - ); - }); - - afterEach(() => { - sinon.restore(); - }); - - test('show active connection in code lenses', () => { - const codeLens = testCodeLensProvider.provideCodeLenses(); - - expect(codeLens).to.be.an('array'); - expect(codeLens.length).to.be.equal(1); - expect(codeLens[0].command?.title).to.be.equal( - 'Currently connected to fakeName. Click here to change connection.' - ); - expect(codeLens[0].range.start.line).to.be.equal(0); - expect(codeLens[0].range.end.line).to.be.equal(0); - expect(codeLens[0].command?.command).to.be.equal( - 'mdb.changeActiveConnection' - ); - }); - }); -}); diff --git a/src/test/suite/editors/codeActionProvider.test.ts b/src/test/suite/editors/codeActionProvider.test.ts deleted file mode 100644 index 43cbfbe8e..000000000 --- a/src/test/suite/editors/codeActionProvider.test.ts +++ /dev/null @@ -1,478 +0,0 @@ -import * as vscode from 'vscode'; -import { beforeEach, afterEach } from 'mocha'; -import chai from 'chai'; -import sinon from 'sinon'; - -import ActiveDBCodeLensProvider from '../../../editors/activeConnectionCodeLensProvider'; -import ExportToLanguageCodeLensProvider from '../../../editors/exportToLanguageCodeLensProvider'; -import CodeActionProvider from '../../../editors/codeActionProvider'; -import { ExplorerController } from '../../../explorer'; -import { LanguageServerController } from '../../../language'; -import { mdbTestExtension } from '../stubbableMdbExtension'; -import { PlaygroundController } from '../../../editors'; -import { - PlaygroundResult, - ExportToLanguageMode, -} from '../../../types/playgroundType'; -import { TEST_DATABASE_URI } from '../dbTestHelper'; -import { TestExtensionContext } from '../stubs'; - -const expect = chai.expect; - -suite('Code Action Provider Test Suite', function () { - this.timeout(5000); - - const testExtensionContext = new TestExtensionContext(); - testExtensionContext.extensionPath = '../../'; - - beforeEach(async () => { - sinon.replace( - mdbTestExtension.testExtensionController, - '_languageServerController', - new LanguageServerController(testExtensionContext) - ); - sinon.replace( - vscode.window, - 'showInformationMessage', - sinon.fake.resolves(true) - ); - - await mdbTestExtension.testExtensionController._connectionController.addNewConnectionStringAndConnect( - TEST_DATABASE_URI - ); - - const testActiveDBCodeLensProvider = new ActiveDBCodeLensProvider( - mdbTestExtension.testExtensionController._connectionController - ); - const testExportToLanguageCodeLensProvider = - new ExportToLanguageCodeLensProvider(); - const testCodeActionProvider = new CodeActionProvider(); - const testExplorerController = new ExplorerController( - mdbTestExtension.testExtensionController._connectionController - ); - - mdbTestExtension.testExtensionController._playgroundController = - new PlaygroundController( - mdbTestExtension.testExtensionController._connectionController, - mdbTestExtension.testExtensionController._languageServerController, - mdbTestExtension.testExtensionController._telemetryService, - mdbTestExtension.testExtensionController._statusView, - mdbTestExtension.testExtensionController._playgroundResultViewProvider, - testActiveDBCodeLensProvider, - testExportToLanguageCodeLensProvider, - testCodeActionProvider, - testExplorerController - ); - - const mockOpenPlaygroundResult: any = sinon.fake(); - sinon.replace( - mdbTestExtension.testExtensionController._playgroundController, - '_openPlaygroundResult', - mockOpenPlaygroundResult - ); - - await vscode.workspace - .getConfiguration('mdb') - .update('confirmRunAll', false); - - await mdbTestExtension.testExtensionController._languageServerController.startLanguageServer(); - await mdbTestExtension.testExtensionController._playgroundController._connectToServiceProvider(); - }); - - afterEach(async () => { - await vscode.workspace - .getConfiguration('mdb') - .update('confirmRunAll', true); - await mdbTestExtension.testExtensionController._connectionController.disconnect(); - mdbTestExtension.testExtensionController._connectionController.clearAllConnections(); - sinon.restore(); - }); - - test('returns undefined when text is not selected', () => { - const testCodeActionProvider = new CodeActionProvider(); - const codeActions = testCodeActionProvider.provideCodeActions(); - - expect(codeActions).to.be.undefined; - }); - - test('returns a run selected playground blocks action', async () => { - mdbTestExtension.testExtensionController._playgroundController._selectedText = - '123'; - - const selection = { - start: { line: 0, character: 0 }, - end: { line: 0, character: 4 }, - } as vscode.Selection; - const testCodeActionProvider = new CodeActionProvider(); - - testCodeActionProvider.refresh({ - selection, - mode: ExportToLanguageMode.OTHER, - }); - - const codeActions = testCodeActionProvider.provideCodeActions(); - - expect(codeActions).to.exist; - - if (codeActions) { - expect(codeActions.length).to.be.equal(1); - const actionCommand = codeActions[0].command; - - if (actionCommand) { - expect(actionCommand.command).to.be.equal( - 'mdb.runSelectedPlaygroundBlocks' - ); - expect(actionCommand.title).to.be.equal( - 'Run selected playground blocks' - ); - - await vscode.commands.executeCommand(actionCommand.command); - - const expectedResult = { - namespace: null, - type: 'number', - content: 123, - language: 'plaintext', - }; - expect( - mdbTestExtension.testExtensionController._playgroundController - ._playgroundResult - ).to.be.deep.equal(expectedResult); - expect( - mdbTestExtension.testExtensionController._playgroundController - ._isPartialRun - ).to.be.equal(true); - } - } - }); - - test('returns an export to java action with whitespaces around objects', () => { - const textFromEditor = ' { name: "Alena Khineika" } '; - const selection = { - start: { line: 0, character: 2 }, - end: { line: 0, character: 27 }, - } as vscode.Selection; - const mode = ExportToLanguageMode.QUERY; - const activeTextEditor = { - document: { getText: () => textFromEditor }, - } as vscode.TextEditor; - - mdbTestExtension.testExtensionController._playgroundController._selectedText = - textFromEditor; - mdbTestExtension.testExtensionController._playgroundController._codeActionProvider.selection = - selection; - mdbTestExtension.testExtensionController._playgroundController._codeActionProvider.mode = - mode; - mdbTestExtension.testExtensionController._playgroundController._activeTextEditor = - activeTextEditor; - - const testCodeActionProvider = new CodeActionProvider(); - testCodeActionProvider.refresh({ selection, mode }); - - const codeActions = testCodeActionProvider.provideCodeActions(); - - expect(codeActions).to.exist; - - if (codeActions) { - expect(codeActions.length).to.be.equal(6); - const actionCommand = codeActions[2].command; - - if (actionCommand) { - expect(actionCommand.command).to.be.equal('mdb.exportToJava'); - expect(actionCommand.title).to.be.equal('Export To Java'); - } - } - }); - - test('exports to java and includes builders', async () => { - const textFromEditor = "{ name: '22' }"; - const selection = { - start: { line: 0, character: 0 }, - end: { line: 0, character: 14 }, - } as vscode.Selection; - const mode = ExportToLanguageMode.QUERY; - const activeTextEditor = { - document: { getText: () => textFromEditor }, - } as vscode.TextEditor; - - mdbTestExtension.testExtensionController._playgroundController._selectedText = - textFromEditor; - mdbTestExtension.testExtensionController._playgroundController._codeActionProvider.selection = - selection; - mdbTestExtension.testExtensionController._playgroundController._codeActionProvider.mode = - mode; - mdbTestExtension.testExtensionController._playgroundController._activeTextEditor = - activeTextEditor; - - const testCodeActionProvider = new CodeActionProvider(); - testCodeActionProvider.refresh({ selection, mode }); - - const codeActions = testCodeActionProvider.provideCodeActions(); - - expect(codeActions).to.exist; - - if (codeActions) { - expect(codeActions.length).to.be.equal(6); - const actionCommand = codeActions[2].command; - - if (actionCommand) { - expect(actionCommand.command).to.be.equal('mdb.exportToJava'); - expect(actionCommand.title).to.be.equal('Export To Java'); - - await vscode.commands.executeCommand(actionCommand.command); - - const expectedResult = { - namespace: 'DATABASE_NAME.COLLECTION_NAME', - type: null, - content: 'new Document("name", "22")', - language: 'java', - }; - - const codeLenses = - mdbTestExtension.testExtensionController._playgroundController._exportToLanguageCodeLensProvider.provideCodeLenses(); - expect(codeLenses.length).to.be.equal(3); - - // Only java queries supports builders. - await vscode.commands.executeCommand( - 'mdb.changeExportToLanguageAddons', - { - ...mdbTestExtension.testExtensionController._playgroundController - ._exportToLanguageCodeLensProvider._exportToLanguageAddons, - builders: true, - } - ); - - expectedResult.content = 'eq("name", "22")'; - expect( - mdbTestExtension.testExtensionController._playgroundController - ._playgroundResult - ).to.be.deep.equal(expectedResult); - } - } - }); - - test('exports to csharp and includes import statements', async () => { - const textFromEditor = "{ name: '22' }"; - const selection = { - start: { line: 0, character: 0 }, - end: { line: 0, character: 14 }, - } as vscode.Selection; - const mode = ExportToLanguageMode.QUERY; - const activeTextEditor = { - document: { getText: () => textFromEditor }, - } as vscode.TextEditor; - - mdbTestExtension.testExtensionController._playgroundController._selectedText = - textFromEditor; - mdbTestExtension.testExtensionController._playgroundController._codeActionProvider.selection = - selection; - mdbTestExtension.testExtensionController._playgroundController._codeActionProvider.mode = - mode; - mdbTestExtension.testExtensionController._playgroundController._activeTextEditor = - activeTextEditor; - - const testCodeActionProvider = new CodeActionProvider(); - - testCodeActionProvider.refresh({ selection, mode }); - - const codeActions = testCodeActionProvider.provideCodeActions(); - - expect(codeActions).to.exist; - - if (codeActions) { - expect(codeActions.length).to.be.equal(6); - const actionCommand = codeActions[3].command; - - if (actionCommand) { - expect(actionCommand.command).to.be.equal('mdb.exportToCsharp'); - expect(actionCommand.title).to.be.equal('Export To C#'); - - await vscode.commands.executeCommand(actionCommand.command); - - const expectedResult = { - namespace: 'DATABASE_NAME.COLLECTION_NAME', - type: null, - content: 'new BsonDocument("name", "22")', - language: 'csharp', - }; - expect( - mdbTestExtension.testExtensionController._playgroundController - ._playgroundResult - ).to.be.deep.equal(expectedResult); - - const codeLenses = - mdbTestExtension.testExtensionController._playgroundController._exportToLanguageCodeLensProvider.provideCodeLenses(); - expect(codeLenses.length).to.be.equal(1); // Csharp does not support driver syntax. - - await vscode.commands.executeCommand( - 'mdb.changeExportToLanguageAddons', - { - ...mdbTestExtension.testExtensionController._playgroundController - ._exportToLanguageCodeLensProvider._exportToLanguageAddons, - importStatements: true, - } - ); - - expectedResult.content = - 'using MongoDB.Bson;\nusing MongoDB.Driver;\n\nnew BsonDocument("name", "22")'; - expect( - mdbTestExtension.testExtensionController._playgroundController - ._playgroundResult - ).to.be.deep.equal(expectedResult); - } - } - }); - - test('exports to python and includes driver syntax', async () => { - const textFromEditor = "use('db'); db.coll.find({ name: '22' })"; - const selection = { - start: { line: 0, character: 24 }, - end: { line: 0, character: 38 }, - } as vscode.Selection; - const mode = ExportToLanguageMode.QUERY; - const activeTextEditor = { - document: { getText: () => textFromEditor }, - } as vscode.TextEditor; - - mdbTestExtension.testExtensionController._playgroundController._selectedText = - "{ name: '22' }"; - mdbTestExtension.testExtensionController._playgroundController._codeActionProvider.selection = - selection; - mdbTestExtension.testExtensionController._playgroundController._codeActionProvider.mode = - mode; - mdbTestExtension.testExtensionController._playgroundController._activeTextEditor = - activeTextEditor; - - const testCodeActionProvider = new CodeActionProvider(); - testCodeActionProvider.refresh({ selection, mode }); - - const codeActions = testCodeActionProvider.provideCodeActions(); - - expect(codeActions).to.exist; - - if (codeActions) { - expect(codeActions.length).to.be.equal(6); - const actionCommand = codeActions[1].command; - - if (actionCommand) { - expect(actionCommand.command).to.be.equal('mdb.exportToPython'); - expect(actionCommand.title).to.be.equal('Export To Python 3'); - - await vscode.commands.executeCommand(actionCommand.command); - - let expectedResult: PlaygroundResult = { - namespace: 'DATABASE_NAME.COLLECTION_NAME', - type: null, - content: "{\n 'name': '22'\n}", - language: 'python', - }; - expect( - mdbTestExtension.testExtensionController._playgroundController - ._playgroundResult - ).to.be.deep.equal(expectedResult); - - const codeLenses = - mdbTestExtension.testExtensionController._playgroundController._exportToLanguageCodeLensProvider.provideCodeLenses(); - expect(codeLenses.length).to.be.equal(2); - - await vscode.commands.executeCommand( - 'mdb.changeExportToLanguageAddons', - { - ...mdbTestExtension.testExtensionController._playgroundController - ._exportToLanguageCodeLensProvider._exportToLanguageAddons, - driverSyntax: true, - } - ); - - expectedResult = { - namespace: 'db.coll', - type: null, - content: - "# Requires the PyMongo package.\n# https://api.mongodb.com/python/current\n\nclient = MongoClient('mongodb://localhost:27018/?appname=mongodb-vscode+0.0.0-dev.0')\nfilter={\n 'name': '22'\n}\n\nresult = client['db']['coll'].find(\n filter=filter\n)", - language: 'python', - }; - - expect( - mdbTestExtension.testExtensionController._playgroundController - ._playgroundResult - ).to.be.deep.equal(expectedResult); - } - } - }); - test('exports to ruby and includes driver syntax', async () => { - const textFromEditor = "use('db'); db.coll.find({ name: '22' })"; - const selection = { - start: { line: 0, character: 24 }, - end: { line: 0, character: 38 }, - } as vscode.Selection; - const mode = ExportToLanguageMode.QUERY; - const activeTextEditor = { - document: { getText: () => textFromEditor }, - } as vscode.TextEditor; - - mdbTestExtension.testExtensionController._playgroundController._selectedText = - "{ name: '22' }"; - mdbTestExtension.testExtensionController._playgroundController._codeActionProvider.selection = - selection; - mdbTestExtension.testExtensionController._playgroundController._codeActionProvider.mode = - mode; - mdbTestExtension.testExtensionController._playgroundController._activeTextEditor = - activeTextEditor; - - const testCodeActionProvider = new CodeActionProvider(); - testCodeActionProvider.refresh({ selection, mode }); - - const codeActions = testCodeActionProvider.provideCodeActions(); - - expect(codeActions).to.exist; - - if (codeActions) { - expect(codeActions.length).to.be.equal(6); - const actionCommand = codeActions[5].command; - - if (actionCommand) { - expect(actionCommand.command).to.be.equal('mdb.exportToRuby'); - expect(actionCommand.title).to.be.equal('Export To Ruby'); - - await vscode.commands.executeCommand(actionCommand.command); - - let expectedResult: PlaygroundResult = { - namespace: 'DATABASE_NAME.COLLECTION_NAME', - type: null, - content: "{\n 'name' => '22'\n}", - language: 'ruby', - }; - expect( - mdbTestExtension.testExtensionController._playgroundController - ._playgroundResult - ).to.be.deep.equal(expectedResult); - - const codeLenses = - mdbTestExtension.testExtensionController._playgroundController._exportToLanguageCodeLensProvider.provideCodeLenses(); - expect(codeLenses.length).to.be.equal(2); - - await vscode.commands.executeCommand( - 'mdb.changeExportToLanguageAddons', - { - ...mdbTestExtension.testExtensionController._playgroundController - ._exportToLanguageCodeLensProvider._exportToLanguageAddons, - driverSyntax: true, - } - ); - - expectedResult = { - namespace: 'db.coll', - type: null, - content: - "# Requires the MongoDB Ruby Driver\n# https://docs.mongodb.com/ruby-driver/master/\n\nclient = Mongo::Client.new('mongodb://localhost:27018/?appname=mongodb-vscode+0.0.0-dev.0', :database => 'db')\n\nresult = client.database['coll'].find({\n 'name' => '22'\n})", - language: 'ruby', - }; - - expect( - mdbTestExtension.testExtensionController._playgroundController - ._playgroundResult - ).to.be.deep.equal(expectedResult); - } - } - }); -}); diff --git a/src/test/suite/editors/playgroundController.test.ts b/src/test/suite/editors/playgroundController.test.ts index 760b28e77..1c5807e1b 100644 --- a/src/test/suite/editors/playgroundController.test.ts +++ b/src/test/suite/editors/playgroundController.test.ts @@ -3,9 +3,12 @@ import { before, beforeEach, afterEach } from 'mocha'; import chai from 'chai'; import { DataService } from 'mongodb-data-service'; import sinon from 'sinon'; +import * as os from 'os'; +import { v4 as uuidv4 } from 'uuid'; +import path from 'path'; import ActiveDBCodeLensProvider from '../../../editors/activeConnectionCodeLensProvider'; -import CodeActionProvider from '../../../editors/codeActionProvider'; +import PlaygroundSelectedCodeActionProvider from '../../../editors/playgroundSelectedCodeActionProvider'; import ConnectionController from '../../../connectionController'; import EditDocumentCodeLensProvider from '../../../editors/editDocumentCodeLensProvider'; import { ExplorerController } from '../../../explorer'; @@ -58,7 +61,7 @@ suite('Playground Controller Test Suite', function () { ); const testExportToLanguageCodeLensProvider = new ExportToLanguageCodeLensProvider(); - const testCodeActionProvider = new CodeActionProvider(); + const testCodeActionProvider = new PlaygroundSelectedCodeActionProvider(); const testExplorerController = new ExplorerController( testConnectionController ); @@ -201,12 +204,15 @@ suite('Playground Controller Test Suite', function () { }); suite('playground is open', () => { + const fileName = path.join( + os.tmpdir(), + `playground-${uuidv4()}.mongodb.js` + ); + const documentUri = vscode.Uri.from({ path: fileName, scheme: 'untitled' }); const activeTestEditorMock: unknown = { document: { - languageId: 'mongodb', - uri: { - path: 'test', - }, + languageId: 'javascript', + uri: documentUri, getText: () => "use('dbName');", lineAt: sinon.fake.returns({ text: "use('dbName');" }), }, @@ -505,8 +511,10 @@ suite('Playground Controller Test Suite', function () { .resolves(undefined); playgroundControllerTest._selectedText = '{ name: qwerty }'; - playgroundControllerTest._codeActionProvider.selection = selection; - playgroundControllerTest._codeActionProvider.mode = mode; + playgroundControllerTest._playgroundSelectedCodeActionProvider.selection = + selection; + playgroundControllerTest._playgroundSelectedCodeActionProvider.mode = + mode; playgroundControllerTest._activeTextEditor = activeTextEditor; await playgroundControllerTest.exportToLanguage('csharp'); diff --git a/src/test/suite/editors/playgroundSelectedCodeActionProvider.test.ts b/src/test/suite/editors/playgroundSelectedCodeActionProvider.test.ts new file mode 100644 index 000000000..7777b172f --- /dev/null +++ b/src/test/suite/editors/playgroundSelectedCodeActionProvider.test.ts @@ -0,0 +1,536 @@ +import * as vscode from 'vscode'; +import { beforeEach, afterEach } from 'mocha'; +import chai from 'chai'; +import sinon from 'sinon'; +import * as os from 'os'; +import { v4 as uuidv4 } from 'uuid'; +import path from 'path'; + +import ActiveDBCodeLensProvider from '../../../editors/activeConnectionCodeLensProvider'; +import ExportToLanguageCodeLensProvider from '../../../editors/exportToLanguageCodeLensProvider'; +import PlaygroundSelectedCodeActionProvider from '../../../editors/playgroundSelectedCodeActionProvider'; +import { ExplorerController } from '../../../explorer'; +import { LanguageServerController } from '../../../language'; +import { mdbTestExtension } from '../stubbableMdbExtension'; +import { PlaygroundController } from '../../../editors'; +import { + PlaygroundResult, + ExportToLanguageMode, +} from '../../../types/playgroundType'; +import { TEST_DATABASE_URI } from '../dbTestHelper'; +import { TestExtensionContext } from '../stubs'; + +const expect = chai.expect; + +suite('Playground Selected CodeAction Provider Test Suite', function () { + this.timeout(5000); + + const testExtensionContext = new TestExtensionContext(); + testExtensionContext.extensionPath = '../../'; + + suite('the MongoDB playground in JS', () => { + const testCodeActionProvider = new PlaygroundSelectedCodeActionProvider(); + + beforeEach(async () => { + const fileName = path.join( + os.tmpdir(), + `playground-${uuidv4()}.mongodb.js` + ); + const documentUri = vscode.Uri.from({ + path: fileName, + scheme: 'untitled', + }); + const edit = new vscode.WorkspaceEdit(); + edit.insert(documentUri, new vscode.Position(0, 0), '123'); + await vscode.workspace.applyEdit(edit); + const document = await vscode.workspace.openTextDocument(documentUri); + await vscode.window.showTextDocument(document); + testCodeActionProvider.setActiveTextEditor( + vscode.window.activeTextEditor + ); + + sinon.replace( + mdbTestExtension.testExtensionController, + '_languageServerController', + new LanguageServerController(testExtensionContext) + ); + sinon.replace( + vscode.window, + 'showInformationMessage', + sinon.fake.resolves(true) + ); + + await mdbTestExtension.testExtensionController._connectionController.addNewConnectionStringAndConnect( + TEST_DATABASE_URI + ); + + const testActiveDBCodeLensProvider = new ActiveDBCodeLensProvider( + mdbTestExtension.testExtensionController._connectionController + ); + const testExportToLanguageCodeLensProvider = + new ExportToLanguageCodeLensProvider(); + const testExplorerController = new ExplorerController( + mdbTestExtension.testExtensionController._connectionController + ); + + mdbTestExtension.testExtensionController._playgroundController = + new PlaygroundController( + mdbTestExtension.testExtensionController._connectionController, + mdbTestExtension.testExtensionController._languageServerController, + mdbTestExtension.testExtensionController._telemetryService, + mdbTestExtension.testExtensionController._statusView, + mdbTestExtension.testExtensionController._playgroundResultViewProvider, + testActiveDBCodeLensProvider, + testExportToLanguageCodeLensProvider, + testCodeActionProvider, + testExplorerController + ); + + const mockOpenPlaygroundResult: any = sinon.fake(); + sinon.replace( + mdbTestExtension.testExtensionController._playgroundController, + '_openPlaygroundResult', + mockOpenPlaygroundResult + ); + + await vscode.workspace + .getConfiguration('mdb') + .update('confirmRunAll', false); + + await mdbTestExtension.testExtensionController._languageServerController.startLanguageServer(); + await mdbTestExtension.testExtensionController._playgroundController._connectToServiceProvider(); + }); + + afterEach(async () => { + await vscode.commands.executeCommand( + 'workbench.action.closeActiveEditor' + ); + await vscode.workspace + .getConfiguration('mdb') + .update('confirmRunAll', true); + await mdbTestExtension.testExtensionController._connectionController.disconnect(); + mdbTestExtension.testExtensionController._connectionController.clearAllConnections(); + sinon.restore(); + }); + + test('returns undefined when text is not selected', () => { + const codeActions = testCodeActionProvider.provideCodeActions(); + expect(codeActions).to.be.undefined; + }); + + test('returns a run selected playground blocks action', async () => { + mdbTestExtension.testExtensionController._playgroundController._selectedText = + '123'; + + const selection = { + start: { line: 0, character: 0 }, + end: { line: 0, character: 4 }, + } as vscode.Selection; + + testCodeActionProvider.refresh({ + selection, + mode: ExportToLanguageMode.OTHER, + }); + + const codeActions = testCodeActionProvider.provideCodeActions(); + expect(codeActions).to.exist; + + if (codeActions) { + expect(codeActions.length).to.be.equal(1); + const actionCommand = codeActions[0].command; + + if (actionCommand) { + expect(actionCommand.command).to.be.equal( + 'mdb.runSelectedPlaygroundBlocks' + ); + expect(actionCommand.title).to.be.equal( + 'Run selected playground blocks' + ); + + await vscode.commands.executeCommand(actionCommand.command); + + const expectedResult = { + namespace: null, + type: 'number', + content: 123, + language: 'plaintext', + }; + expect( + mdbTestExtension.testExtensionController._playgroundController + ._playgroundResult + ).to.be.deep.equal(expectedResult); + expect( + mdbTestExtension.testExtensionController._playgroundController + ._isPartialRun + ).to.be.equal(true); + } + } + }); + + test('returns an export to java action with whitespaces around objects', () => { + const textFromEditor = ' { name: "Alena Khineika" } '; + const selection = { + start: { line: 0, character: 2 }, + end: { line: 0, character: 27 }, + } as vscode.Selection; + const mode = ExportToLanguageMode.QUERY; + const activeTextEditor = { + document: { getText: () => textFromEditor }, + } as vscode.TextEditor; + + mdbTestExtension.testExtensionController._playgroundController._selectedText = + textFromEditor; + mdbTestExtension.testExtensionController._playgroundController._playgroundSelectedCodeActionProvider.selection = + selection; + mdbTestExtension.testExtensionController._playgroundController._playgroundSelectedCodeActionProvider.mode = + mode; + mdbTestExtension.testExtensionController._playgroundController._activeTextEditor = + activeTextEditor; + + testCodeActionProvider.refresh({ selection, mode }); + + const codeActions = testCodeActionProvider.provideCodeActions(); + expect(codeActions).to.exist; + + if (codeActions) { + expect(codeActions.length).to.be.equal(6); + const actionCommand = codeActions[2].command; + + if (actionCommand) { + expect(actionCommand.command).to.be.equal('mdb.exportToJava'); + expect(actionCommand.title).to.be.equal('Export To Java'); + } + } + }); + + test('exports to java and includes builders', async () => { + const textFromEditor = "{ name: '22' }"; + const selection = { + start: { line: 0, character: 0 }, + end: { line: 0, character: 14 }, + } as vscode.Selection; + const mode = ExportToLanguageMode.QUERY; + const activeTextEditor = { + document: { getText: () => textFromEditor }, + } as vscode.TextEditor; + + mdbTestExtension.testExtensionController._playgroundController._selectedText = + textFromEditor; + mdbTestExtension.testExtensionController._playgroundController._playgroundSelectedCodeActionProvider.selection = + selection; + mdbTestExtension.testExtensionController._playgroundController._playgroundSelectedCodeActionProvider.mode = + mode; + mdbTestExtension.testExtensionController._playgroundController._activeTextEditor = + activeTextEditor; + + testCodeActionProvider.refresh({ selection, mode }); + + const codeActions = testCodeActionProvider.provideCodeActions(); + expect(codeActions).to.exist; + + if (codeActions) { + expect(codeActions.length).to.be.equal(6); + const actionCommand = codeActions[2].command; + + if (actionCommand) { + expect(actionCommand.command).to.be.equal('mdb.exportToJava'); + expect(actionCommand.title).to.be.equal('Export To Java'); + + await vscode.commands.executeCommand(actionCommand.command); + + const expectedResult = { + namespace: 'DATABASE_NAME.COLLECTION_NAME', + type: null, + content: 'new Document("name", "22")', + language: 'java', + }; + + const codeLenses = + mdbTestExtension.testExtensionController._playgroundController._exportToLanguageCodeLensProvider.provideCodeLenses(); + expect(codeLenses.length).to.be.equal(3); + + // Only java queries supports builders. + await vscode.commands.executeCommand( + 'mdb.changeExportToLanguageAddons', + { + ...mdbTestExtension.testExtensionController._playgroundController + ._exportToLanguageCodeLensProvider._exportToLanguageAddons, + builders: true, + } + ); + + expectedResult.content = 'eq("name", "22")'; + expect( + mdbTestExtension.testExtensionController._playgroundController + ._playgroundResult + ).to.be.deep.equal(expectedResult); + } + } + }); + + test('exports to csharp and includes import statements', async () => { + const textFromEditor = "{ name: '22' }"; + const selection = { + start: { line: 0, character: 0 }, + end: { line: 0, character: 14 }, + } as vscode.Selection; + const mode = ExportToLanguageMode.QUERY; + const activeTextEditor = { + document: { getText: () => textFromEditor }, + } as vscode.TextEditor; + + mdbTestExtension.testExtensionController._playgroundController._selectedText = + textFromEditor; + mdbTestExtension.testExtensionController._playgroundController._playgroundSelectedCodeActionProvider.selection = + selection; + mdbTestExtension.testExtensionController._playgroundController._playgroundSelectedCodeActionProvider.mode = + mode; + mdbTestExtension.testExtensionController._playgroundController._activeTextEditor = + activeTextEditor; + + testCodeActionProvider.refresh({ selection, mode }); + + const codeActions = testCodeActionProvider.provideCodeActions(); + expect(codeActions).to.exist; + + if (codeActions) { + expect(codeActions.length).to.be.equal(6); + const actionCommand = codeActions[3].command; + + if (actionCommand) { + expect(actionCommand.command).to.be.equal('mdb.exportToCsharp'); + expect(actionCommand.title).to.be.equal('Export To C#'); + + await vscode.commands.executeCommand(actionCommand.command); + + const expectedResult = { + namespace: 'DATABASE_NAME.COLLECTION_NAME', + type: null, + content: 'new BsonDocument("name", "22")', + language: 'csharp', + }; + expect( + mdbTestExtension.testExtensionController._playgroundController + ._playgroundResult + ).to.be.deep.equal(expectedResult); + + const codeLenses = + mdbTestExtension.testExtensionController._playgroundController._exportToLanguageCodeLensProvider.provideCodeLenses(); + expect(codeLenses.length).to.be.equal(1); // Csharp does not support driver syntax. + + await vscode.commands.executeCommand( + 'mdb.changeExportToLanguageAddons', + { + ...mdbTestExtension.testExtensionController._playgroundController + ._exportToLanguageCodeLensProvider._exportToLanguageAddons, + importStatements: true, + } + ); + + expectedResult.content = + 'using MongoDB.Bson;\nusing MongoDB.Driver;\n\nnew BsonDocument("name", "22")'; + expect( + mdbTestExtension.testExtensionController._playgroundController + ._playgroundResult + ).to.be.deep.equal(expectedResult); + } + } + }); + + test('exports to python and includes driver syntax', async () => { + const textFromEditor = "use('db'); db.coll.find({ name: '22' })"; + const selection = { + start: { line: 0, character: 24 }, + end: { line: 0, character: 38 }, + } as vscode.Selection; + const mode = ExportToLanguageMode.QUERY; + const activeTextEditor = { + document: { getText: () => textFromEditor }, + } as vscode.TextEditor; + + mdbTestExtension.testExtensionController._playgroundController._selectedText = + "{ name: '22' }"; + mdbTestExtension.testExtensionController._playgroundController._playgroundSelectedCodeActionProvider.selection = + selection; + mdbTestExtension.testExtensionController._playgroundController._playgroundSelectedCodeActionProvider.mode = + mode; + mdbTestExtension.testExtensionController._playgroundController._activeTextEditor = + activeTextEditor; + + testCodeActionProvider.refresh({ selection, mode }); + + const codeActions = testCodeActionProvider.provideCodeActions(); + expect(codeActions).to.exist; + + if (codeActions) { + expect(codeActions.length).to.be.equal(6); + const actionCommand = codeActions[1].command; + + if (actionCommand) { + expect(actionCommand.command).to.be.equal('mdb.exportToPython'); + expect(actionCommand.title).to.be.equal('Export To Python 3'); + + await vscode.commands.executeCommand(actionCommand.command); + + let expectedResult: PlaygroundResult = { + namespace: 'DATABASE_NAME.COLLECTION_NAME', + type: null, + content: "{\n 'name': '22'\n}", + language: 'python', + }; + expect( + mdbTestExtension.testExtensionController._playgroundController + ._playgroundResult + ).to.be.deep.equal(expectedResult); + + const codeLenses = + mdbTestExtension.testExtensionController._playgroundController._exportToLanguageCodeLensProvider.provideCodeLenses(); + expect(codeLenses.length).to.be.equal(2); + + await vscode.commands.executeCommand( + 'mdb.changeExportToLanguageAddons', + { + ...mdbTestExtension.testExtensionController._playgroundController + ._exportToLanguageCodeLensProvider._exportToLanguageAddons, + driverSyntax: true, + } + ); + + expectedResult = { + namespace: 'db.coll', + type: null, + content: + "# Requires the PyMongo package.\n# https://api.mongodb.com/python/current\n\nclient = MongoClient('mongodb://localhost:27018/?appname=mongodb-vscode+0.0.0-dev.0')\nfilter={\n 'name': '22'\n}\n\nresult = client['db']['coll'].find(\n filter=filter\n)", + language: 'python', + }; + + expect( + mdbTestExtension.testExtensionController._playgroundController + ._playgroundResult + ).to.be.deep.equal(expectedResult); + } + } + }); + + test('exports to ruby and includes driver syntax', async () => { + const textFromEditor = "use('db'); db.coll.find({ name: '22' })"; + const selection = { + start: { line: 0, character: 24 }, + end: { line: 0, character: 38 }, + } as vscode.Selection; + const mode = ExportToLanguageMode.QUERY; + const activeTextEditor = { + document: { getText: () => textFromEditor }, + } as vscode.TextEditor; + + mdbTestExtension.testExtensionController._playgroundController._selectedText = + "{ name: '22' }"; + mdbTestExtension.testExtensionController._playgroundController._playgroundSelectedCodeActionProvider.selection = + selection; + mdbTestExtension.testExtensionController._playgroundController._playgroundSelectedCodeActionProvider.mode = + mode; + mdbTestExtension.testExtensionController._playgroundController._activeTextEditor = + activeTextEditor; + + testCodeActionProvider.refresh({ selection, mode }); + + const codeActions = testCodeActionProvider.provideCodeActions(); + expect(codeActions).to.exist; + + if (codeActions) { + expect(codeActions.length).to.be.equal(6); + const actionCommand = codeActions[5].command; + + if (actionCommand) { + expect(actionCommand.command).to.be.equal('mdb.exportToRuby'); + expect(actionCommand.title).to.be.equal('Export To Ruby'); + + await vscode.commands.executeCommand(actionCommand.command); + + let expectedResult: PlaygroundResult = { + namespace: 'DATABASE_NAME.COLLECTION_NAME', + type: null, + content: "{\n 'name' => '22'\n}", + language: 'ruby', + }; + expect( + mdbTestExtension.testExtensionController._playgroundController + ._playgroundResult + ).to.be.deep.equal(expectedResult); + + const codeLenses = + mdbTestExtension.testExtensionController._playgroundController._exportToLanguageCodeLensProvider.provideCodeLenses(); + expect(codeLenses.length).to.be.equal(2); + + await vscode.commands.executeCommand( + 'mdb.changeExportToLanguageAddons', + { + ...mdbTestExtension.testExtensionController._playgroundController + ._exportToLanguageCodeLensProvider._exportToLanguageAddons, + driverSyntax: true, + } + ); + + expectedResult = { + namespace: 'db.coll', + type: null, + content: + "# Requires the MongoDB Ruby Driver\n# https://docs.mongodb.com/ruby-driver/master/\n\nclient = Mongo::Client.new('mongodb://localhost:27018/?appname=mongodb-vscode+0.0.0-dev.0', :database => 'db')\n\nresult = client.database['coll'].find({\n 'name' => '22'\n})", + language: 'ruby', + }; + + expect( + mdbTestExtension.testExtensionController._playgroundController + ._playgroundResult + ).to.be.deep.equal(expectedResult); + } + } + }); + }); + + suite('the regular JS file', () => { + const testCodeActionProvider = new PlaygroundSelectedCodeActionProvider(); + + beforeEach(async () => { + const fileName = path.join(os.tmpdir(), `regular-file-${uuidv4()}.js`); + const documentUri = vscode.Uri.from({ + path: fileName, + scheme: 'untitled', + }); + const document = await vscode.workspace.openTextDocument(documentUri); + await vscode.window.showTextDocument(document); + testCodeActionProvider.setActiveTextEditor( + vscode.window.activeTextEditor + ); + }); + + afterEach(async () => { + await vscode.commands.executeCommand( + 'workbench.action.closeActiveEditor' + ); + }); + + test('returns undefined when text is not selected', () => { + const codeActions = testCodeActionProvider.provideCodeActions(); + expect(codeActions).to.be.undefined; + }); + + test('returns undefined when text is selected', () => { + mdbTestExtension.testExtensionController._playgroundController._selectedText = + '123'; + + const selection = { + start: { line: 0, character: 0 }, + end: { line: 0, character: 4 }, + } as vscode.Selection; + + testCodeActionProvider.refresh({ + selection, + mode: ExportToLanguageMode.OTHER, + }); + + const codeActions = testCodeActionProvider.provideCodeActions(); + expect(codeActions).to.be.undefined; + }); + }); +}); diff --git a/src/test/suite/explorer/playgroundsExplorer.test.ts b/src/test/suite/explorer/playgroundsExplorer.test.ts index cbcba9aef..55ec58b97 100644 --- a/src/test/suite/explorer/playgroundsExplorer.test.ts +++ b/src/test/suite/explorer/playgroundsExplorer.test.ts @@ -1,6 +1,7 @@ import assert from 'assert'; import * as vscode from 'vscode'; import { before, afterEach } from 'mocha'; +import * as path from 'path'; import { mdbTestExtension } from '../stubbableMdbExtension'; import PlaygroundsTree from './../../../explorer/playgroundsTree'; @@ -44,34 +45,19 @@ suite('Playgrounds Controller Test Suite', function () { }); test('should search for playground in the workspace', async () => { - const workspaceFolders = (vscode.workspace.workspaceFolders || []).filter( - (folder) => folder.uri.scheme === 'file' - ); - const rootPath = workspaceFolders[0]?.uri.path.replace('/out/test', ''); - const rootUri = vscode.Uri.parse(rootPath); const treeController = testPlaygroundsExplorer.getTreeController(); try { - const children = await treeController.getPlaygrounds(rootUri); - + const rootPath = path.resolve(__dirname, '../../../..'); + const children = await treeController.getPlaygrounds(rootPath); assert.strictEqual(Object.keys(children).length, 7); - - const playgrounds = Object.values(children).filter( - (item: any) => item.label && item.label.split('.').pop() === 'mongodb' - ); - - assert.strictEqual(Object.keys(playgrounds).length, 7); } catch (error) { assert(false, error as Error); } }); test('should exclude folders and files specified in extension settings', async () => { - const workspaceFolders = (vscode.workspace.workspaceFolders || []).filter( - (folder) => folder.uri.scheme === 'file' - ); - const rootPath = workspaceFolders[0]?.uri.path.replace('/out/test', ''); - const rootUri = vscode.Uri.parse(rootPath); + const treeController = new PlaygroundsTree(); try { await vscode.workspace @@ -80,9 +66,8 @@ suite('Playgrounds Controller Test Suite', function () { 'excludeFromPlaygroundsSearch', excludeFromPlaygroundsSearchDefault.concat(['**/playgrounds/**']) ); - - const treeController = new PlaygroundsTree(); - const children = await treeController.getPlaygrounds(rootUri); + const rootPath = path.resolve(__dirname, '../../../..'); + const children = await treeController.getPlaygrounds(rootPath); assert.strictEqual(Object.keys(children).length, 3); } catch (error) { diff --git a/src/test/suite/language/languageServerController.test.ts b/src/test/suite/language/languageServerController.test.ts index 1455b8958..48a9d9a1e 100644 --- a/src/test/suite/language/languageServerController.test.ts +++ b/src/test/suite/language/languageServerController.test.ts @@ -5,7 +5,7 @@ import path from 'path'; import sinon from 'sinon'; import ActiveDBCodeLensProvider from '../../../editors/activeConnectionCodeLensProvider'; -import CodeActionProvider from '../../../editors/codeActionProvider'; +import PlaygroundSelectedCodeActionProvider from '../../../editors/playgroundSelectedCodeActionProvider'; import ConnectionController from '../../../connectionController'; import EditDocumentCodeLensProvider from '../../../editors/editDocumentCodeLensProvider'; import { ExplorerController } from '../../../explorer'; @@ -58,7 +58,7 @@ suite('Language Server Controller Test Suite', () => { ); const testExportToLanguageCodeLensProvider = new ExportToLanguageCodeLensProvider(); - const testCodeActionProvider = new CodeActionProvider(); + const testCodeActionProvider = new PlaygroundSelectedCodeActionProvider(); const testPlaygroundController = new PlaygroundController( testConnectionController, testLanguageServerController, diff --git a/src/test/suite/mdbExtensionController.test.ts b/src/test/suite/mdbExtensionController.test.ts index d48191422..803f3f8cf 100644 --- a/src/test/suite/mdbExtensionController.test.ts +++ b/src/test/suite/mdbExtensionController.test.ts @@ -565,30 +565,19 @@ suite('MDBExtensionController Test Suite', function () { mockActiveConnectionId ); - const mockOpenTextDocument = sinon.fake.resolves('untitled'); - sinon.replace(vscode.workspace, 'openTextDocument', mockOpenTextDocument); - - const mockShowTextDocument = sinon.fake(); - sinon.replace(vscode.window, 'showTextDocument', mockShowTextDocument); - await vscode.commands.executeCommand('mdb.addDatabase', mockTreeItem); - assert(mockOpenTextDocument.firstCall.args[0].language === 'mongodb'); assert( - mockOpenTextDocument.firstCall.args[0].content.includes( - '// Create a new database.' - ) - ); - assert( - mockOpenTextDocument.firstCall.args[0].content.includes( - 'NEW_DATABASE_NAME' - ) - ); - assert( - mockOpenTextDocument.firstCall.args[0].content.includes( - 'NEW_COLLECTION_NAME' - ) + vscode.window.activeTextEditor?.document.languageId === 'javascript' ); + assert(vscode.window.activeTextEditor?.document.uri.scheme === 'untitled'); + + const content = vscode.window.activeTextEditor.document.getText(); + assert(content.includes('// Create a new database.')); + assert(content.includes('NEW_DATABASE_NAME')); + assert(content.includes('NEW_COLLECTION_NAME')); + + await vscode.commands.executeCommand('workbench.action.closeActiveEditor'); }); test('mdb.addDatabase command fails when disconnecting', async () => { @@ -700,31 +689,20 @@ suite('MDBExtensionController Test Suite', function () { mockActiveConnectionId ); - const mockOpenTextDocument = sinon.fake.resolves('untitled'); - sinon.replace(vscode.workspace, 'openTextDocument', mockOpenTextDocument); - - const mockShowTextDocument = sinon.fake(); - sinon.replace(vscode.window, 'showTextDocument', mockShowTextDocument); - await vscode.commands.executeCommand('mdb.addCollection', mockTreeItem); - assert(mockOpenTextDocument.firstCall.args[0].language === 'mongodb'); assert( - mockOpenTextDocument.firstCall.args[0].content.includes( - '// The current database to use.' - ) - ); - assert( - mockOpenTextDocument.firstCall.args[0].content.includes('iceCreamDB') - ); - assert( - mockOpenTextDocument.firstCall.args[0].content.includes( - 'NEW_COLLECTION_NAME' - ) - ); - assert( - !mockOpenTextDocument.firstCall.args[0].content.includes('time-series') + vscode.window.activeTextEditor?.document.languageId === 'javascript' ); + assert(vscode.window.activeTextEditor?.document.uri.scheme === 'untitled'); + + const content = vscode.window.activeTextEditor.document.getText(); + assert(content.includes('// The current database to use.')); + assert(content.includes('iceCreamDB')); + assert(content.includes('NEW_COLLECTION_NAME')); + assert(!content.includes('time-series')); + + await vscode.commands.executeCommand('workbench.action.closeActiveEditor'); }); test('mdb.addCollection command fails when disconnecting', async () => { @@ -1365,72 +1343,44 @@ suite('MDBExtensionController Test Suite', function () { }); test('mdb.searchForDocuments should create a MongoDB playground with search template', async () => { - const mockOpenTextDocument = sinon.fake.resolves('untitled'); - sinon.replace(vscode.workspace, 'openTextDocument', mockOpenTextDocument); - - const mockShowTextDocument = sinon.fake(); - sinon.replace(vscode.window, 'showTextDocument', mockShowTextDocument); - await vscode.commands.executeCommand('mdb.searchForDocuments', { databaseName: 'dbbbbbName', collectionName: 'colllllllllName', }); - assert.strictEqual( - mockOpenTextDocument.firstCall.args[0].language, - 'mongodb' - ); - assert( - mockOpenTextDocument.firstCall.args[0].content.includes( - 'Search for documents in the current collection.' - ) - ); - assert( - mockOpenTextDocument.firstCall.args[0].content.includes('dbbbbbName') - ); assert( - mockOpenTextDocument.firstCall.args[0].content.includes('colllllllllName') + vscode.window.activeTextEditor?.document.languageId === 'javascript' ); - assert.strictEqual(mockShowTextDocument.firstCall.args[0], 'untitled'); - }); + assert(vscode.window.activeTextEditor?.document.uri.scheme === 'untitled'); - test('mdb.createIndexFromTreeView should create a MongoDB playground with index template', async () => { - const mockOpenTextDocument = sinon.fake.resolves('untitled'); - sinon.replace(vscode.workspace, 'openTextDocument', mockOpenTextDocument); + const content = vscode.window.activeTextEditor.document.getText(); + assert(content.includes('Search for documents in the current collection.')); + assert(content.includes('dbbbbbName')); + assert(content.includes('colllllllllName')); - const mockShowTextDocument = sinon.fake(); - sinon.replace(vscode.window, 'showTextDocument', mockShowTextDocument); + await vscode.commands.executeCommand('workbench.action.closeActiveEditor'); + }); + test('mdb.createIndexFromTreeView should create a MongoDB playground with index template', async () => { await vscode.commands.executeCommand('mdb.createIndexFromTreeView', { databaseName: 'dbbbbbName', collectionName: 'colllllllllName', }); - assert.strictEqual( - mockOpenTextDocument.firstCall.args[0].language, - 'mongodb' - ); - assert( - mockOpenTextDocument.firstCall.args[0].content.includes('dbbbbbName') - ); assert( - mockOpenTextDocument.firstCall.args[0].content.includes('colllllllllName') + vscode.window.activeTextEditor?.document.languageId === 'javascript' ); - assert( - mockOpenTextDocument.firstCall.args[0].content.includes( - 'Create a new index in the collection.' - ) - ); - assert.strictEqual(mockShowTextDocument.firstCall.args[0], 'untitled'); - }); + assert(vscode.window.activeTextEditor?.document.uri.scheme === 'untitled'); - test('mdb.createPlayground should create a MongoDB playground with default template', async () => { - const mockOpenTextDocument = sinon.fake.resolves('untitled'); - sinon.replace(vscode.workspace, 'openTextDocument', mockOpenTextDocument); + const content = vscode.window.activeTextEditor.document.getText(); + assert(content.includes('Create a new index in the collection.')); + assert(content.includes('dbbbbbName')); + assert(content.includes('colllllllllName')); - const mockShowTextDocument = sinon.fake(); - sinon.replace(vscode.window, 'showTextDocument', mockShowTextDocument); + await vscode.commands.executeCommand('workbench.action.closeActiveEditor'); + }); + test('mdb.createPlayground should create a MongoDB playground with default template', async () => { const mockGetConfiguration = sinon.fake.returns({ get: () => true, }); @@ -1438,40 +1388,18 @@ suite('MDBExtensionController Test Suite', function () { await vscode.commands.executeCommand('mdb.createPlayground'); - assert.strictEqual( - mockOpenTextDocument.firstCall.args[0].language, - 'mongodb' - ); assert( - mockOpenTextDocument.firstCall.args[0].content.startsWith( - '// MongoDB Playground' - ) + vscode.window.activeTextEditor?.document.languageId === 'javascript' ); - assert.strictEqual(mockShowTextDocument.firstCall.args[0], 'untitled'); - }); - - test('mdb.createNewPlaygroundFromViewAction should create a MongoDB playground', async () => { - const mockOpenTextDocument = sinon.fake.resolves('untitled'); - sinon.replace(vscode.workspace, 'openTextDocument', mockOpenTextDocument); + assert(vscode.window.activeTextEditor?.document.uri.scheme === 'untitled'); - const mockShowTextDocument = sinon.fake(); - sinon.replace(vscode.window, 'showTextDocument', mockShowTextDocument); + const content = vscode.window.activeTextEditor.document.getText(); + assert(content.includes('// MongoDB Playground')); - await vscode.commands.executeCommand('mdb.createPlayground'); - assert.strictEqual( - mockOpenTextDocument.firstCall.args[0].language, - 'mongodb' - ); - assert.strictEqual(mockShowTextDocument.firstCall.args[0], 'untitled'); + await vscode.commands.executeCommand('workbench.action.closeActiveEditor'); }); test('mdb.createPlayground command should create a MongoDB playground without template', async () => { - const mockOpenTextDocument = sinon.fake.resolves('untitled'); - sinon.replace(vscode.workspace, 'openTextDocument', mockOpenTextDocument); - - const mockShowTextDocument = sinon.fake(); - sinon.replace(vscode.window, 'showTextDocument', mockShowTextDocument); - const mockGetConfiguration = sinon.fake.returns({ get: () => false, }); @@ -1479,12 +1407,15 @@ suite('MDBExtensionController Test Suite', function () { await vscode.commands.executeCommand('mdb.createPlayground'); - assert.strictEqual( - mockOpenTextDocument.firstCall.args[0].language, - 'mongodb' + assert( + vscode.window.activeTextEditor?.document.languageId === 'javascript' ); - assert.strictEqual(mockOpenTextDocument.firstCall.args[0].content, ''); - assert.strictEqual(mockShowTextDocument.firstCall.args[0], 'untitled'); + assert(vscode.window.activeTextEditor?.document.uri.scheme === 'untitled'); + + const content = vscode.window.activeTextEditor.document.getText(); + assert.strictEqual(content, ''); + + await vscode.commands.executeCommand('workbench.action.closeActiveEditor'); }); test('mdb.runSelectedPlaygroundBlocks command should call runSelectedPlaygroundBlocks on the playground controller', async () => { diff --git a/src/test/suite/telemetry/telemetryService.test.ts b/src/test/suite/telemetry/telemetryService.test.ts index a8ba99cf9..294cd5b09 100644 --- a/src/test/suite/telemetry/telemetryService.test.ts +++ b/src/test/suite/telemetry/telemetryService.test.ts @@ -60,12 +60,12 @@ suite('Telemetry Controller Test Suite', () => { mockTrackCommandRun ); sinon.replace( - mdbTestExtension.testExtensionController._telemetryService, + mdbTestExtension.testExtensionController._playgroundController._telemetryService, 'trackPlaygroundCodeExecuted', mockTrackPlaygroundCodeExecuted ); sinon.replace( - mdbTestExtension.testExtensionController._telemetryService, + mdbTestExtension.testExtensionController._playgroundController._telemetryService, 'trackPlaygroundLoaded', mockTrackPlaygroundLoadedMethod ); @@ -318,7 +318,7 @@ suite('Telemetry Controller Test Suite', () => { const mode = ExportToLanguageMode.QUERY; const language = 'python'; - mdbTestExtension.testExtensionController._playgroundController._codeActionProvider.mode = + mdbTestExtension.testExtensionController._playgroundController._playgroundSelectedCodeActionProvider.mode = mode; mdbTestExtension.testExtensionController._playgroundController._exportToLanguageCodeLensProvider._exportToLanguageAddons = { @@ -361,7 +361,7 @@ suite('Telemetry Controller Test Suite', () => { const mode = ExportToLanguageMode.AGGREGATION; const language = 'java'; - mdbTestExtension.testExtensionController._playgroundController._codeActionProvider.mode = + mdbTestExtension.testExtensionController._playgroundController._playgroundSelectedCodeActionProvider.mode = mode; mdbTestExtension.testExtensionController._playgroundController._exportToLanguageCodeLensProvider._exportToLanguageAddons = { @@ -387,47 +387,6 @@ suite('Telemetry Controller Test Suite', () => { }); }); - suite('with active connection', function () { - this.timeout(5000); - - let dataServ; - beforeEach(async () => { - try { - dataServ = await connect({ connectionString: TEST_DATABASE_URI }); - } catch (error) { - expect(error).to.be.undefined; - } - }); - - afterEach(async () => { - sinon.restore(); - await dataServ.disconnect(); - }); - - test('track new connection event fetches the connection instance information', async () => { - sinon.replace(testTelemetryService, 'track', mockTrack); - sinon.replace( - testTelemetryService, - '_isTelemetryFeatureEnabled', - () => true - ); - await mdbTestExtension.testExtensionController._telemetryService.trackNewConnection( - dataServ, - ConnectionTypes.CONNECTION_STRING - ); - - expect(mockTrack.firstCall.args[0]).to.equal('New Connection'); - const instanceTelemetry: NewConnectionTelemetryEventProperties = - mockTrack.firstCall.args[1]; - expect(instanceTelemetry.is_localhost).to.equal(true); - expect(instanceTelemetry.is_atlas).to.equal(false); - expect(instanceTelemetry.is_used_connect_screen).to.equal(false); - expect(instanceTelemetry.is_used_command_palette).to.equal(true); - expect(instanceTelemetry.is_used_saved_connection).to.equal(false); - expect(instanceTelemetry.is_genuine).to.equal(true); - }); - }); - suite('prepare playground result types', () => { test('convert AggregationCursor shellApiType to aggregation telemetry type', () => { const res = { diff --git a/src/utils/playground.ts b/src/utils/playground.ts index f0e3ee38a..2d8a59111 100644 --- a/src/utils/playground.ts +++ b/src/utils/playground.ts @@ -1,3 +1,4 @@ +/* eslint-disable complexity */ import * as vscode from 'vscode'; import micromatch from 'micromatch'; import * as fs from 'fs'; @@ -47,15 +48,15 @@ export class FileStat implements vscode.FileStat { const getFileNames = (filePath: string): Promise => { return fs.promises.readdir(filePath); -} +}; const getStat = async (filePath: string): Promise => { return new FileStat(await stat(filePath)); -} +}; const stat = (filePath: string): Promise => { return fs.promises.stat(filePath); -} +}; export const isPlayground = (fileUri?: vscode.Uri) => { if (!fileUri) { @@ -77,12 +78,23 @@ export const isPlayground = (fileUri?: vscode.Uri) => { const extension = fileNameParts[fileNameParts.length - 1]; const secondaryExtension = fileNameParts[fileNameParts.length - 2]; - return fileNameParts.length > 1 && (extension === 'mongodb' || (extension === 'js' && secondaryExtension === 'mongodb')); -} - -export const readDirectory = async (fsPath: string, excludeFromPlaygroundsSearch?: string[]): Promise<{ name: string, path: string }[]> => { + return ( + fileNameParts.length > 1 && + (extension === 'mongodb' || + (extension === 'js' && secondaryExtension === 'mongodb')) + ); +}; + +export const getPlaygrounds = async ({ + fsPath, + excludeFromPlaygroundsSearch, + playgrounds = [], +}: { + fsPath: string; + excludeFromPlaygroundsSearch?: string[]; + playgrounds?: { name: string; path: string }[]; +}): Promise<{ name: string; path: string }[]> => { const fileNames = await getFileNames(fsPath); - const playgrounds: { name: string, path: string }[] = []; for (let i = 0; i < fileNames.length; i++) { const fileName = fileNames[i]; @@ -94,10 +106,17 @@ export const readDirectory = async (fsPath: string, excludeFromPlaygroundsSearch if (stat.type === vscode.FileType.File && isPlayground(fileUri)) { playgrounds.push({ name: fileName, path: fileUri.fsPath }); } else if ( - (stat.type === vscode.FileType.Directory && !excludeFromPlaygroundsSearch) || - (stat.type === vscode.FileType.Directory && excludeFromPlaygroundsSearch && !micromatch.isMatch(fileName, excludeFromPlaygroundsSearch)) + (stat.type === vscode.FileType.Directory && + !excludeFromPlaygroundsSearch) || + (stat.type === vscode.FileType.Directory && + excludeFromPlaygroundsSearch && + !micromatch.isMatch(fileName, excludeFromPlaygroundsSearch)) ) { - await readDirectory(fileUri.fsPath); + await getPlaygrounds({ + fsPath: fileUri.fsPath, + excludeFromPlaygroundsSearch, + playgrounds, + }); } } catch (error) { /* */ @@ -105,4 +124,4 @@ export const readDirectory = async (fsPath: string, excludeFromPlaygroundsSearch } return playgrounds; -} +}; From a86e0ff6dac6b392ec4861f01af2a84934b9a140 Mon Sep 17 00:00:00 2001 From: Alena Khineika Date: Mon, 20 Feb 2023 18:50:48 +0100 Subject: [PATCH 14/36] refactor: reformat --- src/test/suite/telemetry/telemetryService.test.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/test/suite/telemetry/telemetryService.test.ts b/src/test/suite/telemetry/telemetryService.test.ts index 294cd5b09..0bcfce32b 100644 --- a/src/test/suite/telemetry/telemetryService.test.ts +++ b/src/test/suite/telemetry/telemetryService.test.ts @@ -60,12 +60,14 @@ suite('Telemetry Controller Test Suite', () => { mockTrackCommandRun ); sinon.replace( - mdbTestExtension.testExtensionController._playgroundController._telemetryService, + mdbTestExtension.testExtensionController._playgroundController + ._telemetryService, 'trackPlaygroundCodeExecuted', mockTrackPlaygroundCodeExecuted ); sinon.replace( - mdbTestExtension.testExtensionController._playgroundController._telemetryService, + mdbTestExtension.testExtensionController._playgroundController + ._telemetryService, 'trackPlaygroundLoaded', mockTrackPlaygroundLoadedMethod ); From 084bfd9967b4232d21bfa20005b1509d4ab456dd Mon Sep 17 00:00:00 2001 From: Alena Khineika Date: Mon, 20 Feb 2023 18:52:13 +0100 Subject: [PATCH 15/36] refactor: restore snippets --- package.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/package.json b/package.json index f3ef71d94..d13f465c2 100644 --- a/package.json +++ b/package.json @@ -133,6 +133,10 @@ } ], "snippets": [ + { + "language": "mongodb", + "path": "./snippets/stage-autocompleter.json" + }, { "language": "terraform", "path": "./snippets/atlas-terraform.json" From 1a009ed19d6ec1627986cebc1ec9f67c6c00cfcb Mon Sep 17 00:00:00 2001 From: Alena Khineika Date: Mon, 20 Feb 2023 19:03:10 +0100 Subject: [PATCH 16/36] refactor: clean up --- package.json | 2 +- src/language/server.ts | 2 +- src/test/suite/telemetry/telemetryService.test.ts | 4 ---- src/utils/playground.ts | 7 +++++-- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index d13f465c2..07aacbf35 100644 --- a/package.json +++ b/package.json @@ -134,7 +134,7 @@ ], "snippets": [ { - "language": "mongodb", + "language": "javascript", "path": "./snippets/stage-autocompleter.json" }, { diff --git a/src/language/server.ts b/src/language/server.ts index 70e5c5621..9e27007ed 100644 --- a/src/language/server.ts +++ b/src/language/server.ts @@ -57,7 +57,7 @@ connection.onInitialize((params: InitializeParams) => { // Tell the client that the server supports code completion completionProvider: { resolveProvider: true, - triggerCharacters: ['.', '$'], + triggerCharacters: ['.'], }, // documentFormattingProvider: true, // documentRangeFormattingProvider: true, diff --git a/src/test/suite/telemetry/telemetryService.test.ts b/src/test/suite/telemetry/telemetryService.test.ts index 0bcfce32b..c3c3148b0 100644 --- a/src/test/suite/telemetry/telemetryService.test.ts +++ b/src/test/suite/telemetry/telemetryService.test.ts @@ -2,7 +2,6 @@ import * as vscode from 'vscode'; import * as path from 'path'; import { afterEach, beforeEach } from 'mocha'; import chai from 'chai'; -import { connect } from 'mongodb-data-service'; import { config } from 'dotenv'; import { resolve } from 'path'; import sinon from 'sinon'; @@ -13,7 +12,6 @@ import { ConnectionTypes } from '../../../connectionController'; import { DocumentSource } from '../../../documentSource'; import { ExportToLanguageMode } from '../../../types/playgroundType'; import { mdbTestExtension } from '../stubbableMdbExtension'; -import { NewConnectionTelemetryEventProperties } from '../../../telemetry/connectionTelemetry'; import { SegmentProperties, TelemetryEventTypes, @@ -22,8 +20,6 @@ import { const expect = chai.expect; const { version } = require('../../../../package.json'); -const TEST_DATABASE_URI = 'mongodb://localhost:27018'; - chai.use(sinonChai); config({ path: resolve(__dirname, '../../../../.env') }); diff --git a/src/utils/playground.ts b/src/utils/playground.ts index 2d8a59111..6183eda3e 100644 --- a/src/utils/playground.ts +++ b/src/utils/playground.ts @@ -1,9 +1,12 @@ -/* eslint-disable complexity */ import * as vscode from 'vscode'; import micromatch from 'micromatch'; import * as fs from 'fs'; import * as path from 'path'; +import { createLogger } from '../logging'; + +const log = createLogger('playground utils'); + export class FileStat implements vscode.FileStat { constructor(private fsStat: fs.Stats) {} @@ -119,7 +122,7 @@ export const getPlaygrounds = async ({ }); } } catch (error) { - /* */ + log.error('Get playgrounds recursively from the workspace error', error); } } From 989675f98eea4a4ca0da574ca9a49cdc65fc6b29 Mon Sep 17 00:00:00 2001 From: Alena Khineika Date: Tue, 21 Feb 2023 12:19:17 +0100 Subject: [PATCH 17/36] build: bump vscode engine --- package-lock.json | 4 ++-- package.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8a6c0e6bc..4eac53233 100644 --- a/package-lock.json +++ b/package-lock.json @@ -129,8 +129,8 @@ }, "engines": { "node": "^16.16.0", - "npm": "^8.8.0", - "vscode": "^1.71.0" + "npm": "^8.15.1", + "vscode": "^1.75.1" } }, "node_modules/@ampproject/remapping": { diff --git a/package.json b/package.json index 07aacbf35..333e102f9 100644 --- a/package.json +++ b/package.json @@ -62,9 +62,9 @@ "reformat": "prettier --write ." }, "engines": { - "vscode": "^1.71.0", + "vscode": "^1.75.1", "node": "^16.16.0", - "npm": "^8.8.0" + "npm": "^8.15.1" }, "activationEvents": [ "onView:mongoDB", From 97c3cb23517153214e39aba920c082f0f970aa8a Mon Sep 17 00:00:00 2001 From: Alena Khineika Date: Tue, 21 Feb 2023 13:43:02 +0100 Subject: [PATCH 18/36] build: clean up dependencies --- package-lock.json | 3447 +++++++++++++++++++++++---------------------- package.json | 81 +- 2 files changed, 1778 insertions(+), 1750 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4eac53233..127a75d8f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,53 +9,53 @@ "version": "0.0.0-dev.0", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { - "@babel/parser": "^7.19.1", - "@babel/traverse": "^7.19.1", - "@fortawesome/fontawesome-svg-core": "^6.2.0", - "@fortawesome/free-solid-svg-icons": "^6.2.0", + "@babel/parser": "^7.21.1", + "@babel/traverse": "^7.21.0", + "@fortawesome/fontawesome-svg-core": "^6.3.0", + "@fortawesome/free-solid-svg-icons": "^6.3.0", "@fortawesome/react-fontawesome": "^0.2.0", - "@iconify-icons/codicon": "^1.2.16", + "@iconify-icons/codicon": "^1.2.21", "@iconify/react": "^1.1.4", - "@leafygreen-ui/logo": "^6.1.3", - "@leafygreen-ui/palette": "^3.4.2", + "@leafygreen-ui/logo": "^6.3.0", + "@leafygreen-ui/palette": "^3.4.7", "@leafygreen-ui/toggle": "^7.0.5", - "@mongodb-js/mongodb-constants": "^0.2.1", + "@mongodb-js/mongodb-constants": "^0.2.2", "@mongosh/browser-runtime-electron": "^1.6.2", "@mongosh/i18n": "^1.6.2", "@mongosh/service-provider-server": "^1.6.2", "@mongosh/shell-api": "^1.6.2", "analytics-node": "^5.1.2", - "bson": "^4.7.0", - "bson-transpilers": "^2.0.0", + "bson": "^4.7.2", + "bson-transpilers": "^2.0.2", "classnames": "^2.3.2", "debug": "^4.3.4", - "dotenv": "^16.0.2", + "dotenv": "^16.0.3", "micromatch": "^4.0.5", - "mongodb": "^4.13.0", + "mongodb": "^4.14.0", "mongodb-build-info": "^1.5.0", "mongodb-cloud-info": "^1.1.3", "mongodb-connection-string-url": "^2.5.3", "mongodb-data-service": "^22.1.1", "mongodb-ns": "^2.4.0", - "mongodb-query-parser": "^2.4.6", + "mongodb-query-parser": "^2.4.10", "mongodb-schema": "^9.0.0", "numeral": "^2.0.6", "react": "^16.14.0", "react-dom": "^16.14.0", - "react-redux": "^7.2.8", - "redux": "^4.2.0", + "react-redux": "^7.2.9", + "redux": "^4.2.1", "ts-log": "^2.2.5", "uuid": "^8.3.2", - "vscode-languageclient": "^8.0.2", - "vscode-languageserver": "^8.0.2", - "vscode-languageserver-textdocument": "^1.0.7" + "vscode-languageclient": "^8.1.0", + "vscode-languageserver": "^8.1.0", + "vscode-languageserver-textdocument": "^1.0.9" }, "devDependencies": { "@mongodb-js/prettier-config-compass": "^1.0.0", - "@types/analytics-node": "^3.1.9", - "@types/babel__core": "^7.1.19", - "@types/babel__traverse": "^7.18.1", - "@types/chai": "^4.3.3", + "@types/analytics-node": "^3.1.10", + "@types/babel__core": "^7.20.0", + "@types/babel__traverse": "^7.18.3", + "@types/chai": "^4.3.4", "@types/chai-fs": "^2.0.2", "@types/chai-json-schema": "^1.4.6", "@types/debug": "^4.1.7", @@ -64,19 +64,19 @@ "@types/jest": "^26.0.24", "@types/micromatch": "^4.0.2", "@types/mocha": "^8.2.3", - "@types/node": "^14.18.29", + "@types/node": "^14.18.36", "@types/react": "^17.0.50", "@types/react-dom": "^17.0.17", "@types/sinon": "^9.0.11", "@types/uuid": "^8.3.4", - "@types/vscode": "^1.74.0", - "@typescript-eslint/eslint-plugin": "^5.38.0", - "@typescript-eslint/parser": "^5.38.0", - "@vscode/test-electron": "^2.1.5", - "@vscode/vsce": "^2.16.0", + "@types/vscode": "^1.75.1", + "@typescript-eslint/eslint-plugin": "^5.53.0", + "@typescript-eslint/parser": "^5.53.0", + "@vscode/test-electron": "^2.2.3", + "@vscode/vsce": "^2.17.0", "autoprefixer": "^9.8.8", "buffer": "^6.0.3", - "chai": "^4.3.6", + "chai": "^4.3.7", "chai-as-promised": "^7.1.1", "chai-fs": "^2.0.0", "chai-json-schema": "^1.5.1", @@ -88,8 +88,8 @@ "depcheck": "^1.4.3", "download": "^8.0.0", "enzyme": "^3.11.0", - "enzyme-adapter-react-16": "^1.15.6", - "eslint": "^8.23.1", + "enzyme-adapter-react-16": "^1.15.7", + "eslint": "^8.34.0", "eslint-config-mongodb-js": "^5.0.3", "eslint-plugin-mocha": "^10.1.0", "execa": "^1.0.0", @@ -99,30 +99,29 @@ "jest-transform-stub": "^2.0.0", "less": "^3.13.1", "less-loader": "^5.0.0", - "meow": "^9.0.0", "mkdirp": "^1.0.4", "mocha": "^8.4.0", - "mocha-junit-reporter": "^2.0.2", - "mocha-multi": "^1.1.6", - "mongodb-client-encryption": "^2.2.1", - "mongodb-runner": "^4.9.0", + "mocha-junit-reporter": "^2.2.0", + "mocha-multi": "^1.1.7", + "mongodb-client-encryption": "^2.5.0", + "mongodb-runner": "^4.10.0", "node-loader": "^0.6.0", "npm-run-all": "^4.1.5", "ora": "^5.4.1", "postcss-loader": "^3.0.0", "pre-commit": "^1.2.2", - "prettier": "^2.7.1", + "prettier": "^2.8.4", "process": "^0.11.10", - "semver": "^7.3.7", + "semver": "^7.3.8", "sinon": "^9.2.4", "sinon-chai": "^3.7.0", "stream-browserify": "^3.0.0", "style-loader": "^1.3.0", "ts-jest": "^26.5.6", - "ts-loader": "^9.4.1", + "ts-loader": "^9.4.2", "ts-node": "^10.9.1", - "typescript": "^4.8.3", - "webpack": "^5.74.0", + "typescript": "^4.9.5", + "webpack": "^5.75.0", "webpack-cli": "^4.10.0", "xvfb-maybe": "^0.2.1", "yargs-parser": "^20.2.9" @@ -1594,18 +1593,28 @@ } }, "node_modules/@babel/generator": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.0.tgz", - "integrity": "sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg==", + "version": "7.21.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.1.tgz", + "integrity": "sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==", "dependencies": { - "@babel/types": "^7.19.0", + "@babel/types": "^7.21.0", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/generator/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, "node_modules/@babel/helper-compilation-targets": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", @@ -1640,12 +1649,12 @@ } }, "node_modules/@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", + "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", "dependencies": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" + "@babel/template": "^7.20.7", + "@babel/types": "^7.21.0" }, "engines": { "node": ">=6.9.0" @@ -1722,9 +1731,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", - "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", "engines": { "node": ">=6.9.0" } @@ -1796,9 +1805,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.1.tgz", - "integrity": "sha512-h7RCSorm1DdTVGJf3P2Mhj3kdnkmF/EiysUkzS2TdgAYqyjFdMQJbVuXOBej2SBJaXan/lIVtT6KkGbyyq753A==", + "version": "7.21.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.1.tgz", + "integrity": "sha512-JzhBFpkuhBNYUY7qs+wTzNmyCWUHEaAFpQQD2YfU1rPL38/L43Wvid0fFkiOCnHvsGncRZgEPyGnltABLcVDTg==", "bin": { "parser": "bin/babel-parser.js" }, @@ -1982,31 +1991,31 @@ } }, "node_modules/@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", "dependencies": { "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.1.tgz", - "integrity": "sha512-0j/ZfZMxKukDaag2PtOPDbwuELqIar6lLskVPPJDjXMXjfLb1Obo/1yjxIGqqAJrmfaTIY3z2wFLAQ7qSkLsuA==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.0.tgz", + "integrity": "sha512-Xdt2P1H4LKTO8ApPfnO1KmzYMFpp7D/EinoXzLYN/cHcBNrVCAkAtGUcXnHXrl/VGktureU6fkQrHSBE2URfoA==", "dependencies": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.0", + "@babel/generator": "^7.21.0", "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", + "@babel/helper-function-name": "^7.21.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.19.1", - "@babel/types": "^7.19.0", + "@babel/parser": "^7.21.0", + "@babel/types": "^7.21.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -2015,12 +2024,12 @@ } }, "node_modules/@babel/types": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", - "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.0.tgz", + "integrity": "sha512-uR7NWq2VNFnDi7EYqiRz2Jv/VQIu38tu64Zy8TX2nQFQ6etJ9V/Rr2msW8BS132mum2rL645qpDrLtAJtVpuow==", "dependencies": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2231,15 +2240,15 @@ "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" }, "node_modules/@eslint/eslintrc": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.2.tgz", - "integrity": "sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", + "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.4.0", - "globals": "^13.15.0", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -2260,9 +2269,9 @@ "dev": true }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -2275,9 +2284,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, "engines": { "node": ">= 4" @@ -2320,33 +2329,33 @@ } }, "node_modules/@fortawesome/fontawesome-common-types": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.2.0.tgz", - "integrity": "sha512-rBevIsj2nclStJ7AxTdfsa3ovHb1H+qApwrxcTVo+NNdeJiB9V75hsKfrkG5AwNcRUNxrPPiScGYCNmLMoh8pg==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.3.0.tgz", + "integrity": "sha512-4BC1NMoacEBzSXRwKjZ/X/gmnbp/HU5Qqat7E8xqorUtBFZS+bwfGH5/wqOC2K6GV0rgEobp3OjGRMa5fK9pFg==", "hasInstallScript": true, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/fontawesome-svg-core": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.2.0.tgz", - "integrity": "sha512-Cf2mAAeMWFMzpLC7Y9H1I4o3wEU+XovVJhTiNG8ZNgSQj53yl7OCJaS80K4YjrABWZzbAHVaoHE1dVJ27AAYXw==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.3.0.tgz", + "integrity": "sha512-uz9YifyKlixV6AcKlOX8WNdtF7l6nakGyLYxYaCa823bEBqyj/U2ssqtctO38itNEwXb8/lMzjdoJ+aaJuOdrw==", "hasInstallScript": true, "dependencies": { - "@fortawesome/fontawesome-common-types": "6.2.0" + "@fortawesome/fontawesome-common-types": "6.3.0" }, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/free-solid-svg-icons": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.2.0.tgz", - "integrity": "sha512-UjCILHIQ4I8cN46EiQn0CZL/h8AwCGgR//1c4R96Q5viSRwuKVo0NdQEc4bm+69ZwC0dUvjbDqAHF1RR5FA3XA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.3.0.tgz", + "integrity": "sha512-x5tMwzF2lTH8pyv8yeZRodItP2IVlzzmBuD1M7BjawWgg9XAvktqJJ91Qjgoaf8qJpHQ8FEU9VxRfOkLhh86QA==", "hasInstallScript": true, "dependencies": { - "@fortawesome/fontawesome-common-types": "6.2.0" + "@fortawesome/fontawesome-common-types": "6.3.0" }, "engines": { "node": ">=6" @@ -2365,27 +2374,29 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", - "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", - "minimatch": "^3.0.4" + "minimatch": "^3.0.5" }, "engines": { "node": ">=10.10.0" } }, - "node_modules/@humanwhocodes/gitignore-to-minimatch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", - "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, "node_modules/@humanwhocodes/module-importer": { @@ -2408,9 +2419,9 @@ "dev": true }, "node_modules/@iconify-icons/codicon": { - "version": "1.2.16", - "resolved": "https://registry.npmjs.org/@iconify-icons/codicon/-/codicon-1.2.16.tgz", - "integrity": "sha512-85rBsFEhhq2qSBfIEF0hzUk31i4GjeRzNyd0DZGFWo5v+PgAeTBiv8ftsTDf8d2fxy9F5kesT/R7bOtRy1xKmw==", + "version": "1.2.21", + "resolved": "https://registry.npmjs.org/@iconify-icons/codicon/-/codicon-1.2.21.tgz", + "integrity": "sha512-thIa+5jVVVSz048cSQQpQfnXU+zfQjxF3ofmkZHN+7fc6cHclKRxPPXSeVj7dHZzpgQx4pbijHPIUzIni+Pegw==", "dependencies": { "@iconify/types": "*" } @@ -3026,9 +3037,9 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", - "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", "engines": { "node": ">=6.0.0" } @@ -3052,9 +3063,9 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", - "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==" + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.9", @@ -3128,14 +3139,14 @@ } }, "node_modules/@leafygreen-ui/logo": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@leafygreen-ui/logo/-/logo-6.1.3.tgz", - "integrity": "sha512-b0UfZ6ypwRenw8DxhbwDd3B0JiSdTHCsTE8yQ2wBqQgTazIlz9WoFEjCrSaVv/oZ3XQnY4CBUjEfYGQ8aVOjTA==" + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@leafygreen-ui/logo/-/logo-6.3.0.tgz", + "integrity": "sha512-hxAevbD/wfOjobRp7rVhqPyV/oFRUgwLuUdPn+JG1cBT/ALIeqz7fRz4jE6SyNc3ZXSWvphw/zHaKQSExVcXQQ==" }, "node_modules/@leafygreen-ui/palette": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@leafygreen-ui/palette/-/palette-3.4.2.tgz", - "integrity": "sha512-uR+fPOlU2Hyg1gHb4iFDtZE1SRmuj591apZpHYwAJ3JF1oqHmHVUZy9XTGN+V1Y299FGWsKrCU7OJxS7bg3nDg==" + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/@leafygreen-ui/palette/-/palette-3.4.7.tgz", + "integrity": "sha512-AsvPlbvF7CERiZbAQR8hy3lAJ2/rieXI3cO0jsOwV8ztDqYNotKAdLujyr/NviudrRUenYiXrLizIKVlSPUMuA==" }, "node_modules/@leafygreen-ui/toggle": { "version": "7.0.5", @@ -3186,9 +3197,9 @@ } }, "node_modules/@mongodb-js/mongodb-constants": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@mongodb-js/mongodb-constants/-/mongodb-constants-0.2.1.tgz", - "integrity": "sha512-arCTQYvK9scQszbQQcPba7Ru5HYrc8YINcGcM4HKMCcg+8A17U+3Y3AEI7N/oe2VE+1GFsrh8MoKBch4jEvY1g==" + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@mongodb-js/mongodb-constants/-/mongodb-constants-0.2.2.tgz", + "integrity": "sha512-vm1G+/WRWmXGyE9ZnhDv9toe+LRu1x0F/lGEwqWESfBiUUUuVZhj25fS2o4IL7H4pJ31sFxr7/gu+ER8OkmtzA==" }, "node_modules/@mongodb-js/prettier-config-compass": { "version": "1.0.0", @@ -3880,18 +3891,18 @@ "dev": true }, "node_modules/@types/analytics-node": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/@types/analytics-node/-/analytics-node-3.1.9.tgz", - "integrity": "sha512-C7L7/Dd/CmBST7AvgoCnf4yI9h6W5aYfCOcfUZS5GHlXDQjnXLVOUDpTdwTIZjW4lKECeil6+G+Ul6Xzwv/P0g==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@types/analytics-node/-/analytics-node-3.1.10.tgz", + "integrity": "sha512-dvn8iy2EQZDlQGgRNT9SW2Ljn9L3VgwcrpJvonufnNygZWB1XEufXNvDhUtwNUqNyHhD0hbDCCFb9j+B7vE5cA==", "dev": true }, "node_modules/@types/babel__core": { - "version": "7.1.19", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", - "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", + "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" @@ -3915,9 +3926,9 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.18.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.1.tgz", - "integrity": "sha512-FSdLaZh2UxaMuLp9lixWaHq/golWTRWOnRsAXzDTDSDOQLuZb1nsdCt6pJSPWSEQt2eFZ2YVk3oYhn+1kLMeMA==", + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", + "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", "dependencies": { "@babel/types": "^7.3.0" } @@ -3929,9 +3940,9 @@ "dev": true }, "node_modules/@types/chai": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.3.tgz", - "integrity": "sha512-hC7OMnszpxhZPduX+m+nrx+uFoLkWOMiR4oa/AZF3MuSETYTZmFfJAHqZEM8MVlvfG7BEUcgvtwoCTxBp6hm3g==" + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==" }, "node_modules/@types/chai-fs": { "version": "2.0.2", @@ -4174,12 +4185,6 @@ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", "dev": true }, - "node_modules/@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true - }, "node_modules/@types/mocha": { "version": "8.2.3", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.3.tgz", @@ -4193,9 +4198,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "14.18.29", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.29.tgz", - "integrity": "sha512-LhF+9fbIX4iPzhsRLpK5H7iPdvW8L4IwGciXQIOEcuF62+9nw/VQVsOViAOOGxY3OlOKGLFv0sWwJXdwQeTn6A==" + "version": "14.18.36", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.36.tgz", + "integrity": "sha512-FXKWbsJ6a1hIrRxv+FoukuHnGTgEzKYGi7kilfMae96AL9UNkPFNWJEEYWzdRI9ooIkbr4AKldyuSTLql06vLQ==" }, "node_modules/@types/normalize-package-data": { "version": "2.4.0", @@ -4254,6 +4259,12 @@ "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" }, + "node_modules/@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "dev": true + }, "node_modules/@types/sinon": { "version": "9.0.11", "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-9.0.11.tgz", @@ -4321,16 +4332,18 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.38.0.tgz", - "integrity": "sha512-GgHi/GNuUbTOeoJiEANi0oI6fF3gBQc3bGFYj40nnAPCbhrtEDf2rjBmefFadweBmO1Du1YovHeDP2h5JLhtTQ==", + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.53.0.tgz", + "integrity": "sha512-alFpFWNucPLdUOySmXCJpzr6HKC3bu7XooShWM+3w/EL6J2HIoB2PFxpLnq4JauWVk6DiVeNKzQlFEaE+X9sGw==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.38.0", - "@typescript-eslint/type-utils": "5.38.0", - "@typescript-eslint/utils": "5.38.0", + "@typescript-eslint/scope-manager": "5.53.0", + "@typescript-eslint/type-utils": "5.53.0", + "@typescript-eslint/utils": "5.53.0", "debug": "^4.3.4", + "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", "regexpp": "^3.2.0", "semver": "^7.3.7", "tsutils": "^3.21.0" @@ -4362,14 +4375,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.38.0.tgz", - "integrity": "sha512-/F63giJGLDr0ms1Cr8utDAxP2SPiglaD6V+pCOcG35P2jCqdfR7uuEhz1GIC3oy4hkUF8xA1XSXmd9hOh/a5EA==", + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.53.0.tgz", + "integrity": "sha512-MKBw9i0DLYlmdOb3Oq/526+al20AJZpANdT6Ct9ffxcV8nKCHz63t/S0IhlTFNsBIHJv+GY5SFJ0XfqVeydQrQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.38.0", - "@typescript-eslint/types": "5.38.0", - "@typescript-eslint/typescript-estree": "5.38.0", + "@typescript-eslint/scope-manager": "5.53.0", + "@typescript-eslint/types": "5.53.0", + "@typescript-eslint/typescript-estree": "5.53.0", "debug": "^4.3.4" }, "engines": { @@ -4389,13 +4402,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.38.0.tgz", - "integrity": "sha512-ByhHIuNyKD9giwkkLqzezZ9y5bALW8VNY6xXcP+VxoH4JBDKjU5WNnsiD4HJdglHECdV+lyaxhvQjTUbRboiTA==", + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.53.0.tgz", + "integrity": "sha512-Opy3dqNsp/9kBBeCPhkCNR7fmdSQqA+47r21hr9a14Bx0xnkElEQmhoHga+VoaoQ6uDHjDKmQPIYcUcKJifS7w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.38.0", - "@typescript-eslint/visitor-keys": "5.38.0" + "@typescript-eslint/types": "5.53.0", + "@typescript-eslint/visitor-keys": "5.53.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4406,13 +4419,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.38.0.tgz", - "integrity": "sha512-iZq5USgybUcj/lfnbuelJ0j3K9dbs1I3RICAJY9NZZpDgBYXmuUlYQGzftpQA9wC8cKgtS6DASTvF3HrXwwozA==", + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.53.0.tgz", + "integrity": "sha512-HO2hh0fmtqNLzTAme/KnND5uFNwbsdYhCZghK2SoxGp3Ifn2emv+hi0PBUjzzSh0dstUIFqOj3bp0AwQlK4OWw==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.38.0", - "@typescript-eslint/utils": "5.38.0", + "@typescript-eslint/typescript-estree": "5.53.0", + "@typescript-eslint/utils": "5.53.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -4433,9 +4446,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.38.0.tgz", - "integrity": "sha512-HHu4yMjJ7i3Cb+8NUuRCdOGu2VMkfmKyIJsOr9PfkBVYLYrtMCK/Ap50Rpov+iKpxDTfnqvDbuPLgBE5FwUNfA==", + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.53.0.tgz", + "integrity": "sha512-5kcDL9ZUIP756K6+QOAfPkigJmCPHcLN7Zjdz76lQWWDdzfOhZDTj1irs6gPBKiXx5/6O3L0+AvupAut3z7D2A==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4446,13 +4459,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.38.0.tgz", - "integrity": "sha512-6P0RuphkR+UuV7Avv7MU3hFoWaGcrgOdi8eTe1NwhMp2/GjUJoODBTRWzlHpZh6lFOaPmSvgxGlROa0Sg5Zbyg==", + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.53.0.tgz", + "integrity": "sha512-eKmipH7QyScpHSkhbptBBYh9v8FxtngLquq292YTEQ1pxVs39yFBlLC1xeIZcPPz1RWGqb7YgERJRGkjw8ZV7w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.38.0", - "@typescript-eslint/visitor-keys": "5.38.0", + "@typescript-eslint/types": "5.53.0", + "@typescript-eslint/visitor-keys": "5.53.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -4473,17 +4486,19 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.38.0.tgz", - "integrity": "sha512-6sdeYaBgk9Fh7N2unEXGz+D+som2QCQGPAf1SxrkEr+Z32gMreQ0rparXTNGRRfYUWk/JzbGdcM8NSSd6oqnTA==", + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.53.0.tgz", + "integrity": "sha512-VUOOtPv27UNWLxFwQK/8+7kvxVC+hPHNsJjzlJyotlaHjLSIgOCKj9I0DBUjwOOA64qjBwx5afAPjksqOxMO0g==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.38.0", - "@typescript-eslint/types": "5.38.0", - "@typescript-eslint/typescript-estree": "5.38.0", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.53.0", + "@typescript-eslint/types": "5.53.0", + "@typescript-eslint/typescript-estree": "5.53.0", "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4497,12 +4512,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.38.0.tgz", - "integrity": "sha512-MxnrdIyArnTi+XyFLR+kt/uNAcdOnmT+879os7qDRI+EYySR4crXJq9BXPfRzzLGq0wgxkwidrCJ9WCAoacm1w==", + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.53.0.tgz", + "integrity": "sha512-JqNLnX3leaHFZEN0gCh81sIvgrp/2GOACZNgO4+Tkf64u51kTpAyWFOY8XHx8XuXr3N2C9zgPPHtcpMg6z1g0w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.38.0", + "@typescript-eslint/types": "5.53.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -4529,9 +4544,9 @@ "dev": true }, "node_modules/@vscode/test-electron": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.1.5.tgz", - "integrity": "sha512-O/ioqFpV+RvKbRykX2ItYPnbcZ4Hk5V0rY4uhQjQTLhGL9WZUvS7exzuYQCCI+ilSqJpctvxq2llTfGXf9UnnA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.2.3.tgz", + "integrity": "sha512-7DmdGYQTqRNaLHKG3j56buc9DkstriY4aV0S3Zj32u0U9/T0L8vwWAC9QGCh1meu1VXDEla1ze27TkqysHGP0Q==", "dev": true, "dependencies": { "http-proxy-agent": "^4.0.1", @@ -4540,7 +4555,7 @@ "unzipper": "^0.10.11" }, "engines": { - "node": ">=8.9.3" + "node": ">=16" } }, "node_modules/@vscode/vsce": { @@ -5053,6 +5068,12 @@ "prop-types": "^15.7.2", "prop-types-exact": "^1.2.0", "react-is": "^16.13.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + }, + "peerDependencies": { + "react": "^0.14 || ^15.0.0 || ^16.0.0-alpha" } }, "node_modules/ajv": { @@ -5224,7 +5245,7 @@ "node_modules/ansi": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz", - "integrity": "sha1-DELU+xcWDVqa8eSEus4cZpIsGyE=", + "integrity": "sha512-iFY7JCgHbepc0b82yLaw4IMortylNb6wG4kL+4R0C3iv6i+RHGHux/yUX5BTiRvSX/shMnngjR1YyNMnXEFh5A==", "dev": true }, "node_modules/ansi-colors": { @@ -5472,44 +5493,18 @@ } }, "node_modules/array.prototype.find": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.1.1.tgz", - "integrity": "sha512-mi+MYNJYLTx2eNYy+Yh6raoQacCsNeeMUaspFPh9Y141lFSsWxxB8V9mM2ye+eqiRs917J6/pJ4M9ZPzenWckA==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.4" - } - }, - "node_modules/array.prototype.find/node_modules/es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.2.1.tgz", + "integrity": "sha512-I2ri5Z9uMpMvnsNrHre9l3PaX+z9D0/z6F7Yt2u15q7wt0I62g5kX6xUKR1SJiefgG+u2/gJUmM8B47XRvQR6w==", "dev": true, "dependencies": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/array.prototype.find/node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array.prototype.flat": { @@ -5541,15 +5536,6 @@ "node": ">= 0.4" } }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", @@ -5649,6 +5635,18 @@ "url": "https://tidelift.com/funding/github/npm/autoprefixer" } }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -6130,13 +6128,12 @@ } }, "node_modules/bson-transpilers": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bson-transpilers/-/bson-transpilers-2.0.0.tgz", - "integrity": "sha512-gHd/NCuZsbn+61uh1pDxI0dQxxkkq9SqsSc8hWN1Lwvu2dbnDLcPfBDaL3meYxb/sTDg+5drETbqgMwNsWg1vw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bson-transpilers/-/bson-transpilers-2.0.2.tgz", + "integrity": "sha512-FmY2vXr54rEcftux3/gspJ9RivX/kPz4O5XdAVuL2OxqYowXcDro+SETnMq5gWIy613o3DPLdGuAalDADOMHSQ==", "dependencies": { "antlr4": "4.7.2", "bson": "^4.4.1", - "context-eval": "^0.1.0", "js-yaml": "^3.13.1" } }, @@ -6295,13 +6292,16 @@ } }, "node_modules/call-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz", - "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dev": true, "dependencies": { "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.0" + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/call-me-maybe": { @@ -6360,23 +6360,6 @@ "node": ">=6" } }, - "node_modules/camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/caniuse-lite": { "version": "1.0.30001312", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz", @@ -6432,14 +6415,14 @@ } }, "node_modules/chai": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", - "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", "dev": true, "dependencies": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", - "deep-eql": "^3.0.1", + "deep-eql": "^4.1.2", "get-func-name": "^2.0.0", "loupe": "^2.3.1", "pathval": "^1.1.1", @@ -7402,9 +7385,9 @@ } }, "node_modules/config-chain": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", - "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", "dev": true, "dependencies": { "ini": "^1.3.4", @@ -7452,11 +7435,6 @@ "node": ">= 0.6" } }, - "node_modules/context-eval": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/context-eval/-/context-eval-0.1.0.tgz", - "integrity": "sha1-P8pxfX3wI6l4XwjGWkGJo93wP6s=" - }, "node_modules/context-map-webpack-plugin": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/context-map-webpack-plugin/-/context-map-webpack-plugin-0.1.0.tgz", @@ -7602,7 +7580,7 @@ "node_modules/css-select": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "integrity": "sha512-dUQOBoqdR7QwV90WysXPLXG5LO7nhYBgiWVfxF80DKPF8zx1t/pUd2FYy73emg3zrjtM6dzmYgbHKfV2rxiHQA==", "dev": true, "dependencies": { "boolbase": "~1.0.0", @@ -7727,28 +7705,6 @@ "node": ">=0.10.0" } }, - "node_modules/decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "dev": true, - "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/decimal.js": { "version": "10.2.1", "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", @@ -7991,15 +7947,15 @@ } }, "node_modules/deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", "dev": true, "dependencies": { "type-detect": "^4.0.0" }, "engines": { - "node": ">=0.12" + "node": ">=6" } }, "node_modules/deep-extend": { @@ -8044,15 +8000,19 @@ } }, "node_modules/define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "dev": true, "dependencies": { - "object-keys": "^1.0.12" + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/define-properties/node_modules/object-keys": { @@ -8419,7 +8379,7 @@ "node_modules/docopt": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/docopt/-/docopt-0.6.2.tgz", - "integrity": "sha1-so6eIiDaXsSffqW7JKR3h0Be6xE=", + "integrity": "sha512-NqTbaYeE4gA/wU1hdKFdU+AFahpDOpgGLzHP42k6H6DKExJd0A55KEVWYhL9FEmHmgeLvEU2vuKXDuU+4yToOw==", "dev": true, "engines": { "node": ">=0.10.0" @@ -8491,7 +8451,7 @@ "node_modules/domutils": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "integrity": "sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==", "dev": true, "dependencies": { "dom-serializer": "0", @@ -8499,9 +8459,9 @@ } }, "node_modules/dotenv": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.2.tgz", - "integrity": "sha512-JvpYKUmzQhYoIFgK2MOnF3bciIZoItIIoryihy0rIA+H4Jy0FmgyKYAHCTN98P5ybGSJcIFbh6QKeJdtZd1qhA==", + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", "engines": { "node": ">=12" } @@ -8509,7 +8469,7 @@ "node_modules/downcache": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/downcache/-/downcache-0.0.9.tgz", - "integrity": "sha1-eQuwQkaJE2EVzpPyqhWUbG2AbQ4=", + "integrity": "sha512-AssoVsNYu5DnPY0Ro67lkbiAr66sk5IHuiIGm3pzFzWmTzkcEoFjDlG8szzP4x+ZN2OHehKTZbwDrC7l2Q52+g==", "dev": true, "dependencies": { "extend": "^3.0.0", @@ -8524,7 +8484,7 @@ "node_modules/downcache/node_modules/gauge": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.7.tgz", - "integrity": "sha1-6c7FSD09TuDvRLYKfZnkk14TbZM=", + "integrity": "sha512-fVbU2wRE91yDvKUnrIaQlHKAWKY5e08PmztCrwuH5YVQ+Z/p3d0ny2T48o6uvAAXHIUnfaQdHkmxYbQft1eHVA==", "dev": true, "dependencies": { "ansi": "^0.3.0", @@ -8535,12 +8495,12 @@ } }, "node_modules/downcache/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "dependencies": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" @@ -8549,7 +8509,7 @@ "node_modules/downcache/node_modules/npmlog": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-2.0.4.tgz", - "integrity": "sha1-mLUlMPJRTKkNCexbIsiEZyI3VpI=", + "integrity": "sha512-DaL6RTb8Qh4tMe2ttPT1qWccETy2Vi5/8p+htMpLBeXJTr2CAqnF5WQtSP2eFpvaNbhLZ5uilDb98mRm4Q+lZQ==", "dev": true, "dependencies": { "ansi": "~0.3.1", @@ -8678,20 +8638,20 @@ } }, "node_modules/ejson-shell-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ejson-shell-parser/-/ejson-shell-parser-1.2.0.tgz", - "integrity": "sha512-2DbCot5/HYcO6kY91nLU5I0CKLTuK9LiKiwaY7OFvfqf3xVgYAvUiLAQKHKeqUFlIUXY3KwRtXfaF5Vic6R1dA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ejson-shell-parser/-/ejson-shell-parser-1.2.1.tgz", + "integrity": "sha512-xXRwH+O4EtL62ue8EmY8vNVr/AGRbRIv76WNuhXoWWwcT5TAvGKe4AqJh46QNXisVZe5e1JxvBdTnD3SO8ZLzA==", "dependencies": { "acorn": "^8.1.0" }, "peerDependencies": { - "bson": "^4.2.3" + "bson": "^4.2.3 || ^5.0.0" } }, "node_modules/ejson-shell-parser/node_modules/acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", "bin": { "acorn": "bin/acorn" }, @@ -8798,20 +8758,28 @@ } }, "node_modules/enzyme-adapter-react-16": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.15.6.tgz", - "integrity": "sha512-yFlVJCXh8T+mcQo8M6my9sPgeGzj85HSHi6Apgf1Cvq/7EL/J9+1JoJmJsRxZgyTvPMAqOEpRSu/Ii/ZpyOk0g==", + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.15.7.tgz", + "integrity": "sha512-LtjKgvlTc/H7adyQcj+aq0P0H07LDL480WQl1gU512IUyaDo/sbOaNDdZsJXYW2XaoPqrLLE9KbZS+X2z6BASw==", "dev": true, "dependencies": { - "enzyme-adapter-utils": "^1.14.0", - "enzyme-shallow-equal": "^1.0.4", + "enzyme-adapter-utils": "^1.14.1", + "enzyme-shallow-equal": "^1.0.5", "has": "^1.0.3", - "object.assign": "^4.1.2", - "object.values": "^1.1.2", - "prop-types": "^15.7.2", + "object.assign": "^4.1.4", + "object.values": "^1.1.5", + "prop-types": "^15.8.1", "react-is": "^16.13.1", "react-test-renderer": "^16.0.0-0", "semver": "^5.7.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + }, + "peerDependencies": { + "enzyme": "^3.0.0", + "react": "^16.0.0-0", + "react-dom": "^16.0.0-0" } }, "node_modules/enzyme-adapter-react-16/node_modules/semver": { @@ -8824,18 +8792,24 @@ } }, "node_modules/enzyme-adapter-utils": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.14.0.tgz", - "integrity": "sha512-F/z/7SeLt+reKFcb7597IThpDp0bmzcH1E9Oabqv+o01cID2/YInlqHbFl7HzWBl4h3OdZYedtwNDOmSKkk0bg==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.14.1.tgz", + "integrity": "sha512-JZgMPF1QOI7IzBj24EZoDpaeG/p8Os7WeBZWTJydpsH7JRStc7jYbHE4CmNQaLqazaGFyLM8ALWA3IIZvxW3PQ==", "dev": true, "dependencies": { "airbnb-prop-types": "^2.16.0", - "function.prototype.name": "^1.1.3", + "function.prototype.name": "^1.1.5", "has": "^1.0.3", - "object.assign": "^4.1.2", - "object.fromentries": "^2.0.3", - "prop-types": "^15.7.2", + "object.assign": "^4.1.4", + "object.fromentries": "^2.0.5", + "prop-types": "^15.8.1", "semver": "^5.7.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + }, + "peerDependencies": { + "react": "0.13.x || 0.14.x || ^15.0.0-0 || ^16.0.0-0" } }, "node_modules/enzyme-adapter-utils/node_modules/semver": { @@ -8848,13 +8822,16 @@ } }, "node_modules/enzyme-shallow-equal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.4.tgz", - "integrity": "sha512-MttIwB8kKxypwHvRynuC3ahyNc+cFbR8mjVIltnmzQ0uKGqmsfO4bfBuLxb0beLNPhjblUEYvEbsg+VSygvF1Q==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.5.tgz", + "integrity": "sha512-i6cwm7hN630JXenxxJFBKzgLC3hMTafFQXflvzHgPmDhOBhxUWDe8AeRv1qp2/uWJ2Y8z5yLWMzmAfkTOiOCZg==", "dev": true, "dependencies": { "has": "^1.0.3", - "object-is": "^1.1.2" + "object-is": "^1.1.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/enzyme/node_modules/lodash.escape": { @@ -8890,26 +8867,50 @@ } }, "node_modules/es-abstract": { - "version": "1.18.0-next.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", - "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", + "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", "dev": true, "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.3", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-negative-zero": "^2.0.0", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.4", + "is-array-buffer": "^3.0.1", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.2", "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/es-abstract/node_modules/object-keys": { @@ -8927,6 +8928,29 @@ "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", "dev": true }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, "node_modules/es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -9081,15 +9105,15 @@ } }, "node_modules/eslint": { - "version": "8.23.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.1.tgz", - "integrity": "sha512-w7C1IXCc6fNqjpuYd0yPlcTKKmHlHHktRkzmBPZ+7cvNBQuiNjx0xaMTjAJGCafJhQkrFJooREv0CtrVzmHwqg==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.34.0.tgz", + "integrity": "sha512-1Z8iFsucw+7kSqXNZVslXS8Ioa4u2KM7GPwuKtkTFAqZ/cHMcEaR+1+Br0wLlot49cNxIiZk5wp8EAbPcYZxTg==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.3.2", - "@humanwhocodes/config-array": "^0.10.4", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", + "@eslint/eslintrc": "^1.4.1", + "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -9105,14 +9129,14 @@ "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", - "glob-parent": "^6.0.1", - "globals": "^13.15.0", - "globby": "^11.1.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", @@ -9765,9 +9789,9 @@ } }, "node_modules/eslint/node_modules/globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -9942,9 +9966,9 @@ } }, "node_modules/espree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", - "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", + "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", "dev": true, "dependencies": { "acorn": "^8.8.0", @@ -9959,9 +9983,9 @@ } }, "node_modules/espree/node_modules/acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -10660,6 +10684,9 @@ }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/file-entry-cache": { @@ -10799,6 +10826,15 @@ } } }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, "node_modules/for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -10969,18 +11005,21 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "node_modules/function.prototype.name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.3.tgz", - "integrity": "sha512-H51qkbNSp8mtkJt+nyW1gyStBiKZxfRqySNUR99ylq6BPXHKI4SEvIlTKp4odLfjRKJV04DFWMU3G/YRlQOsag==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "functions-have-names": "^1.2.1" + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/functional-red-black-tree": { @@ -10990,10 +11029,13 @@ "dev": true }, "node_modules/functions-have-names": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.1.tgz", - "integrity": "sha512-j48B/ZI7VKs3sgeI2cZp7WXWmZXu7Iq5pl5/vptV5N2mq+DGFuS/ulaDjtaoLpYzuD6u8UgrUKHfgo7fDTSiBA==", - "dev": true + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/gauge": { "version": "2.7.4", @@ -11056,14 +11098,17 @@ } }, "node_modules/get-intrinsic": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz", - "integrity": "sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", "dev": true, "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", - "has-symbols": "^1.0.1" + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/get-mongodb-version": { @@ -11128,6 +11173,22 @@ "node": ">=6" } }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", @@ -11215,6 +11276,21 @@ "node": ">=4" } }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -11244,6 +11320,18 @@ "node": ">= 4" } }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/got": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", @@ -11370,15 +11458,6 @@ "node": ">=6" } }, - "node_modules/hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -11390,6 +11469,15 @@ "node": ">= 0.4.0" } }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -11398,6 +11486,30 @@ "node": ">=4" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbol-support-x": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", @@ -11408,12 +11520,15 @@ } }, "node_modules/has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-to-string-tag-x": { @@ -11428,6 +11543,21 @@ "node": "*" } }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", @@ -11604,7 +11734,21 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, "node_modules/htmlparser2/node_modules/string_decoder": { "version": "1.3.0", @@ -11837,50 +11981,19 @@ } }, "node_modules/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==", - "dev": true, - "dependencies": { - "es-abstract": "^1.17.0-next.1", - "has": "^1.0.3", - "side-channel": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/internal-slot/node_modules/es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", "dev": true, "dependencies": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", + "get-intrinsic": "^1.2.0", "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" + "side-channel": "^1.0.4" }, "engines": { "node": ">= 0.4" } }, - "node_modules/internal-slot/node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/interpret": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", @@ -11979,11 +12092,37 @@ "node": ">=0.10.0" } }, + "node_modules/is-array-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz", + "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -11997,12 +12136,19 @@ } }, "node_modules/is-boolean-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.1.tgz", - "integrity": "sha512-TqZuVwa/sppcrhUCAYkGBk7w0yxfQQnxq28fjkO53tnK9FQXmdwz2JS5+GjsWQ6RByES1K40nI+yDic5c9/aAQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-buffer": { @@ -12011,12 +12157,15 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "node_modules/is-callable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", - "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-ci": { @@ -12257,12 +12406,15 @@ "dev": true }, "node_modules/is-negative-zero": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", - "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-number": { @@ -12288,6 +12440,15 @@ "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==", "dev": true }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", @@ -12321,15 +12482,19 @@ "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" }, "node_modules/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.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, "dependencies": { - "has-symbols": "^1.0.1" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-retry-allowed": { @@ -12340,6 +12505,18 @@ "node": ">=0.10.0" } }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -12350,12 +12527,18 @@ } }, "node_modules/is-string": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", - "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-subset": { @@ -12376,6 +12559,25 @@ "node": ">= 0.4" } }, + "node_modules/is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -12398,6 +12600,18 @@ "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-what": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.12.0.tgz", @@ -15029,7 +15243,8 @@ "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", "engines": [ "node >= 0.2.0" - ] + ], + "optional": true }, "node_modules/jsonpointer.js": { "version": "0.4.0", @@ -15041,6 +15256,7 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "optional": true, "dependencies": { "jsonparse": "^1.2.0", "through": ">=2.2.7 <3" @@ -15242,7 +15458,7 @@ "node_modules/klaw": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==", "dev": true, "optionalDependencies": { "graceful-fs": "^4.1.9" @@ -15510,7 +15726,13 @@ "node_modules/lodash.assignin": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", - "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=", + "integrity": "sha512-yX/rx6d/UTVh7sSVWVSIMjfnz95evAgDFdb1ZozC35I9mSFCkmzptOzevxjgbQUsc78NR44LVHWjsoMQXy9FDg==", + "dev": true + }, + "node_modules/lodash.bind": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", + "integrity": "sha512-lxdsn7xxlCymgLYo1gGvVrfHmkjDiyqVv62FAeF2i5ta72BipE1SLxw8hPEPLhD4/247Ijw07UQH7Hq/chT5LA==", "dev": true }, "node_modules/lodash.camelcase": { @@ -15534,19 +15756,19 @@ "node_modules/lodash.difference": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==", "dev": true }, "node_modules/lodash.filter": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", - "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=", + "integrity": "sha512-pXYUy7PR8BCLwX5mgJ/aNtyOvuJTdZAo9EQFUvMIYugqmJxnrYaANvTbgndOzHSCSR0wnlBBfRXJL5SbWxo3FQ==", "dev": true }, "node_modules/lodash.flatten": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", "dev": true }, "node_modules/lodash.flattendeep": { @@ -15558,7 +15780,7 @@ "node_modules/lodash.foreach": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", - "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=", + "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==", "dev": true }, "node_modules/lodash.forin": { @@ -15574,7 +15796,8 @@ "node_modules/lodash.isfunction": { "version": "3.0.9", "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", - "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==" + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==", + "optional": true }, "node_modules/lodash.isplainobject": { "version": "4.0.6", @@ -15589,7 +15812,7 @@ "node_modules/lodash.map": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", - "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=", + "integrity": "sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==", "dev": true }, "node_modules/lodash.merge": { @@ -15601,55 +15824,56 @@ "node_modules/lodash.pad": { "version": "4.5.1", "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.5.1.tgz", - "integrity": "sha1-QzCUmoM6fI2iLMIPaibE1Z3runA=", + "integrity": "sha512-mvUHifnLqM+03YNzeTBS1/Gr6JRFjd3rRx88FHWUvamVaT9k2O/kXha3yBSOwB9/DTQrSTLJNHvLBBt2FdX7Mg==", "dev": true }, "node_modules/lodash.padend": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", - "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=", + "integrity": "sha512-sOQs2aqGpbl27tmCS1QNZA09Uqp01ZzWfDUoD+xzTii0E7dSQfRKcRetFwa+uXaxaqL+TKm7CgD2JdKP7aZBSw==", "dev": true }, "node_modules/lodash.padstart": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz", - "integrity": "sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs=", + "integrity": "sha512-sW73O6S8+Tg66eY56DBk85aQzzUJDtpoXFBgELMd5P/SotAguo+1kYO6RuYgXxA4HJH3LFTFPASX6ET6bjfriw==", "dev": true }, "node_modules/lodash.pick": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=", + "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==", "dev": true }, "node_modules/lodash.reduce": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", - "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=", + "integrity": "sha512-6raRe2vxCYBhpBu+B+TtNGUzah+hQjVdu3E17wfusjyrXBka2nBS8OH/gjVZ5PvHOhWmIZTYri09Z6n/QfnNMw==", "dev": true }, "node_modules/lodash.reject": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz", - "integrity": "sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU=", + "integrity": "sha512-qkTuvgEzYdyhiJBx42YPzPo71R1aEr0z79kAv7Ixg8wPFEjgRgJdUsGMG3Hf3OYSF/kHI79XhNlt+5Ar6OzwxQ==", "dev": true }, "node_modules/lodash.some": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", - "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=", + "integrity": "sha512-j7MJE+TuT51q9ggt4fSgVqro163BEFjAt3u97IqU+JA2DkWl80nFTrowzLpZ/BnpN7rrl0JA/593NAdd8p/scQ==", "dev": true }, "node_modules/lodash.startswith": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/lodash.startswith/-/lodash.startswith-4.2.1.tgz", - "integrity": "sha1-xZjErc4YiiflMUVzHNxsDnF3YAw=", + "integrity": "sha512-XClYR1h4/fJ7H+mmCKppbiBmljN/nGs73iq2SjCT9SF4CBPoUHzLvWmH1GtZMhMBZSiRkHXfeA2RY1eIlJ75ww==", "dev": true }, "node_modules/lodash.transform": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.transform/-/lodash.transform-4.6.0.tgz", - "integrity": "sha1-EjBkIvYzJK7YSD0/ODMrX2cFR6A=" + "integrity": "sha1-EjBkIvYzJK7YSD0/ODMrX2cFR6A=", + "optional": true }, "node_modules/log-symbols": { "version": "4.0.0", @@ -15795,18 +16019,6 @@ "node": ">=0.10.0" } }, - "node_modules/map-obj": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.2.1.tgz", - "integrity": "sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/map-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", @@ -15914,170 +16126,6 @@ "node": ">= 0.10.0" } }, - "node_modules/meow": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", - "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", - "dev": true, - "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize": "^1.2.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/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, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/hosted-git-info": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", - "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/meow/node_modules/normalize-package-data": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.2.tgz", - "integrity": "sha512-6CdZocmfGaKnIHPVFhJJZ3GuR8SsLKvDANFp47Jmy51aKIr8akjAWTSxtpI+MBgBFdSMRyo4hMpDlT6dTffgZg==", - "dev": true, - "dependencies": { - "hosted-git-info": "^4.0.1", - "resolve": "^1.20.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/meow/node_modules/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/meow/node_modules/read-pkg/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/merge-source-map": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", @@ -16179,15 +16227,6 @@ "dom-walk": "^0.1.0" } }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/mingo": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/mingo/-/mingo-1.3.3.tgz", @@ -16197,6 +16236,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -16205,22 +16245,11 @@ } }, "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "node_modules/minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "engines": { - "node": ">= 6" + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/mixin-deep": { @@ -16310,16 +16339,16 @@ } }, "node_modules/mocha-junit-reporter": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/mocha-junit-reporter/-/mocha-junit-reporter-2.0.2.tgz", - "integrity": "sha512-vYwWq5hh3v1lG0gdQCBxwNipBfvDiAM1PHroQRNp96+2l72e9wEUTw+mzoK+O0SudgfQ7WvTQZ9Nh3qkAYAjfg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/mocha-junit-reporter/-/mocha-junit-reporter-2.2.0.tgz", + "integrity": "sha512-W83Ddf94nfLiTBl24aS8IVyFvO8aRDLlCvb+cKb/VEaN5dEbcqu3CXiTe8MQK2DvzS7oKE1RsFTxzN302GGbDQ==", "dev": true, "dependencies": { - "debug": "^2.2.0", - "md5": "^2.1.0", - "mkdirp": "~0.5.1", + "debug": "^4.3.4", + "md5": "^2.3.0", + "mkdirp": "~1.0.4", "strip-ansi": "^6.0.1", - "xml": "^1.0.0" + "xml": "^1.0.1" }, "peerDependencies": { "mocha": ">=2.2.5" @@ -16334,33 +16363,6 @@ "node": ">=8" } }, - "node_modules/mocha-junit-reporter/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/mocha-junit-reporter/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mocha-junit-reporter/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, "node_modules/mocha-junit-reporter/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -16374,9 +16376,9 @@ } }, "node_modules/mocha-multi": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/mocha-multi/-/mocha-multi-1.1.6.tgz", - "integrity": "sha512-hMVmd9C1h4PEiFNwHxn8aa5/EgGLg0UswdOrlrq1Y8ieKmot8hZLYaiESIgg/He3E4oxwaXPWT1V1PJ0qNJlUQ==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/mocha-multi/-/mocha-multi-1.1.7.tgz", + "integrity": "sha512-SXZRgHy0XiRTASyOp0p6fjOkdj+R62L6cqutnYyQOvIjNznJuUwzykxctypeRiOwPd+gfn4yt3NRulMQyI8Tzg==", "dev": true, "dependencies": { "debug": "^4.1.1", @@ -16389,7 +16391,7 @@ "node": ">=6.0.0" }, "peerDependencies": { - "mocha": ">=2.2.0 <7 || ^9" + "mocha": ">=2.2.0 <7 || >=9" } }, "node_modules/mocha-multi/node_modules/lodash.once": { @@ -16719,14 +16721,15 @@ "version": "2.29.1", "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==", + "optional": true, "engines": { "node": "*" } }, "node_modules/mongodb": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.13.0.tgz", - "integrity": "sha512-+taZ/bV8d1pYuHL4U+gSwkhmDrwkWbH1l4aah4YpmpscMwgFBkufIKxgP/G7m87/NUuQzc2Z75ZTI7ZOyqZLbw==", + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.14.0.tgz", + "integrity": "sha512-coGKkWXIBczZPr284tYKFLg+KbGPPLlSbdgfKAb6QqCFt5bo5VFZ50O3FFzsw4rnkqjwT6D8Qcoo9nshYKM7Mg==", "dependencies": { "bson": "^4.7.0", "mongodb-connection-string-url": "^2.5.4", @@ -16749,9 +16752,9 @@ } }, "node_modules/mongodb-client-encryption": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/mongodb-client-encryption/-/mongodb-client-encryption-2.3.0.tgz", - "integrity": "sha512-cXuRYBmCj43rLeqP8gHa+CrloFe7TUCd/f16VduFGQzAN9ef5buMGIfSr2CEGBul/EjTCLlioctSSDmHAmpTqA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/mongodb-client-encryption/-/mongodb-client-encryption-2.5.0.tgz", + "integrity": "sha512-et7DSQDhkbioK/G3FYtjML34ylLHmapM2665k7MMWCxSiXBNGovp8wSV4dRvJzXzKMfGvc/A4bJ7EcPSjxLCwg==", "devOptional": true, "hasInstallScript": true, "dependencies": { @@ -16764,7 +16767,13 @@ "node": ">=12.9.0" }, "peerDependencies": { + "@aws-sdk/credential-providers": "^3.186.0", "mongodb": ">=3.4.0" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + } } }, "node_modules/mongodb-client-encryption/node_modules/decompress-response": { @@ -17269,13 +17278,13 @@ } }, "node_modules/mongodb-download-url": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mongodb-download-url/-/mongodb-download-url-1.0.0.tgz", - "integrity": "sha512-bvUE9Wa0P0ZpuazQ7UFHcvE03zdnXePSsntVBngqJQIM5m6JosMeW+nrabMyBvbGqiIsgXL96UF4Bj/FakKrLw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/mongodb-download-url/-/mongodb-download-url-1.3.0.tgz", + "integrity": "sha512-N7mRi3/LIAHCeTa+JtJVrVno4BNHVYF+6/WUamVFsbvCxtljDmQA1n9FSQxV4dfdiknR9zaoFcXAmd1gtg3Elg==", "dev": true, "dependencies": { "debug": "^4.1.1", - "minimist": "^1.2.0", + "minimist": "^1.2.3", "node-fetch": "^2.6.1", "semver": "^7.1.1" }, @@ -17287,6 +17296,7 @@ "version": "1.11.0", "resolved": "https://registry.npmjs.org/mongodb-extended-json/-/mongodb-extended-json-1.11.0.tgz", "integrity": "sha512-+PLUMH7amvTYumCUR6alR474KmqtlmYeceJjsC+zcfdXls9IotfTp2WIuD6X5tO9dLDVCDqboqjgvXj/JjGj6g==", + "optional": true, "dependencies": { "async": "^3.1.0", "bson": "^1.0.1", @@ -17301,12 +17311,14 @@ "node_modules/mongodb-extended-json/node_modules/async": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", - "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==", + "optional": true }, "node_modules/mongodb-extended-json/node_modules/bson": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.5.tgz", "integrity": "sha512-kDuEzldR21lHciPQAIulLs1LZlCXdLziXI6Mb/TDkwXhb//UORJNPXgcRs2CuO4H0DcMkpfT3/ySsP3unoZjBg==", + "optional": true, "engines": { "node": ">=0.6.19" } @@ -17358,19 +17370,20 @@ "integrity": "sha512-pCutlP/AU0hcJ/f1h2h3nmn79/gXrQo6088QvPCbdx7SBDkAeGPH4AYu28DgqZzFvsn5mtt2RUpsFicYhjaHow==" }, "node_modules/mongodb-query-parser": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/mongodb-query-parser/-/mongodb-query-parser-2.4.6.tgz", - "integrity": "sha512-R9uU//1IlhPPIGvB4ItMwus3E7nJJtBtrSrTV6wTslwDQfL6bpy9PXcIXVHdDsuJADQZdcvdvpj22VxdfqH2ig==", + "version": "2.4.10", + "resolved": "https://registry.npmjs.org/mongodb-query-parser/-/mongodb-query-parser-2.4.10.tgz", + "integrity": "sha512-gFv1N184F7oMUINuvmUJBMq+tIy1BiELNRSPGWzabYjySRxvIR2c64MJS0b7pnb0eyfHBzfKoLy2LCrYBDt8Gg==", "dependencies": { - "bson": "^4.6.1", "debug": "^4.1.1", - "ejson-shell-parser": "^1.1.3", + "ejson-shell-parser": "^1.2.1", "is-json": "^2.0.1", "javascript-stringify": "^2.0.1", "lodash": "^4.17.15", "lru-cache": "^5.1.1", - "mongodb-extended-json": "^1.10.2", "mongodb-language-model": "^1.6.1" + }, + "peerDependencies": { + "bson": "^4.6.1 || ^5" } }, "node_modules/mongodb-query-parser/node_modules/lru-cache": { @@ -17395,9 +17408,9 @@ } }, "node_modules/mongodb-runner": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/mongodb-runner/-/mongodb-runner-4.9.0.tgz", - "integrity": "sha512-ltAC7FQ6NJ1XoMc5AJ+sbURsETKJeHd2ulvTpJGH+xO79b44ELCF2yETBzAmiEKTkj3MI2u0Awh0KQhWizgwWw==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/mongodb-runner/-/mongodb-runner-4.10.0.tgz", + "integrity": "sha512-6hE4nA4+LMBPwLMXr/jQNRNtUdQgfmZOJE/4u5JX952hdUa0lPc+26Y45PdgbdMbfCYUfZK1cOBObZOBmTdQ6Q==", "dev": true, "dependencies": { "async": "^3.1.0", @@ -17411,7 +17424,7 @@ "mongodb": "^3.4.0", "mongodb-dbpath": "^0.0.1", "mongodb-tools": "github:mongodb-js/mongodb-tools#0d1a90f49796c41f6d47c7c7999fe384014a16a0", - "mongodb-version-manager": "^1.4.5", + "mongodb-version-manager": "^1.5.0", "untildify": "^4.0.0", "which": "^2.0.1" }, @@ -17637,7 +17650,7 @@ "node_modules/mongodb-version-list": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/mongodb-version-list/-/mongodb-version-list-1.0.0.tgz", - "integrity": "sha1-8lAxz83W8UWx3o/OKk6+wCiLtKQ=", + "integrity": "sha512-F3kIABEMNjg3ZAX4SRbO1QPmhpP4NX2IgJq+lcUKidducTOVJafXJ+E+pMkgpU0xumC8QYbIZJ+8y4GZys9E4g==", "dev": true, "dependencies": { "cheerio": "^0.22.0", @@ -17654,7 +17667,7 @@ "node_modules/mongodb-version-list/node_modules/cheerio": { "version": "0.22.0", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", - "integrity": "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=", + "integrity": "sha512-8/MzidM6G/TgRelkzDG13y3Y9LxBjCb+8yOEZ9+wwq5gVF2w2pV0wmHvjfT0RvuxGyR7UEuK36r+yYMbT4uKgA==", "dev": true, "dependencies": { "css-select": "~1.2.0", @@ -17690,7 +17703,7 @@ "node_modules/mongodb-version-list/node_modules/fs-extra": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", - "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", + "integrity": "sha512-VerQV6vEKuhDWD2HGOybV6v5I73syoc/cXAbKlgTC7M/oFVEtklWlp9QH2Ijw3IaWDOQcMkldSPa7zXy79Z/UQ==", "dev": true, "dependencies": { "graceful-fs": "^4.1.2", @@ -17701,22 +17714,16 @@ "node_modules/mongodb-version-list/node_modules/jsonfile": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", "dev": true, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, - "node_modules/mongodb-version-list/node_modules/lodash.bind": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", - "integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=", - "dev": true - }, "node_modules/mongodb-version-list/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, "node_modules/mongodb-version-list/node_modules/semver": { @@ -17729,9 +17736,9 @@ } }, "node_modules/mongodb-version-manager": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/mongodb-version-manager/-/mongodb-version-manager-1.4.6.tgz", - "integrity": "sha512-UxXZy7iqHUa039Bp8e1Y2tSLh/X/JtHRqnlcVkqNEWpX/5ETPaKwrT7QIVZc1Tk5tEkQXjRHd6nQtUjcemOHmA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/mongodb-version-manager/-/mongodb-version-manager-1.5.0.tgz", + "integrity": "sha512-VHijlQXvQFnX/9MzfGePyBNr9qHLHRHg6sM2ChFO+05Htf6JY50WzvDWZmtXUNGXEor80fXxhswwDJevGlZkyA==", "dev": true, "dependencies": { "ampersand-state": "^5.0.3", @@ -17757,9 +17764,9 @@ } }, "node_modules/mongodb-version-manager/node_modules/async": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", - "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", "dev": true }, "node_modules/mongodb-version-manager/node_modules/chalk": { @@ -17788,7 +17795,7 @@ "node_modules/mongodb-version-manager/node_modules/decompress-response": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", "dev": true, "dependencies": { "mimic-response": "^1.0.0" @@ -17822,7 +17829,7 @@ "node_modules/mongodb-version-manager/node_modules/file-type": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", + "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", "dev": true, "engines": { "node": ">=4" @@ -17845,7 +17852,7 @@ "node_modules/mongodb-version-manager/node_modules/get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", "dev": true, "engines": { "node": ">=4" @@ -17909,7 +17916,7 @@ "node_modules/mongodb-version-manager/node_modules/p-event": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-event/-/p-event-1.3.0.tgz", - "integrity": "sha1-jmtPT2XHK8W2/ii3XtqHT5akoIU=", + "integrity": "sha512-hV1zbA7gwqPVFcapfeATaNjQ3J0NuzorHPyG8GPL9g/Y/TplWVBVoCKCXL6Ej2zscrCEv195QNWJXuBH6XZuzA==", "dev": true, "dependencies": { "p-timeout": "^1.1.1" @@ -17921,7 +17928,7 @@ "node_modules/mongodb-version-manager/node_modules/p-timeout": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", - "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", + "integrity": "sha512-gb0ryzr+K2qFqFv6qi3khoeqMZF/+ajxQipEF6NteZVnvz9tzdsfAVj3lYtn1gAXvH5lfLwfxEII799gt/mRIA==", "dev": true, "dependencies": { "p-finally": "^1.0.0" @@ -17933,7 +17940,7 @@ "node_modules/mongodb-version-manager/node_modules/pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true, "engines": { "node": ">=4" @@ -17942,7 +17949,7 @@ "node_modules/mongodb-version-manager/node_modules/prepend-http": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -17972,7 +17979,7 @@ "node_modules/mongodb-version-manager/node_modules/url-parse-lax": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "integrity": "sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==", "dev": true, "dependencies": { "prepend-http": "^1.0.1" @@ -18139,6 +18146,12 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, "node_modules/natural-orderby": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/natural-orderby/-/natural-orderby-2.0.3.tgz", @@ -18391,7 +18404,7 @@ "node_modules/npm-conf/node_modules/pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true, "engines": { "node": ">=4" @@ -18711,22 +18724,28 @@ } }, "node_modules/object-inspect": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", - "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", - "dev": true + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/object-is": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.4.tgz", - "integrity": "sha512-1ZvAZ4wlF7IyPVOcE1Omikt7UpaFlOQq0HlSti+ZvDH3UiD2brwGMwDbyV43jao2bKJ+4+WdPJHSd7kgzKYVqg==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", + "call-bind": "^1.0.2", "define-properties": "^1.1.3" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object-keys": { @@ -18756,18 +18775,21 @@ } }, "node_modules/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==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.assign/node_modules/object-keys": { @@ -18795,18 +18817,20 @@ } }, "node_modules/object.fromentries": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.3.tgz", - "integrity": "sha512-IDUSMXs6LOSJBWE++L0lzIbSqHl9KDCfff2x/JSEIDtEUavUnyMYC2ZGay/04Zq4UT8lvd4xNhU4/YHKibAOlw==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "has": "^1.0.3" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.pick": { @@ -18822,18 +18846,20 @@ } }, "node_modules/object.values": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.2.tgz", - "integrity": "sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "has": "^1.0.3" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/once": { @@ -19975,9 +20001,9 @@ } }, "node_modules/prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz", + "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==", "dev": true, "bin": { "prettier": "bin-prettier.js" @@ -20047,7 +20073,7 @@ "node_modules/proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", "dev": true }, "node_modules/prr": { @@ -20145,15 +20171,6 @@ } ] }, - "node_modules/quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/raf": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", @@ -20248,9 +20265,9 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/react-redux": { - "version": "7.2.8", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.8.tgz", - "integrity": "sha512-6+uDjhs3PSIclqoCk0kd6iX74gzrGc3W5zcAjbrFgEdIjRSQObdIwfx80unTkVUYvbQ95Y8Av3OvFHq1w5EOUw==", + "version": "7.2.9", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz", + "integrity": "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==", "dependencies": { "@babel/runtime": "^7.15.4", "@types/react-redux": "^7.1.20", @@ -20384,19 +20401,6 @@ "node": ">= 0.10" } }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/redeyed": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", @@ -20407,9 +20411,9 @@ } }, "node_modules/redux": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.0.tgz", - "integrity": "sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", "dependencies": { "@babel/runtime": "^7.9.2" } @@ -20417,7 +20421,7 @@ "node_modules/reflect.ownkeys": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz", - "integrity": "sha1-dJrO7H8/34tj+SegSAnpDFwLNGA=", + "integrity": "sha512-qOLsBKHCpSOFKK1NUOCGC5VyeufB6lEsFe92AL2bhIJsacZS1qdoOZSbPk3MYKuT2cFlRDnulKXuuElIrMjGUg==", "dev": true }, "node_modules/regenerator-runtime": { @@ -20439,47 +20443,20 @@ } }, "node_modules/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.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", "dev": true, "dependencies": { + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" + "functions-have-names": "^1.2.2" }, "engines": { "node": ">= 0.4" - } - }, - "node_modules/regexp.prototype.flags/node_modules/es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", - "dev": true, - "dependencies": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/regexp.prototype.flags/node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/regexpp": { @@ -20873,6 +20850,20 @@ "ret": "~0.1.10" } }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -21166,9 +21157,9 @@ } }, "node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -21279,13 +21270,17 @@ "optional": true }, "node_modules/side-channel": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.3.tgz", - "integrity": "sha512-A6+ByhlLkksFoUepsGxfj5x1gTSrs+OydsRptUxeNCabQpCFUvcwIczgOigI8vhY/OJCnPnyE9rGiwgvr9cS1g==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", "dev": true, "dependencies": { - "es-abstract": "^1.18.0-next.0", - "object-inspect": "^1.8.0" + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/sift": { @@ -22084,23 +22079,31 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", - "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", - "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/strip-ansi": { @@ -22160,18 +22163,6 @@ "node": ">=6" } }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -22780,15 +22771,6 @@ "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", "dev": true }, - "node_modules/trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/trim-repeated": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", @@ -22836,9 +22818,9 @@ "dev": true }, "node_modules/ts-loader": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.1.tgz", - "integrity": "sha512-384TYAqGs70rn9F0VBnh6BPTfhga7yFNdC5gXbQpDrBj9/KsT4iRkGqKXhziofHOlE2j6YEaiTYVGKKvPhGWvw==", + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.2.tgz", + "integrity": "sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==", "dev": true, "dependencies": { "chalk": "^4.1.0", @@ -23014,6 +22996,20 @@ "node": ">=8" } }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typed-rest-client": { "version": "1.8.4", "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.4.tgz", @@ -23040,9 +23036,9 @@ } }, "node_modules/typescript": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", - "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==", + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -23058,6 +23054,21 @@ "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", "dev": true }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/unbzip2-stream": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", @@ -23366,55 +23377,74 @@ } }, "node_modules/vscode-jsonrpc": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.0.2.tgz", - "integrity": "sha512-RY7HwI/ydoC1Wwg4gJ3y6LpU9FJRZAUnTYMXthqhFXXu77ErDd/xkREpGuk4MyYkk4a+XDWAMqe0S3KkelYQEQ==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.1.0.tgz", + "integrity": "sha512-6TDy/abTQk+zDGYazgbIPc+4JoXdwC8NHU9Pbn4UJP1fehUyZmM4RHp5IthX7A6L5KS30PRui+j+tbbMMMafdw==", "engines": { "node": ">=14.0.0" } }, "node_modules/vscode-languageclient": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-8.0.2.tgz", - "integrity": "sha512-lHlthJtphG9gibGb/y72CKqQUxwPsMXijJVpHEC2bvbFqxmkj9LwQ3aGU9dwjBLqsX1S4KjShYppLvg1UJDF/Q==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-8.1.0.tgz", + "integrity": "sha512-GL4QdbYUF/XxQlAsvYWZRV3V34kOkpRlvV60/72ghHfsYFnS/v2MANZ9P6sHmxFcZKOse8O+L9G7Czg0NUWing==", "dependencies": { - "minimatch": "^3.0.4", - "semver": "^7.3.5", - "vscode-languageserver-protocol": "3.17.2" + "minimatch": "^5.1.0", + "semver": "^7.3.7", + "vscode-languageserver-protocol": "3.17.3" }, "engines": { "vscode": "^1.67.0" } }, + "node_modules/vscode-languageclient/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/vscode-languageclient/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/vscode-languageserver": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-8.0.2.tgz", - "integrity": "sha512-bpEt2ggPxKzsAOZlXmCJ50bV7VrxwCS5BI4+egUmure/oI/t4OlFzi/YNtVvY24A2UDOZAgwFGgnZPwqSJubkA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-8.1.0.tgz", + "integrity": "sha512-eUt8f1z2N2IEUDBsKaNapkz7jl5QpskN2Y0G01T/ItMxBxw1fJwvtySGB9QMecatne8jFIWJGWI61dWjyTLQsw==", "dependencies": { - "vscode-languageserver-protocol": "3.17.2" + "vscode-languageserver-protocol": "3.17.3" }, "bin": { "installServerIntoExtension": "bin/installServerIntoExtension" } }, "node_modules/vscode-languageserver-protocol": { - "version": "3.17.2", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.2.tgz", - "integrity": "sha512-8kYisQ3z/SQ2kyjlNeQxbkkTNmVFoQCqkmGrzLH6A9ecPlgTbp3wDTnUNqaUxYr4vlAcloxx8zwy7G5WdguYNg==", + "version": "3.17.3", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.3.tgz", + "integrity": "sha512-924/h0AqsMtA5yK22GgMtCYiMdCOtWTSGgUOkgEDX+wk2b0x4sAfLiO4NxBxqbiVtz7K7/1/RgVrVI0NClZwqA==", "dependencies": { - "vscode-jsonrpc": "8.0.2", - "vscode-languageserver-types": "3.17.2" + "vscode-jsonrpc": "8.1.0", + "vscode-languageserver-types": "3.17.3" } }, "node_modules/vscode-languageserver-textdocument": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.7.tgz", - "integrity": "sha512-bFJH7UQxlXT8kKeyiyu41r22jCZXG8kuuVVA33OEJn1diWOZK5n8zBSPZFHVBOu8kXZ6h0LIRhf5UnCo61J4Hg==" + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.9.tgz", + "integrity": "sha512-NPfHVGFW2/fQEWHspr8x3PXhRgtFbuDZdl7p6ifuN3M7nk2Yjf5POr/NfDBuAiQG88DehDyJ7nGOT+p+edEtbw==" }, "node_modules/vscode-languageserver-types": { - "version": "3.17.2", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.2.tgz", - "integrity": "sha512-zHhCWatviizPIq9B7Vh9uvrH6x3sK8itC84HkamnBWoDFJtzBf7SWlpLCZUit72b3os45h6RWQNC9xHRDF8dRA==" + "version": "3.17.3", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.3.tgz", + "integrity": "sha512-SYU4z1dL0PyIMd4Vj8YOqFvHu7Hz/enbWtpfnVbJHU4Nd1YNYx8u0ennumc6h48GQNeOLxmwySmnADouT/AuZA==" }, "node_modules/w3c-hr-time": { "version": "1.0.2", @@ -23484,9 +23514,9 @@ } }, "node_modules/webpack": { - "version": "5.74.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", - "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", + "version": "5.75.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz", + "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -23712,11 +23742,47 @@ "node": ">= 8" } }, + "node_modules/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, + "dependencies": { + "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" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/which-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" }, + "node_modules/which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/wide-align": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", @@ -25591,13 +25657,25 @@ } }, "@babel/generator": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.0.tgz", - "integrity": "sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg==", + "version": "7.21.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.1.tgz", + "integrity": "sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==", "requires": { - "@babel/types": "^7.19.0", + "@babel/types": "^7.21.0", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" + }, + "dependencies": { + "@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + } } }, "@babel/helper-compilation-targets": { @@ -25624,12 +25702,12 @@ "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==" }, "@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", + "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", "requires": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" + "@babel/template": "^7.20.7", + "@babel/types": "^7.21.0" } }, "@babel/helper-hoist-variables": { @@ -25685,9 +25763,9 @@ } }, "@babel/helper-string-parser": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", - "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==" + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==" }, "@babel/helper-validator-identifier": { "version": "7.19.1", @@ -25740,9 +25818,9 @@ } }, "@babel/parser": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.1.tgz", - "integrity": "sha512-h7RCSorm1DdTVGJf3P2Mhj3kdnkmF/EiysUkzS2TdgAYqyjFdMQJbVuXOBej2SBJaXan/lIVtT6KkGbyyq753A==" + "version": "7.21.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.1.tgz", + "integrity": "sha512-JzhBFpkuhBNYUY7qs+wTzNmyCWUHEaAFpQQD2YfU1rPL38/L43Wvid0fFkiOCnHvsGncRZgEPyGnltABLcVDTg==" }, "@babel/plugin-syntax-async-generators": { "version": "7.8.4", @@ -25893,39 +25971,39 @@ } }, "@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", "requires": { "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" } }, "@babel/traverse": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.1.tgz", - "integrity": "sha512-0j/ZfZMxKukDaag2PtOPDbwuELqIar6lLskVPPJDjXMXjfLb1Obo/1yjxIGqqAJrmfaTIY3z2wFLAQ7qSkLsuA==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.0.tgz", + "integrity": "sha512-Xdt2P1H4LKTO8ApPfnO1KmzYMFpp7D/EinoXzLYN/cHcBNrVCAkAtGUcXnHXrl/VGktureU6fkQrHSBE2URfoA==", "requires": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.0", + "@babel/generator": "^7.21.0", "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", + "@babel/helper-function-name": "^7.21.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.19.1", - "@babel/types": "^7.19.0", + "@babel/parser": "^7.21.0", + "@babel/types": "^7.21.0", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", - "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.0.tgz", + "integrity": "sha512-uR7NWq2VNFnDi7EYqiRz2Jv/VQIu38tu64Zy8TX2nQFQ6etJ9V/Rr2msW8BS132mum2rL645qpDrLtAJtVpuow==", "requires": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" } }, @@ -26083,15 +26161,15 @@ "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" }, "@eslint/eslintrc": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.2.tgz", - "integrity": "sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", + "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.4.0", - "globals": "^13.15.0", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -26106,18 +26184,18 @@ "dev": true }, "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "dev": true, "requires": { "type-fest": "^0.20.2" } }, "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true }, "js-yaml": { @@ -26147,24 +26225,24 @@ } }, "@fortawesome/fontawesome-common-types": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.2.0.tgz", - "integrity": "sha512-rBevIsj2nclStJ7AxTdfsa3ovHb1H+qApwrxcTVo+NNdeJiB9V75hsKfrkG5AwNcRUNxrPPiScGYCNmLMoh8pg==" + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.3.0.tgz", + "integrity": "sha512-4BC1NMoacEBzSXRwKjZ/X/gmnbp/HU5Qqat7E8xqorUtBFZS+bwfGH5/wqOC2K6GV0rgEobp3OjGRMa5fK9pFg==" }, "@fortawesome/fontawesome-svg-core": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.2.0.tgz", - "integrity": "sha512-Cf2mAAeMWFMzpLC7Y9H1I4o3wEU+XovVJhTiNG8ZNgSQj53yl7OCJaS80K4YjrABWZzbAHVaoHE1dVJ27AAYXw==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.3.0.tgz", + "integrity": "sha512-uz9YifyKlixV6AcKlOX8WNdtF7l6nakGyLYxYaCa823bEBqyj/U2ssqtctO38itNEwXb8/lMzjdoJ+aaJuOdrw==", "requires": { - "@fortawesome/fontawesome-common-types": "6.2.0" + "@fortawesome/fontawesome-common-types": "6.3.0" } }, "@fortawesome/free-solid-svg-icons": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.2.0.tgz", - "integrity": "sha512-UjCILHIQ4I8cN46EiQn0CZL/h8AwCGgR//1c4R96Q5viSRwuKVo0NdQEc4bm+69ZwC0dUvjbDqAHF1RR5FA3XA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.3.0.tgz", + "integrity": "sha512-x5tMwzF2lTH8pyv8yeZRodItP2IVlzzmBuD1M7BjawWgg9XAvktqJJ91Qjgoaf8qJpHQ8FEU9VxRfOkLhh86QA==", "requires": { - "@fortawesome/fontawesome-common-types": "6.2.0" + "@fortawesome/fontawesome-common-types": "6.3.0" } }, "@fortawesome/react-fontawesome": { @@ -26176,22 +26254,27 @@ } }, "@humanwhocodes/config-array": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", - "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", - "minimatch": "^3.0.4" + "minimatch": "^3.0.5" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } } }, - "@humanwhocodes/gitignore-to-minimatch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", - "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", - "dev": true - }, "@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -26205,9 +26288,9 @@ "dev": true }, "@iconify-icons/codicon": { - "version": "1.2.16", - "resolved": "https://registry.npmjs.org/@iconify-icons/codicon/-/codicon-1.2.16.tgz", - "integrity": "sha512-85rBsFEhhq2qSBfIEF0hzUk31i4GjeRzNyd0DZGFWo5v+PgAeTBiv8ftsTDf8d2fxy9F5kesT/R7bOtRy1xKmw==", + "version": "1.2.21", + "resolved": "https://registry.npmjs.org/@iconify-icons/codicon/-/codicon-1.2.21.tgz", + "integrity": "sha512-thIa+5jVVVSz048cSQQpQfnXU+zfQjxF3ofmkZHN+7fc6cHclKRxPPXSeVj7dHZzpgQx4pbijHPIUzIni+Pegw==", "requires": { "@iconify/types": "*" } @@ -26754,9 +26837,9 @@ } }, "@jridgewell/resolve-uri": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", - "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" }, "@jridgewell/set-array": { "version": "1.1.2", @@ -26774,9 +26857,9 @@ } }, "@jridgewell/sourcemap-codec": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", - "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==" + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" }, "@jridgewell/trace-mapping": { "version": "0.3.9", @@ -26847,14 +26930,14 @@ } }, "@leafygreen-ui/logo": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@leafygreen-ui/logo/-/logo-6.1.3.tgz", - "integrity": "sha512-b0UfZ6ypwRenw8DxhbwDd3B0JiSdTHCsTE8yQ2wBqQgTazIlz9WoFEjCrSaVv/oZ3XQnY4CBUjEfYGQ8aVOjTA==" + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@leafygreen-ui/logo/-/logo-6.3.0.tgz", + "integrity": "sha512-hxAevbD/wfOjobRp7rVhqPyV/oFRUgwLuUdPn+JG1cBT/ALIeqz7fRz4jE6SyNc3ZXSWvphw/zHaKQSExVcXQQ==" }, "@leafygreen-ui/palette": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@leafygreen-ui/palette/-/palette-3.4.2.tgz", - "integrity": "sha512-uR+fPOlU2Hyg1gHb4iFDtZE1SRmuj591apZpHYwAJ3JF1oqHmHVUZy9XTGN+V1Y299FGWsKrCU7OJxS7bg3nDg==" + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/@leafygreen-ui/palette/-/palette-3.4.7.tgz", + "integrity": "sha512-AsvPlbvF7CERiZbAQR8hy3lAJ2/rieXI3cO0jsOwV8ztDqYNotKAdLujyr/NviudrRUenYiXrLizIKVlSPUMuA==" }, "@leafygreen-ui/toggle": { "version": "7.0.5", @@ -26896,9 +26979,9 @@ } }, "@mongodb-js/mongodb-constants": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@mongodb-js/mongodb-constants/-/mongodb-constants-0.2.1.tgz", - "integrity": "sha512-arCTQYvK9scQszbQQcPba7Ru5HYrc8YINcGcM4HKMCcg+8A17U+3Y3AEI7N/oe2VE+1GFsrh8MoKBch4jEvY1g==" + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@mongodb-js/mongodb-constants/-/mongodb-constants-0.2.2.tgz", + "integrity": "sha512-vm1G+/WRWmXGyE9ZnhDv9toe+LRu1x0F/lGEwqWESfBiUUUuVZhj25fS2o4IL7H4pJ31sFxr7/gu+ER8OkmtzA==" }, "@mongodb-js/prettier-config-compass": { "version": "1.0.0", @@ -27453,18 +27536,18 @@ "dev": true }, "@types/analytics-node": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/@types/analytics-node/-/analytics-node-3.1.9.tgz", - "integrity": "sha512-C7L7/Dd/CmBST7AvgoCnf4yI9h6W5aYfCOcfUZS5GHlXDQjnXLVOUDpTdwTIZjW4lKECeil6+G+Ul6Xzwv/P0g==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@types/analytics-node/-/analytics-node-3.1.10.tgz", + "integrity": "sha512-dvn8iy2EQZDlQGgRNT9SW2Ljn9L3VgwcrpJvonufnNygZWB1XEufXNvDhUtwNUqNyHhD0hbDCCFb9j+B7vE5cA==", "dev": true }, "@types/babel__core": { - "version": "7.1.19", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", - "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", + "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" @@ -27488,9 +27571,9 @@ } }, "@types/babel__traverse": { - "version": "7.18.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.1.tgz", - "integrity": "sha512-FSdLaZh2UxaMuLp9lixWaHq/golWTRWOnRsAXzDTDSDOQLuZb1nsdCt6pJSPWSEQt2eFZ2YVk3oYhn+1kLMeMA==", + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", + "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", "requires": { "@babel/types": "^7.3.0" } @@ -27502,9 +27585,9 @@ "dev": true }, "@types/chai": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.3.tgz", - "integrity": "sha512-hC7OMnszpxhZPduX+m+nrx+uFoLkWOMiR4oa/AZF3MuSETYTZmFfJAHqZEM8MVlvfG7BEUcgvtwoCTxBp6hm3g==" + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==" }, "@types/chai-fs": { "version": "2.0.2", @@ -27734,12 +27817,6 @@ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", "dev": true }, - "@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true - }, "@types/mocha": { "version": "8.2.3", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.3.tgz", @@ -27753,9 +27830,9 @@ "dev": true }, "@types/node": { - "version": "14.18.29", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.29.tgz", - "integrity": "sha512-LhF+9fbIX4iPzhsRLpK5H7iPdvW8L4IwGciXQIOEcuF62+9nw/VQVsOViAOOGxY3OlOKGLFv0sWwJXdwQeTn6A==" + "version": "14.18.36", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.36.tgz", + "integrity": "sha512-FXKWbsJ6a1hIrRxv+FoukuHnGTgEzKYGi7kilfMae96AL9UNkPFNWJEEYWzdRI9ooIkbr4AKldyuSTLql06vLQ==" }, "@types/normalize-package-data": { "version": "2.4.0", @@ -27814,6 +27891,12 @@ "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" }, + "@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "dev": true + }, "@types/sinon": { "version": "9.0.11", "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-9.0.11.tgz", @@ -27881,16 +27964,18 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.38.0.tgz", - "integrity": "sha512-GgHi/GNuUbTOeoJiEANi0oI6fF3gBQc3bGFYj40nnAPCbhrtEDf2rjBmefFadweBmO1Du1YovHeDP2h5JLhtTQ==", + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.53.0.tgz", + "integrity": "sha512-alFpFWNucPLdUOySmXCJpzr6HKC3bu7XooShWM+3w/EL6J2HIoB2PFxpLnq4JauWVk6DiVeNKzQlFEaE+X9sGw==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.38.0", - "@typescript-eslint/type-utils": "5.38.0", - "@typescript-eslint/utils": "5.38.0", + "@typescript-eslint/scope-manager": "5.53.0", + "@typescript-eslint/type-utils": "5.53.0", + "@typescript-eslint/utils": "5.53.0", "debug": "^4.3.4", + "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", "regexpp": "^3.2.0", "semver": "^7.3.7", "tsutils": "^3.21.0" @@ -27905,53 +27990,53 @@ } }, "@typescript-eslint/parser": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.38.0.tgz", - "integrity": "sha512-/F63giJGLDr0ms1Cr8utDAxP2SPiglaD6V+pCOcG35P2jCqdfR7uuEhz1GIC3oy4hkUF8xA1XSXmd9hOh/a5EA==", + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.53.0.tgz", + "integrity": "sha512-MKBw9i0DLYlmdOb3Oq/526+al20AJZpANdT6Ct9ffxcV8nKCHz63t/S0IhlTFNsBIHJv+GY5SFJ0XfqVeydQrQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.38.0", - "@typescript-eslint/types": "5.38.0", - "@typescript-eslint/typescript-estree": "5.38.0", + "@typescript-eslint/scope-manager": "5.53.0", + "@typescript-eslint/types": "5.53.0", + "@typescript-eslint/typescript-estree": "5.53.0", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.38.0.tgz", - "integrity": "sha512-ByhHIuNyKD9giwkkLqzezZ9y5bALW8VNY6xXcP+VxoH4JBDKjU5WNnsiD4HJdglHECdV+lyaxhvQjTUbRboiTA==", + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.53.0.tgz", + "integrity": "sha512-Opy3dqNsp/9kBBeCPhkCNR7fmdSQqA+47r21hr9a14Bx0xnkElEQmhoHga+VoaoQ6uDHjDKmQPIYcUcKJifS7w==", "dev": true, "requires": { - "@typescript-eslint/types": "5.38.0", - "@typescript-eslint/visitor-keys": "5.38.0" + "@typescript-eslint/types": "5.53.0", + "@typescript-eslint/visitor-keys": "5.53.0" } }, "@typescript-eslint/type-utils": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.38.0.tgz", - "integrity": "sha512-iZq5USgybUcj/lfnbuelJ0j3K9dbs1I3RICAJY9NZZpDgBYXmuUlYQGzftpQA9wC8cKgtS6DASTvF3HrXwwozA==", + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.53.0.tgz", + "integrity": "sha512-HO2hh0fmtqNLzTAme/KnND5uFNwbsdYhCZghK2SoxGp3Ifn2emv+hi0PBUjzzSh0dstUIFqOj3bp0AwQlK4OWw==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.38.0", - "@typescript-eslint/utils": "5.38.0", + "@typescript-eslint/typescript-estree": "5.53.0", + "@typescript-eslint/utils": "5.53.0", "debug": "^4.3.4", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.38.0.tgz", - "integrity": "sha512-HHu4yMjJ7i3Cb+8NUuRCdOGu2VMkfmKyIJsOr9PfkBVYLYrtMCK/Ap50Rpov+iKpxDTfnqvDbuPLgBE5FwUNfA==", + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.53.0.tgz", + "integrity": "sha512-5kcDL9ZUIP756K6+QOAfPkigJmCPHcLN7Zjdz76lQWWDdzfOhZDTj1irs6gPBKiXx5/6O3L0+AvupAut3z7D2A==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.38.0.tgz", - "integrity": "sha512-6P0RuphkR+UuV7Avv7MU3hFoWaGcrgOdi8eTe1NwhMp2/GjUJoODBTRWzlHpZh6lFOaPmSvgxGlROa0Sg5Zbyg==", + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.53.0.tgz", + "integrity": "sha512-eKmipH7QyScpHSkhbptBBYh9v8FxtngLquq292YTEQ1pxVs39yFBlLC1xeIZcPPz1RWGqb7YgERJRGkjw8ZV7w==", "dev": true, "requires": { - "@typescript-eslint/types": "5.38.0", - "@typescript-eslint/visitor-keys": "5.38.0", + "@typescript-eslint/types": "5.53.0", + "@typescript-eslint/visitor-keys": "5.53.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -27960,26 +28045,28 @@ } }, "@typescript-eslint/utils": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.38.0.tgz", - "integrity": "sha512-6sdeYaBgk9Fh7N2unEXGz+D+som2QCQGPAf1SxrkEr+Z32gMreQ0rparXTNGRRfYUWk/JzbGdcM8NSSd6oqnTA==", + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.53.0.tgz", + "integrity": "sha512-VUOOtPv27UNWLxFwQK/8+7kvxVC+hPHNsJjzlJyotlaHjLSIgOCKj9I0DBUjwOOA64qjBwx5afAPjksqOxMO0g==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.38.0", - "@typescript-eslint/types": "5.38.0", - "@typescript-eslint/typescript-estree": "5.38.0", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.53.0", + "@typescript-eslint/types": "5.53.0", + "@typescript-eslint/typescript-estree": "5.53.0", "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" } }, "@typescript-eslint/visitor-keys": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.38.0.tgz", - "integrity": "sha512-MxnrdIyArnTi+XyFLR+kt/uNAcdOnmT+879os7qDRI+EYySR4crXJq9BXPfRzzLGq0wgxkwidrCJ9WCAoacm1w==", + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.53.0.tgz", + "integrity": "sha512-JqNLnX3leaHFZEN0gCh81sIvgrp/2GOACZNgO4+Tkf64u51kTpAyWFOY8XHx8XuXr3N2C9zgPPHtcpMg6z1g0w==", "dev": true, "requires": { - "@typescript-eslint/types": "5.38.0", + "@typescript-eslint/types": "5.53.0", "eslint-visitor-keys": "^3.3.0" }, "dependencies": { @@ -27998,9 +28085,9 @@ "dev": true }, "@vscode/test-electron": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.1.5.tgz", - "integrity": "sha512-O/ioqFpV+RvKbRykX2ItYPnbcZ4Hk5V0rY4uhQjQTLhGL9WZUvS7exzuYQCCI+ilSqJpctvxq2llTfGXf9UnnA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.2.3.tgz", + "integrity": "sha512-7DmdGYQTqRNaLHKG3j56buc9DkstriY4aV0S3Zj32u0U9/T0L8vwWAC9QGCh1meu1VXDEla1ze27TkqysHGP0Q==", "dev": true, "requires": { "http-proxy-agent": "^4.0.1", @@ -28611,7 +28698,7 @@ "ansi": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz", - "integrity": "sha1-DELU+xcWDVqa8eSEus4cZpIsGyE=", + "integrity": "sha512-iFY7JCgHbepc0b82yLaw4IMortylNb6wG4kL+4R0C3iv6i+RHGHux/yUX5BTiRvSX/shMnngjR1YyNMnXEFh5A==", "dev": true }, "ansi-colors": { @@ -28817,40 +28904,15 @@ "dev": true }, "array.prototype.find": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.1.1.tgz", - "integrity": "sha512-mi+MYNJYLTx2eNYy+Yh6raoQacCsNeeMUaspFPh9Y141lFSsWxxB8V9mM2ye+eqiRs917J6/pJ4M9ZPzenWckA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.2.1.tgz", + "integrity": "sha512-I2ri5Z9uMpMvnsNrHre9l3PaX+z9D0/z6F7Yt2u15q7wt0I62g5kX6xUKR1SJiefgG+u2/gJUmM8B47XRvQR6w==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.4" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", - "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.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - } + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" } }, "array.prototype.flat": { @@ -28876,12 +28938,6 @@ "function-bind": "^1.1.1" } }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", @@ -28953,6 +29009,12 @@ "postcss-value-parser": "^4.1.0" } }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true + }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -29385,13 +29447,12 @@ } }, "bson-transpilers": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bson-transpilers/-/bson-transpilers-2.0.0.tgz", - "integrity": "sha512-gHd/NCuZsbn+61uh1pDxI0dQxxkkq9SqsSc8hWN1Lwvu2dbnDLcPfBDaL3meYxb/sTDg+5drETbqgMwNsWg1vw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bson-transpilers/-/bson-transpilers-2.0.2.tgz", + "integrity": "sha512-FmY2vXr54rEcftux3/gspJ9RivX/kPz4O5XdAVuL2OxqYowXcDro+SETnMq5gWIy613o3DPLdGuAalDADOMHSQ==", "requires": { "antlr4": "4.7.2", "bson": "^4.4.1", - "context-eval": "^0.1.0", "js-yaml": "^3.13.1" } }, @@ -29497,13 +29558,13 @@ } }, "call-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz", - "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dev": true, "requires": { "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.0" + "get-intrinsic": "^1.0.2" } }, "call-me-maybe": { @@ -29549,17 +29610,6 @@ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "devOptional": true }, - "camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - } - }, "caniuse-lite": { "version": "1.0.30001312", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz", @@ -29602,14 +29652,14 @@ } }, "chai": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", - "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", "dev": true, "requires": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", - "deep-eql": "^3.0.1", + "deep-eql": "^4.1.2", "get-func-name": "^2.0.0", "loupe": "^2.3.1", "pathval": "^1.1.1", @@ -30366,9 +30416,9 @@ } }, "config-chain": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", - "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", "dev": true, "requires": { "ini": "^1.3.4", @@ -30412,11 +30462,6 @@ "safe-buffer": "5.1.2" } }, - "context-eval": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/context-eval/-/context-eval-0.1.0.tgz", - "integrity": "sha1-P8pxfX3wI6l4XwjGWkGJo93wP6s=" - }, "context-map-webpack-plugin": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/context-map-webpack-plugin/-/context-map-webpack-plugin-0.1.0.tgz", @@ -30534,7 +30579,7 @@ "css-select": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "integrity": "sha512-dUQOBoqdR7QwV90WysXPLXG5LO7nhYBgiWVfxF80DKPF8zx1t/pUd2FYy73emg3zrjtM6dzmYgbHKfV2rxiHQA==", "dev": true, "requires": { "boolbase": "~1.0.0", @@ -30629,24 +30674,6 @@ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, - "decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "dev": true, - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - } - } - }, "decimal.js": { "version": "10.2.1", "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", @@ -30853,9 +30880,9 @@ } }, "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", "dev": true, "requires": { "type-detect": "^4.0.0" @@ -30896,12 +30923,13 @@ } }, "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "dev": true, "requires": { - "object-keys": "^1.0.12" + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "dependencies": { "object-keys": { @@ -31184,7 +31212,7 @@ "docopt": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/docopt/-/docopt-0.6.2.tgz", - "integrity": "sha1-so6eIiDaXsSffqW7JKR3h0Be6xE=", + "integrity": "sha512-NqTbaYeE4gA/wU1hdKFdU+AFahpDOpgGLzHP42k6H6DKExJd0A55KEVWYhL9FEmHmgeLvEU2vuKXDuU+4yToOw==", "dev": true }, "doctrine": { @@ -31246,7 +31274,7 @@ "domutils": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "integrity": "sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==", "dev": true, "requires": { "dom-serializer": "0", @@ -31254,14 +31282,14 @@ } }, "dotenv": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.2.tgz", - "integrity": "sha512-JvpYKUmzQhYoIFgK2MOnF3bciIZoItIIoryihy0rIA+H4Jy0FmgyKYAHCTN98P5ybGSJcIFbh6QKeJdtZd1qhA==" + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==" }, "downcache": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/downcache/-/downcache-0.0.9.tgz", - "integrity": "sha1-eQuwQkaJE2EVzpPyqhWUbG2AbQ4=", + "integrity": "sha512-AssoVsNYu5DnPY0Ro67lkbiAr66sk5IHuiIGm3pzFzWmTzkcEoFjDlG8szzP4x+ZN2OHehKTZbwDrC7l2Q52+g==", "dev": true, "requires": { "extend": "^3.0.0", @@ -31276,7 +31304,7 @@ "gauge": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.7.tgz", - "integrity": "sha1-6c7FSD09TuDvRLYKfZnkk14TbZM=", + "integrity": "sha512-fVbU2wRE91yDvKUnrIaQlHKAWKY5e08PmztCrwuH5YVQ+Z/p3d0ny2T48o6uvAAXHIUnfaQdHkmxYbQft1eHVA==", "dev": true, "requires": { "ansi": "^0.3.0", @@ -31287,18 +31315,18 @@ } }, "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "requires": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" } }, "npmlog": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-2.0.4.tgz", - "integrity": "sha1-mLUlMPJRTKkNCexbIsiEZyI3VpI=", + "integrity": "sha512-DaL6RTb8Qh4tMe2ttPT1qWccETy2Vi5/8p+htMpLBeXJTr2CAqnF5WQtSP2eFpvaNbhLZ5uilDb98mRm4Q+lZQ==", "dev": true, "requires": { "ansi": "~0.3.1", @@ -31418,17 +31446,17 @@ } }, "ejson-shell-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ejson-shell-parser/-/ejson-shell-parser-1.2.0.tgz", - "integrity": "sha512-2DbCot5/HYcO6kY91nLU5I0CKLTuK9LiKiwaY7OFvfqf3xVgYAvUiLAQKHKeqUFlIUXY3KwRtXfaF5Vic6R1dA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ejson-shell-parser/-/ejson-shell-parser-1.2.1.tgz", + "integrity": "sha512-xXRwH+O4EtL62ue8EmY8vNVr/AGRbRIv76WNuhXoWWwcT5TAvGKe4AqJh46QNXisVZe5e1JxvBdTnD3SO8ZLzA==", "requires": { "acorn": "^8.1.0" }, "dependencies": { "acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==" + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==" } } }, @@ -31530,17 +31558,17 @@ } }, "enzyme-adapter-react-16": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.15.6.tgz", - "integrity": "sha512-yFlVJCXh8T+mcQo8M6my9sPgeGzj85HSHi6Apgf1Cvq/7EL/J9+1JoJmJsRxZgyTvPMAqOEpRSu/Ii/ZpyOk0g==", + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.15.7.tgz", + "integrity": "sha512-LtjKgvlTc/H7adyQcj+aq0P0H07LDL480WQl1gU512IUyaDo/sbOaNDdZsJXYW2XaoPqrLLE9KbZS+X2z6BASw==", "dev": true, "requires": { - "enzyme-adapter-utils": "^1.14.0", - "enzyme-shallow-equal": "^1.0.4", + "enzyme-adapter-utils": "^1.14.1", + "enzyme-shallow-equal": "^1.0.5", "has": "^1.0.3", - "object.assign": "^4.1.2", - "object.values": "^1.1.2", - "prop-types": "^15.7.2", + "object.assign": "^4.1.4", + "object.values": "^1.1.5", + "prop-types": "^15.8.1", "react-is": "^16.13.1", "react-test-renderer": "^16.0.0-0", "semver": "^5.7.0" @@ -31555,17 +31583,17 @@ } }, "enzyme-adapter-utils": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.14.0.tgz", - "integrity": "sha512-F/z/7SeLt+reKFcb7597IThpDp0bmzcH1E9Oabqv+o01cID2/YInlqHbFl7HzWBl4h3OdZYedtwNDOmSKkk0bg==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.14.1.tgz", + "integrity": "sha512-JZgMPF1QOI7IzBj24EZoDpaeG/p8Os7WeBZWTJydpsH7JRStc7jYbHE4CmNQaLqazaGFyLM8ALWA3IIZvxW3PQ==", "dev": true, "requires": { "airbnb-prop-types": "^2.16.0", - "function.prototype.name": "^1.1.3", + "function.prototype.name": "^1.1.5", "has": "^1.0.3", - "object.assign": "^4.1.2", - "object.fromentries": "^2.0.3", - "prop-types": "^15.7.2", + "object.assign": "^4.1.4", + "object.fromentries": "^2.0.5", + "prop-types": "^15.8.1", "semver": "^5.7.1" }, "dependencies": { @@ -31578,13 +31606,13 @@ } }, "enzyme-shallow-equal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.4.tgz", - "integrity": "sha512-MttIwB8kKxypwHvRynuC3ahyNc+cFbR8mjVIltnmzQ0uKGqmsfO4bfBuLxb0beLNPhjblUEYvEbsg+VSygvF1Q==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.5.tgz", + "integrity": "sha512-i6cwm7hN630JXenxxJFBKzgLC3hMTafFQXflvzHgPmDhOBhxUWDe8AeRv1qp2/uWJ2Y8z5yLWMzmAfkTOiOCZg==", "dev": true, "requires": { "has": "^1.0.3", - "object-is": "^1.1.2" + "object-is": "^1.1.5" } }, "errno": { @@ -31605,23 +31633,44 @@ } }, "es-abstract": { - "version": "1.18.0-next.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", - "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", + "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", "dev": true, "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.3", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-negative-zero": "^2.0.0", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.4", + "is-array-buffer": "^3.0.1", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.2", "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" }, "dependencies": { "object-keys": { @@ -31638,6 +31687,26 @@ "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", "dev": true }, + "es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + } + }, + "es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, "es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -31779,15 +31848,15 @@ } }, "eslint": { - "version": "8.23.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.1.tgz", - "integrity": "sha512-w7C1IXCc6fNqjpuYd0yPlcTKKmHlHHktRkzmBPZ+7cvNBQuiNjx0xaMTjAJGCafJhQkrFJooREv0CtrVzmHwqg==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.34.0.tgz", + "integrity": "sha512-1Z8iFsucw+7kSqXNZVslXS8Ioa4u2KM7GPwuKtkTFAqZ/cHMcEaR+1+Br0wLlot49cNxIiZk5wp8EAbPcYZxTg==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.3.2", - "@humanwhocodes/config-array": "^0.10.4", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", + "@eslint/eslintrc": "^1.4.1", + "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -31803,14 +31872,14 @@ "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", - "glob-parent": "^6.0.1", - "globals": "^13.15.0", - "globby": "^11.1.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", @@ -31910,9 +31979,9 @@ } }, "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -32425,9 +32494,9 @@ "dev": true }, "espree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", - "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", + "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", "dev": true, "requires": { "acorn": "^8.8.0", @@ -32436,9 +32505,9 @@ }, "dependencies": { "acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", "dev": true }, "eslint-visitor-keys": { @@ -33110,6 +33179,15 @@ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.5.tgz", "integrity": "sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA==" }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -33253,15 +33331,15 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "function.prototype.name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.3.tgz", - "integrity": "sha512-H51qkbNSp8mtkJt+nyW1gyStBiKZxfRqySNUR99ylq6BPXHKI4SEvIlTKp4odLfjRKJV04DFWMU3G/YRlQOsag==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", "dev": true, "requires": { - "call-bind": "^1.0.0", + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "functions-have-names": "^1.2.1" + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" } }, "functional-red-black-tree": { @@ -33271,9 +33349,9 @@ "dev": true }, "functions-have-names": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.1.tgz", - "integrity": "sha512-j48B/ZI7VKs3sgeI2cZp7WXWmZXu7Iq5pl5/vptV5N2mq+DGFuS/ulaDjtaoLpYzuD6u8UgrUKHfgo7fDTSiBA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true }, "gauge": { @@ -33328,14 +33406,14 @@ "dev": true }, "get-intrinsic": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz", - "integrity": "sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", "dev": true, "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", - "has-symbols": "^1.0.1" + "has-symbols": "^1.0.3" } }, "get-mongodb-version": { @@ -33385,6 +33463,16 @@ "pump": "^3.0.0" } }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", @@ -33456,6 +33544,15 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, + "globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3" + } + }, "globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -33478,6 +33575,15 @@ } } }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, "got": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", @@ -33582,12 +33688,6 @@ "har-schema": "^2.0.0" } }, - "hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true - }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -33596,11 +33696,32 @@ "function-bind": "^1.1.1" } }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true + }, "has-symbol-support-x": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", @@ -33608,9 +33729,9 @@ "dev": true }, "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true }, "has-to-string-tag-x": { @@ -33622,6 +33743,15 @@ "has-symbol-support-x": "^1.4.1" } }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", @@ -33956,41 +34086,14 @@ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, "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.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", "dev": true, "requires": { - "es-abstract": "^1.17.0-next.1", + "get-intrinsic": "^1.2.0", "has": "^1.0.3", - "side-channel": "^1.0.2" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", - "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.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - } + "side-channel": "^1.0.4" } }, "interpret": { @@ -34072,11 +34175,31 @@ } } }, + "is-array-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz", + "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-typed-array": "^1.1.10" + } + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -34087,10 +34210,14 @@ } }, "is-boolean-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.1.tgz", - "integrity": "sha512-TqZuVwa/sppcrhUCAYkGBk7w0yxfQQnxq28fjkO53tnK9FQXmdwz2JS5+GjsWQ6RByES1K40nI+yDic5c9/aAQ==", - "dev": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } }, "is-buffer": { "version": "1.1.6", @@ -34098,9 +34225,9 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "is-callable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", - "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true }, "is-ci": { @@ -34287,9 +34414,9 @@ "dev": true }, "is-negative-zero": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", - "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true }, "is-number": { @@ -34309,6 +34436,12 @@ "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==", "dev": true }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, "is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", @@ -34336,12 +34469,13 @@ "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" }, "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.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, "requires": { - "has-symbols": "^1.0.1" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" } }, "is-retry-allowed": { @@ -34349,6 +34483,15 @@ "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -34356,10 +34499,13 @@ "dev": true }, "is-string": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", - "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", - "dev": true + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } }, "is-subset": { "version": "0.1.1", @@ -34376,6 +34522,19 @@ "has-symbols": "^1.0.1" } }, + "is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + } + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -34392,6 +34551,15 @@ "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, "is-what": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.12.0.tgz", @@ -36641,7 +36809,8 @@ "jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "optional": true }, "jsonpointer.js": { "version": "0.4.0", @@ -36653,6 +36822,7 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "optional": true, "requires": { "jsonparse": "^1.2.0", "through": ">=2.2.7 <3" @@ -36798,7 +36968,7 @@ "klaw": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==", "dev": true, "requires": { "graceful-fs": "^4.1.9" @@ -37018,7 +37188,13 @@ "lodash.assignin": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", - "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=", + "integrity": "sha512-yX/rx6d/UTVh7sSVWVSIMjfnz95evAgDFdb1ZozC35I9mSFCkmzptOzevxjgbQUsc78NR44LVHWjsoMQXy9FDg==", + "dev": true + }, + "lodash.bind": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", + "integrity": "sha512-lxdsn7xxlCymgLYo1gGvVrfHmkjDiyqVv62FAeF2i5ta72BipE1SLxw8hPEPLhD4/247Ijw07UQH7Hq/chT5LA==", "dev": true }, "lodash.camelcase": { @@ -37042,19 +37218,19 @@ "lodash.difference": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==", "dev": true }, "lodash.filter": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", - "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=", + "integrity": "sha512-pXYUy7PR8BCLwX5mgJ/aNtyOvuJTdZAo9EQFUvMIYugqmJxnrYaANvTbgndOzHSCSR0wnlBBfRXJL5SbWxo3FQ==", "dev": true }, "lodash.flatten": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", "dev": true }, "lodash.flattendeep": { @@ -37066,7 +37242,7 @@ "lodash.foreach": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", - "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=", + "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==", "dev": true }, "lodash.forin": { @@ -37082,7 +37258,8 @@ "lodash.isfunction": { "version": "3.0.9", "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", - "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==" + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==", + "optional": true }, "lodash.isplainobject": { "version": "4.0.6", @@ -37097,7 +37274,7 @@ "lodash.map": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", - "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=", + "integrity": "sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==", "dev": true }, "lodash.merge": { @@ -37109,55 +37286,56 @@ "lodash.pad": { "version": "4.5.1", "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.5.1.tgz", - "integrity": "sha1-QzCUmoM6fI2iLMIPaibE1Z3runA=", + "integrity": "sha512-mvUHifnLqM+03YNzeTBS1/Gr6JRFjd3rRx88FHWUvamVaT9k2O/kXha3yBSOwB9/DTQrSTLJNHvLBBt2FdX7Mg==", "dev": true }, "lodash.padend": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", - "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=", + "integrity": "sha512-sOQs2aqGpbl27tmCS1QNZA09Uqp01ZzWfDUoD+xzTii0E7dSQfRKcRetFwa+uXaxaqL+TKm7CgD2JdKP7aZBSw==", "dev": true }, "lodash.padstart": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz", - "integrity": "sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs=", + "integrity": "sha512-sW73O6S8+Tg66eY56DBk85aQzzUJDtpoXFBgELMd5P/SotAguo+1kYO6RuYgXxA4HJH3LFTFPASX6ET6bjfriw==", "dev": true }, "lodash.pick": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=", + "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==", "dev": true }, "lodash.reduce": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", - "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=", + "integrity": "sha512-6raRe2vxCYBhpBu+B+TtNGUzah+hQjVdu3E17wfusjyrXBka2nBS8OH/gjVZ5PvHOhWmIZTYri09Z6n/QfnNMw==", "dev": true }, "lodash.reject": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz", - "integrity": "sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU=", + "integrity": "sha512-qkTuvgEzYdyhiJBx42YPzPo71R1aEr0z79kAv7Ixg8wPFEjgRgJdUsGMG3Hf3OYSF/kHI79XhNlt+5Ar6OzwxQ==", "dev": true }, "lodash.some": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", - "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=", + "integrity": "sha512-j7MJE+TuT51q9ggt4fSgVqro163BEFjAt3u97IqU+JA2DkWl80nFTrowzLpZ/BnpN7rrl0JA/593NAdd8p/scQ==", "dev": true }, "lodash.startswith": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/lodash.startswith/-/lodash.startswith-4.2.1.tgz", - "integrity": "sha1-xZjErc4YiiflMUVzHNxsDnF3YAw=", + "integrity": "sha512-XClYR1h4/fJ7H+mmCKppbiBmljN/nGs73iq2SjCT9SF4CBPoUHzLvWmH1GtZMhMBZSiRkHXfeA2RY1eIlJ75ww==", "dev": true }, "lodash.transform": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.transform/-/lodash.transform-4.6.0.tgz", - "integrity": "sha1-EjBkIvYzJK7YSD0/ODMrX2cFR6A=" + "integrity": "sha1-EjBkIvYzJK7YSD0/ODMrX2cFR6A=", + "optional": true }, "log-symbols": { "version": "4.0.0", @@ -37279,12 +37457,6 @@ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", "dev": true }, - "map-obj": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.2.1.tgz", - "integrity": "sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ==", - "dev": true - }, "map-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", @@ -37381,134 +37553,6 @@ "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", "dev": true }, - "meow": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", - "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", - "dev": true, - "requires": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize": "^1.2.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "dependencies": { - "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" - } - }, - "hosted-git-info": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", - "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "normalize-package-data": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.2.tgz", - "integrity": "sha512-6CdZocmfGaKnIHPVFhJJZ3GuR8SsLKvDANFp47Jmy51aKIr8akjAWTSxtpI+MBgBFdSMRyo4hMpDlT6dTffgZg==", - "dev": true, - "requires": { - "hosted-git-info": "^4.0.1", - "resolve": "^1.20.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - } - }, - "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 - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, - "type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true - } - } - }, "merge-source-map": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", @@ -37585,12 +37629,6 @@ "dom-walk": "^0.1.0" } }, - "min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true - }, "mingo": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/mingo/-/mingo-1.3.3.tgz", @@ -37600,25 +37638,15 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - } + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" }, "mixin-deep": { "version": "1.3.2", @@ -37921,16 +37949,16 @@ } }, "mocha-junit-reporter": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/mocha-junit-reporter/-/mocha-junit-reporter-2.0.2.tgz", - "integrity": "sha512-vYwWq5hh3v1lG0gdQCBxwNipBfvDiAM1PHroQRNp96+2l72e9wEUTw+mzoK+O0SudgfQ7WvTQZ9Nh3qkAYAjfg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/mocha-junit-reporter/-/mocha-junit-reporter-2.2.0.tgz", + "integrity": "sha512-W83Ddf94nfLiTBl24aS8IVyFvO8aRDLlCvb+cKb/VEaN5dEbcqu3CXiTe8MQK2DvzS7oKE1RsFTxzN302GGbDQ==", "dev": true, "requires": { - "debug": "^2.2.0", - "md5": "^2.1.0", - "mkdirp": "~0.5.1", + "debug": "^4.3.4", + "md5": "^2.3.0", + "mkdirp": "~1.0.4", "strip-ansi": "^6.0.1", - "xml": "^1.0.0" + "xml": "^1.0.1" }, "dependencies": { "ansi-regex": { @@ -37939,30 +37967,6 @@ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -37975,9 +37979,9 @@ } }, "mocha-multi": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/mocha-multi/-/mocha-multi-1.1.6.tgz", - "integrity": "sha512-hMVmd9C1h4PEiFNwHxn8aa5/EgGLg0UswdOrlrq1Y8ieKmot8hZLYaiESIgg/He3E4oxwaXPWT1V1PJ0qNJlUQ==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/mocha-multi/-/mocha-multi-1.1.7.tgz", + "integrity": "sha512-SXZRgHy0XiRTASyOp0p6fjOkdj+R62L6cqutnYyQOvIjNznJuUwzykxctypeRiOwPd+gfn4yt3NRulMQyI8Tzg==", "dev": true, "requires": { "debug": "^4.1.1", @@ -37998,12 +38002,13 @@ "moment": { "version": "2.29.1", "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" + "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==", + "optional": true }, "mongodb": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.13.0.tgz", - "integrity": "sha512-+taZ/bV8d1pYuHL4U+gSwkhmDrwkWbH1l4aah4YpmpscMwgFBkufIKxgP/G7m87/NUuQzc2Z75ZTI7ZOyqZLbw==", + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.14.0.tgz", + "integrity": "sha512-coGKkWXIBczZPr284tYKFLg+KbGPPLlSbdgfKAb6QqCFt5bo5VFZ50O3FFzsw4rnkqjwT6D8Qcoo9nshYKM7Mg==", "requires": { "@aws-sdk/credential-providers": "^3.186.0", "bson": "^4.7.0", @@ -38021,9 +38026,9 @@ } }, "mongodb-client-encryption": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/mongodb-client-encryption/-/mongodb-client-encryption-2.3.0.tgz", - "integrity": "sha512-cXuRYBmCj43rLeqP8gHa+CrloFe7TUCd/f16VduFGQzAN9ef5buMGIfSr2CEGBul/EjTCLlioctSSDmHAmpTqA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/mongodb-client-encryption/-/mongodb-client-encryption-2.5.0.tgz", + "integrity": "sha512-et7DSQDhkbioK/G3FYtjML34ylLHmapM2665k7MMWCxSiXBNGovp8wSV4dRvJzXzKMfGvc/A4bJ7EcPSjxLCwg==", "devOptional": true, "requires": { "bindings": "^1.5.0", @@ -38435,13 +38440,13 @@ } }, "mongodb-download-url": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mongodb-download-url/-/mongodb-download-url-1.0.0.tgz", - "integrity": "sha512-bvUE9Wa0P0ZpuazQ7UFHcvE03zdnXePSsntVBngqJQIM5m6JosMeW+nrabMyBvbGqiIsgXL96UF4Bj/FakKrLw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/mongodb-download-url/-/mongodb-download-url-1.3.0.tgz", + "integrity": "sha512-N7mRi3/LIAHCeTa+JtJVrVno4BNHVYF+6/WUamVFsbvCxtljDmQA1n9FSQxV4dfdiknR9zaoFcXAmd1gtg3Elg==", "dev": true, "requires": { "debug": "^4.1.1", - "minimist": "^1.2.0", + "minimist": "^1.2.3", "node-fetch": "^2.6.1", "semver": "^7.1.1" } @@ -38450,6 +38455,7 @@ "version": "1.11.0", "resolved": "https://registry.npmjs.org/mongodb-extended-json/-/mongodb-extended-json-1.11.0.tgz", "integrity": "sha512-+PLUMH7amvTYumCUR6alR474KmqtlmYeceJjsC+zcfdXls9IotfTp2WIuD6X5tO9dLDVCDqboqjgvXj/JjGj6g==", + "optional": true, "requires": { "async": "^3.1.0", "bson": "^1.0.1", @@ -38464,12 +38470,14 @@ "async": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", - "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==", + "optional": true }, "bson": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.5.tgz", - "integrity": "sha512-kDuEzldR21lHciPQAIulLs1LZlCXdLziXI6Mb/TDkwXhb//UORJNPXgcRs2CuO4H0DcMkpfT3/ySsP3unoZjBg==" + "integrity": "sha512-kDuEzldR21lHciPQAIulLs1LZlCXdLziXI6Mb/TDkwXhb//UORJNPXgcRs2CuO4H0DcMkpfT3/ySsP3unoZjBg==", + "optional": true } } }, @@ -38522,18 +38530,16 @@ "integrity": "sha512-pCutlP/AU0hcJ/f1h2h3nmn79/gXrQo6088QvPCbdx7SBDkAeGPH4AYu28DgqZzFvsn5mtt2RUpsFicYhjaHow==" }, "mongodb-query-parser": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/mongodb-query-parser/-/mongodb-query-parser-2.4.6.tgz", - "integrity": "sha512-R9uU//1IlhPPIGvB4ItMwus3E7nJJtBtrSrTV6wTslwDQfL6bpy9PXcIXVHdDsuJADQZdcvdvpj22VxdfqH2ig==", + "version": "2.4.10", + "resolved": "https://registry.npmjs.org/mongodb-query-parser/-/mongodb-query-parser-2.4.10.tgz", + "integrity": "sha512-gFv1N184F7oMUINuvmUJBMq+tIy1BiELNRSPGWzabYjySRxvIR2c64MJS0b7pnb0eyfHBzfKoLy2LCrYBDt8Gg==", "requires": { - "bson": "^4.6.1", "debug": "^4.1.1", - "ejson-shell-parser": "^1.1.3", + "ejson-shell-parser": "^1.2.1", "is-json": "^2.0.1", "javascript-stringify": "^2.0.1", "lodash": "^4.17.15", "lru-cache": "^5.1.1", - "mongodb-extended-json": "^1.10.2", "mongodb-language-model": "^1.6.1" }, "dependencies": { @@ -38561,9 +38567,9 @@ } }, "mongodb-runner": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/mongodb-runner/-/mongodb-runner-4.9.0.tgz", - "integrity": "sha512-ltAC7FQ6NJ1XoMc5AJ+sbURsETKJeHd2ulvTpJGH+xO79b44ELCF2yETBzAmiEKTkj3MI2u0Awh0KQhWizgwWw==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/mongodb-runner/-/mongodb-runner-4.10.0.tgz", + "integrity": "sha512-6hE4nA4+LMBPwLMXr/jQNRNtUdQgfmZOJE/4u5JX952hdUa0lPc+26Y45PdgbdMbfCYUfZK1cOBObZOBmTdQ6Q==", "dev": true, "requires": { "async": "^3.1.0", @@ -38577,7 +38583,7 @@ "mongodb": "^3.4.0", "mongodb-dbpath": "^0.0.1", "mongodb-tools": "github:mongodb-js/mongodb-tools#0d1a90f49796c41f6d47c7c7999fe384014a16a0", - "mongodb-version-manager": "^1.4.5", + "mongodb-version-manager": "^1.5.0", "untildify": "^4.0.0", "which": "^2.0.1" }, @@ -38734,7 +38740,7 @@ "mongodb-version-list": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/mongodb-version-list/-/mongodb-version-list-1.0.0.tgz", - "integrity": "sha1-8lAxz83W8UWx3o/OKk6+wCiLtKQ=", + "integrity": "sha512-F3kIABEMNjg3ZAX4SRbO1QPmhpP4NX2IgJq+lcUKidducTOVJafXJ+E+pMkgpU0xumC8QYbIZJ+8y4GZys9E4g==", "dev": true, "requires": { "cheerio": "^0.22.0", @@ -38748,7 +38754,7 @@ "cheerio": { "version": "0.22.0", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", - "integrity": "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=", + "integrity": "sha512-8/MzidM6G/TgRelkzDG13y3Y9LxBjCb+8yOEZ9+wwq5gVF2w2pV0wmHvjfT0RvuxGyR7UEuK36r+yYMbT4uKgA==", "dev": true, "requires": { "css-select": "~1.2.0", @@ -38781,7 +38787,7 @@ "fs-extra": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", - "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", + "integrity": "sha512-VerQV6vEKuhDWD2HGOybV6v5I73syoc/cXAbKlgTC7M/oFVEtklWlp9QH2Ijw3IaWDOQcMkldSPa7zXy79Z/UQ==", "dev": true, "requires": { "graceful-fs": "^4.1.2", @@ -38792,22 +38798,16 @@ "jsonfile": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", "dev": true, "requires": { "graceful-fs": "^4.1.6" } }, - "lodash.bind": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", - "integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=", - "dev": true - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, "semver": { @@ -38819,9 +38819,9 @@ } }, "mongodb-version-manager": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/mongodb-version-manager/-/mongodb-version-manager-1.4.6.tgz", - "integrity": "sha512-UxXZy7iqHUa039Bp8e1Y2tSLh/X/JtHRqnlcVkqNEWpX/5ETPaKwrT7QIVZc1Tk5tEkQXjRHd6nQtUjcemOHmA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/mongodb-version-manager/-/mongodb-version-manager-1.5.0.tgz", + "integrity": "sha512-VHijlQXvQFnX/9MzfGePyBNr9qHLHRHg6sM2ChFO+05Htf6JY50WzvDWZmtXUNGXEor80fXxhswwDJevGlZkyA==", "dev": true, "requires": { "ampersand-state": "^5.0.3", @@ -38843,9 +38843,9 @@ }, "dependencies": { "async": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", - "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", "dev": true }, "chalk": { @@ -38871,7 +38871,7 @@ "decompress-response": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", "dev": true, "requires": { "mimic-response": "^1.0.0" @@ -38899,7 +38899,7 @@ "file-type": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", + "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", "dev": true }, "filenamify": { @@ -38916,7 +38916,7 @@ "get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", "dev": true }, "got": { @@ -38965,7 +38965,7 @@ "p-event": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-event/-/p-event-1.3.0.tgz", - "integrity": "sha1-jmtPT2XHK8W2/ii3XtqHT5akoIU=", + "integrity": "sha512-hV1zbA7gwqPVFcapfeATaNjQ3J0NuzorHPyG8GPL9g/Y/TplWVBVoCKCXL6Ej2zscrCEv195QNWJXuBH6XZuzA==", "dev": true, "requires": { "p-timeout": "^1.1.1" @@ -38974,7 +38974,7 @@ "p-timeout": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", - "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", + "integrity": "sha512-gb0ryzr+K2qFqFv6qi3khoeqMZF/+ajxQipEF6NteZVnvz9tzdsfAVj3lYtn1gAXvH5lfLwfxEII799gt/mRIA==", "dev": true, "requires": { "p-finally": "^1.0.0" @@ -38983,13 +38983,13 @@ "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true }, "prepend-http": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==", "dev": true }, "semver": { @@ -39010,7 +39010,7 @@ "url-parse-lax": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "integrity": "sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==", "dev": true, "requires": { "prepend-http": "^1.0.1" @@ -39133,6 +39133,12 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, "natural-orderby": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/natural-orderby/-/natural-orderby-2.0.3.tgz", @@ -39347,7 +39353,7 @@ "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true } } @@ -39595,18 +39601,18 @@ } }, "object-inspect": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", - "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "dev": true }, "object-is": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.4.tgz", - "integrity": "sha512-1ZvAZ4wlF7IyPVOcE1Omikt7UpaFlOQq0HlSti+ZvDH3UiD2brwGMwDbyV43jao2bKJ+4+WdPJHSd7kgzKYVqg==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", "dev": true, "requires": { - "call-bind": "^1.0.0", + "call-bind": "^1.0.2", "define-properties": "^1.1.3" } }, @@ -39631,14 +39637,14 @@ } }, "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==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, "dependencies": { @@ -39663,15 +39669,14 @@ } }, "object.fromentries": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.3.tgz", - "integrity": "sha512-IDUSMXs6LOSJBWE++L0lzIbSqHl9KDCfff2x/JSEIDtEUavUnyMYC2ZGay/04Zq4UT8lvd4xNhU4/YHKibAOlw==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", "dev": true, "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "has": "^1.0.3" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "object.pick": { @@ -39684,15 +39689,14 @@ } }, "object.values": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.2.tgz", - "integrity": "sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", "dev": true, "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "has": "^1.0.3" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "once": { @@ -40566,9 +40570,9 @@ "dev": true }, "prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz", + "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==", "dev": true }, "process": { @@ -40620,7 +40624,7 @@ "proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", "dev": true }, "prr": { @@ -40695,12 +40699,6 @@ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, - "quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true - }, "raf": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", @@ -40785,9 +40783,9 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "react-redux": { - "version": "7.2.8", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.8.tgz", - "integrity": "sha512-6+uDjhs3PSIclqoCk0kd6iX74gzrGc3W5zcAjbrFgEdIjRSQObdIwfx80unTkVUYvbQ95Y8Av3OvFHq1w5EOUw==", + "version": "7.2.9", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz", + "integrity": "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==", "requires": { "@babel/runtime": "^7.15.4", "@types/react-redux": "^7.1.20", @@ -40896,16 +40894,6 @@ "resolve": "^1.9.0" } }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, "redeyed": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", @@ -40916,9 +40904,9 @@ } }, "redux": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.0.tgz", - "integrity": "sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", "requires": { "@babel/runtime": "^7.9.2" } @@ -40926,7 +40914,7 @@ "reflect.ownkeys": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz", - "integrity": "sha1-dJrO7H8/34tj+SegSAnpDFwLNGA=", + "integrity": "sha512-qOLsBKHCpSOFKK1NUOCGC5VyeufB6lEsFe92AL2bhIJsacZS1qdoOZSbPk3MYKuT2cFlRDnulKXuuElIrMjGUg==", "dev": true }, "regenerator-runtime": { @@ -40945,40 +40933,14 @@ } }, "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.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", "dev": true, "requires": { + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", - "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.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - } + "functions-have-names": "^1.2.2" } }, "regexpp": { @@ -41281,6 +41243,17 @@ "ret": "~0.1.10" } }, + "safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + } + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -41530,9 +41503,9 @@ } }, "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "requires": { "lru-cache": "^6.0.0" } @@ -41624,13 +41597,14 @@ "optional": true }, "side-channel": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.3.tgz", - "integrity": "sha512-A6+ByhlLkksFoUepsGxfj5x1gTSrs+OydsRptUxeNCabQpCFUvcwIczgOigI8vhY/OJCnPnyE9rGiwgvr9cS1g==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", "dev": true, "requires": { - "es-abstract": "^1.18.0-next.0", - "object-inspect": "^1.8.0" + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" } }, "sift": { @@ -42284,23 +42258,25 @@ } }, "string.prototype.trimend": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", - "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "dev": true, "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "string.prototype.trimstart": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", - "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "dev": true, "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "strip-ansi": { @@ -42347,15 +42323,6 @@ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true }, - "strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "requires": { - "min-indent": "^1.0.0" - } - }, "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -42833,12 +42800,6 @@ "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", "dev": true }, - "trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true - }, "trim-repeated": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", @@ -42875,9 +42836,9 @@ } }, "ts-loader": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.1.tgz", - "integrity": "sha512-384TYAqGs70rn9F0VBnh6BPTfhga7yFNdC5gXbQpDrBj9/KsT4iRkGqKXhziofHOlE2j6YEaiTYVGKKvPhGWvw==", + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.2.tgz", + "integrity": "sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==", "dev": true, "requires": { "chalk": "^4.1.0", @@ -42993,6 +42954,17 @@ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true }, + "typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + } + }, "typed-rest-client": { "version": "1.8.4", "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.4.tgz", @@ -43019,9 +42991,9 @@ } }, "typescript": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", - "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==", + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true }, "uc.micro": { @@ -43030,6 +43002,18 @@ "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", "dev": true }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, "unbzip2-stream": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", @@ -43286,46 +43270,64 @@ } }, "vscode-jsonrpc": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.0.2.tgz", - "integrity": "sha512-RY7HwI/ydoC1Wwg4gJ3y6LpU9FJRZAUnTYMXthqhFXXu77ErDd/xkREpGuk4MyYkk4a+XDWAMqe0S3KkelYQEQ==" + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.1.0.tgz", + "integrity": "sha512-6TDy/abTQk+zDGYazgbIPc+4JoXdwC8NHU9Pbn4UJP1fehUyZmM4RHp5IthX7A6L5KS30PRui+j+tbbMMMafdw==" }, "vscode-languageclient": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-8.0.2.tgz", - "integrity": "sha512-lHlthJtphG9gibGb/y72CKqQUxwPsMXijJVpHEC2bvbFqxmkj9LwQ3aGU9dwjBLqsX1S4KjShYppLvg1UJDF/Q==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-8.1.0.tgz", + "integrity": "sha512-GL4QdbYUF/XxQlAsvYWZRV3V34kOkpRlvV60/72ghHfsYFnS/v2MANZ9P6sHmxFcZKOse8O+L9G7Czg0NUWing==", "requires": { - "minimatch": "^3.0.4", - "semver": "^7.3.5", - "vscode-languageserver-protocol": "3.17.2" + "minimatch": "^5.1.0", + "semver": "^7.3.7", + "vscode-languageserver-protocol": "3.17.3" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "requires": { + "brace-expansion": "^2.0.1" + } + } } }, "vscode-languageserver": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-8.0.2.tgz", - "integrity": "sha512-bpEt2ggPxKzsAOZlXmCJ50bV7VrxwCS5BI4+egUmure/oI/t4OlFzi/YNtVvY24A2UDOZAgwFGgnZPwqSJubkA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-8.1.0.tgz", + "integrity": "sha512-eUt8f1z2N2IEUDBsKaNapkz7jl5QpskN2Y0G01T/ItMxBxw1fJwvtySGB9QMecatne8jFIWJGWI61dWjyTLQsw==", "requires": { - "vscode-languageserver-protocol": "3.17.2" + "vscode-languageserver-protocol": "3.17.3" } }, "vscode-languageserver-protocol": { - "version": "3.17.2", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.2.tgz", - "integrity": "sha512-8kYisQ3z/SQ2kyjlNeQxbkkTNmVFoQCqkmGrzLH6A9ecPlgTbp3wDTnUNqaUxYr4vlAcloxx8zwy7G5WdguYNg==", + "version": "3.17.3", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.3.tgz", + "integrity": "sha512-924/h0AqsMtA5yK22GgMtCYiMdCOtWTSGgUOkgEDX+wk2b0x4sAfLiO4NxBxqbiVtz7K7/1/RgVrVI0NClZwqA==", "requires": { - "vscode-jsonrpc": "8.0.2", - "vscode-languageserver-types": "3.17.2" + "vscode-jsonrpc": "8.1.0", + "vscode-languageserver-types": "3.17.3" } }, "vscode-languageserver-textdocument": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.7.tgz", - "integrity": "sha512-bFJH7UQxlXT8kKeyiyu41r22jCZXG8kuuVVA33OEJn1diWOZK5n8zBSPZFHVBOu8kXZ6h0LIRhf5UnCo61J4Hg==" + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.9.tgz", + "integrity": "sha512-NPfHVGFW2/fQEWHspr8x3PXhRgtFbuDZdl7p6ifuN3M7nk2Yjf5POr/NfDBuAiQG88DehDyJ7nGOT+p+edEtbw==" }, "vscode-languageserver-types": { - "version": "3.17.2", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.2.tgz", - "integrity": "sha512-zHhCWatviizPIq9B7Vh9uvrH6x3sK8itC84HkamnBWoDFJtzBf7SWlpLCZUit72b3os45h6RWQNC9xHRDF8dRA==" + "version": "3.17.3", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.3.tgz", + "integrity": "sha512-SYU4z1dL0PyIMd4Vj8YOqFvHu7Hz/enbWtpfnVbJHU4Nd1YNYx8u0ennumc6h48GQNeOLxmwySmnADouT/AuZA==" }, "w3c-hr-time": { "version": "1.0.2", @@ -43388,9 +43390,9 @@ "dev": true }, "webpack": { - "version": "5.74.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", - "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", + "version": "5.75.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz", + "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.3", @@ -43546,11 +43548,38 @@ "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" + } + }, "which-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" }, + "which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + } + }, "wide-align": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", diff --git a/package.json b/package.json index 333e102f9..4090344cf 100644 --- a/package.json +++ b/package.json @@ -972,53 +972,53 @@ } }, "dependencies": { - "@babel/parser": "^7.19.1", - "@babel/traverse": "^7.19.1", - "@fortawesome/fontawesome-svg-core": "^6.2.0", - "@fortawesome/free-solid-svg-icons": "^6.2.0", + "@babel/parser": "^7.21.1", + "@babel/traverse": "^7.21.0", + "@fortawesome/fontawesome-svg-core": "^6.3.0", + "@fortawesome/free-solid-svg-icons": "^6.3.0", "@fortawesome/react-fontawesome": "^0.2.0", - "@iconify-icons/codicon": "^1.2.16", + "@iconify-icons/codicon": "^1.2.21", "@iconify/react": "^1.1.4", - "@leafygreen-ui/logo": "^6.1.3", - "@leafygreen-ui/palette": "^3.4.2", + "@leafygreen-ui/logo": "^6.3.0", + "@leafygreen-ui/palette": "^3.4.7", "@leafygreen-ui/toggle": "^7.0.5", - "@mongodb-js/mongodb-constants": "^0.2.1", + "@mongodb-js/mongodb-constants": "^0.2.2", "@mongosh/browser-runtime-electron": "^1.6.2", "@mongosh/i18n": "^1.6.2", "@mongosh/service-provider-server": "^1.6.2", "@mongosh/shell-api": "^1.6.2", "analytics-node": "^5.1.2", - "bson": "^4.7.0", - "bson-transpilers": "^2.0.0", + "bson": "^4.7.2", + "bson-transpilers": "^2.0.2", "classnames": "^2.3.2", "debug": "^4.3.4", - "dotenv": "^16.0.2", + "dotenv": "^16.0.3", "micromatch": "^4.0.5", - "mongodb": "^4.13.0", + "mongodb": "^4.14.0", "mongodb-build-info": "^1.5.0", "mongodb-cloud-info": "^1.1.3", "mongodb-connection-string-url": "^2.5.3", "mongodb-data-service": "^22.1.1", "mongodb-ns": "^2.4.0", - "mongodb-query-parser": "^2.4.6", + "mongodb-query-parser": "^2.4.10", "mongodb-schema": "^9.0.0", "numeral": "^2.0.6", "react": "^16.14.0", "react-dom": "^16.14.0", - "react-redux": "^7.2.8", - "redux": "^4.2.0", + "react-redux": "^7.2.9", + "redux": "^4.2.1", "ts-log": "^2.2.5", "uuid": "^8.3.2", - "vscode-languageclient": "^8.0.2", - "vscode-languageserver": "^8.0.2", - "vscode-languageserver-textdocument": "^1.0.7" + "vscode-languageclient": "^8.1.0", + "vscode-languageserver": "^8.1.0", + "vscode-languageserver-textdocument": "^1.0.9" }, "devDependencies": { "@mongodb-js/prettier-config-compass": "^1.0.0", - "@types/analytics-node": "^3.1.9", - "@types/babel__core": "^7.1.19", - "@types/babel__traverse": "^7.18.1", - "@types/chai": "^4.3.3", + "@types/analytics-node": "^3.1.10", + "@types/babel__core": "^7.20.0", + "@types/babel__traverse": "^7.18.3", + "@types/chai": "^4.3.4", "@types/chai-fs": "^2.0.2", "@types/chai-json-schema": "^1.4.6", "@types/debug": "^4.1.7", @@ -1027,19 +1027,19 @@ "@types/jest": "^26.0.24", "@types/micromatch": "^4.0.2", "@types/mocha": "^8.2.3", - "@types/node": "^14.18.29", + "@types/node": "^14.18.36", "@types/react": "^17.0.50", "@types/react-dom": "^17.0.17", "@types/sinon": "^9.0.11", "@types/uuid": "^8.3.4", - "@types/vscode": "^1.74.0", - "@typescript-eslint/eslint-plugin": "^5.38.0", - "@typescript-eslint/parser": "^5.38.0", - "@vscode/test-electron": "^2.1.5", - "@vscode/vsce": "^2.16.0", + "@types/vscode": "^1.75.1", + "@typescript-eslint/eslint-plugin": "^5.53.0", + "@typescript-eslint/parser": "^5.53.0", + "@vscode/test-electron": "^2.2.3", + "@vscode/vsce": "^2.17.0", "autoprefixer": "^9.8.8", "buffer": "^6.0.3", - "chai": "^4.3.6", + "chai": "^4.3.7", "chai-as-promised": "^7.1.1", "chai-fs": "^2.0.0", "chai-json-schema": "^1.5.1", @@ -1051,8 +1051,8 @@ "depcheck": "^1.4.3", "download": "^8.0.0", "enzyme": "^3.11.0", - "enzyme-adapter-react-16": "^1.15.6", - "eslint": "^8.23.1", + "enzyme-adapter-react-16": "^1.15.7", + "eslint": "^8.34.0", "eslint-config-mongodb-js": "^5.0.3", "eslint-plugin-mocha": "^10.1.0", "execa": "^1.0.0", @@ -1062,30 +1062,29 @@ "jest-transform-stub": "^2.0.0", "less": "^3.13.1", "less-loader": "^5.0.0", - "meow": "^9.0.0", "mkdirp": "^1.0.4", "mocha": "^8.4.0", - "mocha-junit-reporter": "^2.0.2", - "mocha-multi": "^1.1.6", - "mongodb-client-encryption": "^2.2.1", - "mongodb-runner": "^4.9.0", + "mocha-junit-reporter": "^2.2.0", + "mocha-multi": "^1.1.7", + "mongodb-client-encryption": "^2.5.0", + "mongodb-runner": "^4.10.0", "node-loader": "^0.6.0", "npm-run-all": "^4.1.5", "ora": "^5.4.1", "postcss-loader": "^3.0.0", "pre-commit": "^1.2.2", - "prettier": "^2.7.1", + "prettier": "^2.8.4", "process": "^0.11.10", - "semver": "^7.3.7", + "semver": "^7.3.8", "sinon": "^9.2.4", "sinon-chai": "^3.7.0", "stream-browserify": "^3.0.0", "style-loader": "^1.3.0", "ts-jest": "^26.5.6", - "ts-loader": "^9.4.1", + "ts-loader": "^9.4.2", "ts-node": "^10.9.1", - "typescript": "^4.8.3", - "webpack": "^5.74.0", + "typescript": "^4.9.5", + "webpack": "^5.75.0", "webpack-cli": "^4.10.0", "xvfb-maybe": "^0.2.1", "yargs-parser": "^20.2.9" From 5fd5077d5e7868e990c2da4f74e700793679b4d2 Mon Sep 17 00:00:00 2001 From: Alena Khineika Date: Tue, 21 Feb 2023 13:48:41 +0100 Subject: [PATCH 19/36] refactor: reforamt --- src/language/worker.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/language/worker.ts b/src/language/worker.ts index 5feda3d26..03049b6a1 100644 --- a/src/language/worker.ts +++ b/src/language/worker.ts @@ -14,7 +14,7 @@ import { ServerCommands } from './serverCommands'; // MongoClientOptions is the second argument of CliServiceProvider.connect(connectionStr, options) type MongoClientOptions = NonNullable< - Parameters[1] + Parameters<(typeof CliServiceProvider)['connect']>[1] >; interface EvaluationResult { From ee55d53553a3b843ffd924d5aca31be1756dd2b0 Mon Sep 17 00:00:00 2001 From: Alena Khineika Date: Tue, 21 Feb 2023 15:34:21 +0100 Subject: [PATCH 20/36] build: try with prev npm --- package-lock.json | 4 ++-- package.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 127a75d8f..4c53429e9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,7 +31,7 @@ "debug": "^4.3.4", "dotenv": "^16.0.3", "micromatch": "^4.0.5", - "mongodb": "^4.14.0", + "mongodb": "^4.13.0", "mongodb-build-info": "^1.5.0", "mongodb-cloud-info": "^1.1.3", "mongodb-connection-string-url": "^2.5.3", @@ -128,7 +128,7 @@ }, "engines": { "node": "^16.16.0", - "npm": "^8.15.1", + "npm": "^8.8.0", "vscode": "^1.75.1" } }, diff --git a/package.json b/package.json index 4090344cf..569779de8 100644 --- a/package.json +++ b/package.json @@ -64,7 +64,7 @@ "engines": { "vscode": "^1.75.1", "node": "^16.16.0", - "npm": "^8.15.1" + "npm": "^8.8.0" }, "activationEvents": [ "onView:mongoDB", @@ -994,7 +994,7 @@ "debug": "^4.3.4", "dotenv": "^16.0.3", "micromatch": "^4.0.5", - "mongodb": "^4.14.0", + "mongodb": "^4.13.0", "mongodb-build-info": "^1.5.0", "mongodb-cloud-info": "^1.1.3", "mongodb-connection-string-url": "^2.5.3", From a1208242d61eb75c83c95e03f4bf425f6108d5a8 Mon Sep 17 00:00:00 2001 From: Alena Khineika Date: Tue, 21 Feb 2023 15:39:52 +0100 Subject: [PATCH 21/36] build: try old deps --- package-lock.json | 2914 ++++++++++++++++++--------------------------- package.json | 80 +- 2 files changed, 1215 insertions(+), 1779 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4c53429e9..1dac375d5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,27 +9,27 @@ "version": "0.0.0-dev.0", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { - "@babel/parser": "^7.21.1", - "@babel/traverse": "^7.21.0", - "@fortawesome/fontawesome-svg-core": "^6.3.0", - "@fortawesome/free-solid-svg-icons": "^6.3.0", + "@babel/parser": "^7.19.1", + "@babel/traverse": "^7.19.1", + "@fortawesome/fontawesome-svg-core": "^6.2.0", + "@fortawesome/free-solid-svg-icons": "^6.2.0", "@fortawesome/react-fontawesome": "^0.2.0", - "@iconify-icons/codicon": "^1.2.21", + "@iconify-icons/codicon": "^1.2.16", "@iconify/react": "^1.1.4", - "@leafygreen-ui/logo": "^6.3.0", - "@leafygreen-ui/palette": "^3.4.7", + "@leafygreen-ui/logo": "^6.1.3", + "@leafygreen-ui/palette": "^3.4.2", "@leafygreen-ui/toggle": "^7.0.5", - "@mongodb-js/mongodb-constants": "^0.2.2", + "@mongodb-js/mongodb-constants": "^0.2.1", "@mongosh/browser-runtime-electron": "^1.6.2", "@mongosh/i18n": "^1.6.2", "@mongosh/service-provider-server": "^1.6.2", "@mongosh/shell-api": "^1.6.2", "analytics-node": "^5.1.2", - "bson": "^4.7.2", - "bson-transpilers": "^2.0.2", + "bson": "^4.7.0", + "bson-transpilers": "^2.0.0", "classnames": "^2.3.2", "debug": "^4.3.4", - "dotenv": "^16.0.3", + "dotenv": "^16.0.2", "micromatch": "^4.0.5", "mongodb": "^4.13.0", "mongodb-build-info": "^1.5.0", @@ -37,25 +37,25 @@ "mongodb-connection-string-url": "^2.5.3", "mongodb-data-service": "^22.1.1", "mongodb-ns": "^2.4.0", - "mongodb-query-parser": "^2.4.10", + "mongodb-query-parser": "^2.4.6", "mongodb-schema": "^9.0.0", "numeral": "^2.0.6", "react": "^16.14.0", "react-dom": "^16.14.0", - "react-redux": "^7.2.9", - "redux": "^4.2.1", + "react-redux": "^7.2.8", + "redux": "^4.2.0", "ts-log": "^2.2.5", "uuid": "^8.3.2", - "vscode-languageclient": "^8.1.0", - "vscode-languageserver": "^8.1.0", - "vscode-languageserver-textdocument": "^1.0.9" + "vscode-languageclient": "^8.0.2", + "vscode-languageserver": "^8.0.2", + "vscode-languageserver-textdocument": "^1.0.7" }, "devDependencies": { "@mongodb-js/prettier-config-compass": "^1.0.0", - "@types/analytics-node": "^3.1.10", - "@types/babel__core": "^7.20.0", - "@types/babel__traverse": "^7.18.3", - "@types/chai": "^4.3.4", + "@types/analytics-node": "^3.1.9", + "@types/babel__core": "^7.1.19", + "@types/babel__traverse": "^7.18.1", + "@types/chai": "^4.3.3", "@types/chai-fs": "^2.0.2", "@types/chai-json-schema": "^1.4.6", "@types/debug": "^4.1.7", @@ -64,19 +64,19 @@ "@types/jest": "^26.0.24", "@types/micromatch": "^4.0.2", "@types/mocha": "^8.2.3", - "@types/node": "^14.18.36", + "@types/node": "^14.18.29", "@types/react": "^17.0.50", "@types/react-dom": "^17.0.17", "@types/sinon": "^9.0.11", "@types/uuid": "^8.3.4", - "@types/vscode": "^1.75.1", - "@typescript-eslint/eslint-plugin": "^5.53.0", - "@typescript-eslint/parser": "^5.53.0", - "@vscode/test-electron": "^2.2.3", - "@vscode/vsce": "^2.17.0", + "@types/vscode": "^1.74.0", + "@typescript-eslint/eslint-plugin": "^5.38.0", + "@typescript-eslint/parser": "^5.38.0", + "@vscode/test-electron": "^2.1.5", + "@vscode/vsce": "^2.16.0", "autoprefixer": "^9.8.8", "buffer": "^6.0.3", - "chai": "^4.3.7", + "chai": "^4.3.6", "chai-as-promised": "^7.1.1", "chai-fs": "^2.0.0", "chai-json-schema": "^1.5.1", @@ -88,8 +88,8 @@ "depcheck": "^1.4.3", "download": "^8.0.0", "enzyme": "^3.11.0", - "enzyme-adapter-react-16": "^1.15.7", - "eslint": "^8.34.0", + "enzyme-adapter-react-16": "^1.15.6", + "eslint": "^8.23.1", "eslint-config-mongodb-js": "^5.0.3", "eslint-plugin-mocha": "^10.1.0", "execa": "^1.0.0", @@ -101,34 +101,34 @@ "less-loader": "^5.0.0", "mkdirp": "^1.0.4", "mocha": "^8.4.0", - "mocha-junit-reporter": "^2.2.0", - "mocha-multi": "^1.1.7", - "mongodb-client-encryption": "^2.5.0", - "mongodb-runner": "^4.10.0", + "mocha-junit-reporter": "^2.0.2", + "mocha-multi": "^1.1.6", + "mongodb-client-encryption": "^2.2.1", + "mongodb-runner": "^4.9.0", "node-loader": "^0.6.0", "npm-run-all": "^4.1.5", "ora": "^5.4.1", "postcss-loader": "^3.0.0", "pre-commit": "^1.2.2", - "prettier": "^2.8.4", + "prettier": "^2.7.1", "process": "^0.11.10", - "semver": "^7.3.8", + "semver": "^7.3.7", "sinon": "^9.2.4", "sinon-chai": "^3.7.0", "stream-browserify": "^3.0.0", "style-loader": "^1.3.0", "ts-jest": "^26.5.6", - "ts-loader": "^9.4.2", + "ts-loader": "^9.4.1", "ts-node": "^10.9.1", - "typescript": "^4.9.5", - "webpack": "^5.75.0", + "typescript": "^4.8.3", + "webpack": "^5.74.0", "webpack-cli": "^4.10.0", "xvfb-maybe": "^0.2.1", "yargs-parser": "^20.2.9" }, "engines": { "node": "^16.16.0", - "npm": "^8.8.0", + "npm": "^8.15.1", "vscode": "^1.75.1" } }, @@ -1593,28 +1593,18 @@ } }, "node_modules/@babel/generator": { - "version": "7.21.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.1.tgz", - "integrity": "sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.0.tgz", + "integrity": "sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg==", "dependencies": { - "@babel/types": "^7.21.0", + "@babel/types": "^7.19.0", "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/generator/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, "node_modules/@babel/helper-compilation-targets": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", @@ -1649,12 +1639,12 @@ } }, "node_modules/@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", "dependencies": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -1731,9 +1721,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", + "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==", "engines": { "node": ">=6.9.0" } @@ -1805,9 +1795,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.21.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.1.tgz", - "integrity": "sha512-JzhBFpkuhBNYUY7qs+wTzNmyCWUHEaAFpQQD2YfU1rPL38/L43Wvid0fFkiOCnHvsGncRZgEPyGnltABLcVDTg==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.1.tgz", + "integrity": "sha512-h7RCSorm1DdTVGJf3P2Mhj3kdnkmF/EiysUkzS2TdgAYqyjFdMQJbVuXOBej2SBJaXan/lIVtT6KkGbyyq753A==", "bin": { "parser": "bin/babel-parser.js" }, @@ -1991,31 +1981,31 @@ } }, "node_modules/@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", "dependencies": { "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.0.tgz", - "integrity": "sha512-Xdt2P1H4LKTO8ApPfnO1KmzYMFpp7D/EinoXzLYN/cHcBNrVCAkAtGUcXnHXrl/VGktureU6fkQrHSBE2URfoA==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.1.tgz", + "integrity": "sha512-0j/ZfZMxKukDaag2PtOPDbwuELqIar6lLskVPPJDjXMXjfLb1Obo/1yjxIGqqAJrmfaTIY3z2wFLAQ7qSkLsuA==", "dependencies": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.0", + "@babel/generator": "^7.19.0", "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", + "@babel/helper-function-name": "^7.19.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.0", - "@babel/types": "^7.21.0", + "@babel/parser": "^7.19.1", + "@babel/types": "^7.19.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -2024,12 +2014,12 @@ } }, "node_modules/@babel/types": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.0.tgz", - "integrity": "sha512-uR7NWq2VNFnDi7EYqiRz2Jv/VQIu38tu64Zy8TX2nQFQ6etJ9V/Rr2msW8BS132mum2rL645qpDrLtAJtVpuow==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", + "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2240,15 +2230,15 @@ "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" }, "node_modules/@eslint/eslintrc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", - "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.2.tgz", + "integrity": "sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.4.0", - "globals": "^13.19.0", + "globals": "^13.15.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -2269,9 +2259,9 @@ "dev": true }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -2284,9 +2274,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true, "engines": { "node": ">= 4" @@ -2329,33 +2319,33 @@ } }, "node_modules/@fortawesome/fontawesome-common-types": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.3.0.tgz", - "integrity": "sha512-4BC1NMoacEBzSXRwKjZ/X/gmnbp/HU5Qqat7E8xqorUtBFZS+bwfGH5/wqOC2K6GV0rgEobp3OjGRMa5fK9pFg==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.2.0.tgz", + "integrity": "sha512-rBevIsj2nclStJ7AxTdfsa3ovHb1H+qApwrxcTVo+NNdeJiB9V75hsKfrkG5AwNcRUNxrPPiScGYCNmLMoh8pg==", "hasInstallScript": true, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/fontawesome-svg-core": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.3.0.tgz", - "integrity": "sha512-uz9YifyKlixV6AcKlOX8WNdtF7l6nakGyLYxYaCa823bEBqyj/U2ssqtctO38itNEwXb8/lMzjdoJ+aaJuOdrw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.2.0.tgz", + "integrity": "sha512-Cf2mAAeMWFMzpLC7Y9H1I4o3wEU+XovVJhTiNG8ZNgSQj53yl7OCJaS80K4YjrABWZzbAHVaoHE1dVJ27AAYXw==", "hasInstallScript": true, "dependencies": { - "@fortawesome/fontawesome-common-types": "6.3.0" + "@fortawesome/fontawesome-common-types": "6.2.0" }, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/free-solid-svg-icons": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.3.0.tgz", - "integrity": "sha512-x5tMwzF2lTH8pyv8yeZRodItP2IVlzzmBuD1M7BjawWgg9XAvktqJJ91Qjgoaf8qJpHQ8FEU9VxRfOkLhh86QA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.2.0.tgz", + "integrity": "sha512-UjCILHIQ4I8cN46EiQn0CZL/h8AwCGgR//1c4R96Q5viSRwuKVo0NdQEc4bm+69ZwC0dUvjbDqAHF1RR5FA3XA==", "hasInstallScript": true, "dependencies": { - "@fortawesome/fontawesome-common-types": "6.3.0" + "@fortawesome/fontawesome-common-types": "6.2.0" }, "engines": { "node": ">=6" @@ -2374,29 +2364,27 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", + "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", - "minimatch": "^3.0.5" + "minimatch": "^3.0.4" }, "engines": { "node": ">=10.10.0" } }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/@humanwhocodes/gitignore-to-minimatch": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", + "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, "node_modules/@humanwhocodes/module-importer": { @@ -2419,9 +2407,9 @@ "dev": true }, "node_modules/@iconify-icons/codicon": { - "version": "1.2.21", - "resolved": "https://registry.npmjs.org/@iconify-icons/codicon/-/codicon-1.2.21.tgz", - "integrity": "sha512-thIa+5jVVVSz048cSQQpQfnXU+zfQjxF3ofmkZHN+7fc6cHclKRxPPXSeVj7dHZzpgQx4pbijHPIUzIni+Pegw==", + "version": "1.2.16", + "resolved": "https://registry.npmjs.org/@iconify-icons/codicon/-/codicon-1.2.16.tgz", + "integrity": "sha512-85rBsFEhhq2qSBfIEF0hzUk31i4GjeRzNyd0DZGFWo5v+PgAeTBiv8ftsTDf8d2fxy9F5kesT/R7bOtRy1xKmw==", "dependencies": { "@iconify/types": "*" } @@ -3037,9 +3025,9 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", + "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", "engines": { "node": ">=6.0.0" } @@ -3063,9 +3051,9 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", + "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.9", @@ -3139,14 +3127,14 @@ } }, "node_modules/@leafygreen-ui/logo": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@leafygreen-ui/logo/-/logo-6.3.0.tgz", - "integrity": "sha512-hxAevbD/wfOjobRp7rVhqPyV/oFRUgwLuUdPn+JG1cBT/ALIeqz7fRz4jE6SyNc3ZXSWvphw/zHaKQSExVcXQQ==" + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/@leafygreen-ui/logo/-/logo-6.1.3.tgz", + "integrity": "sha512-b0UfZ6ypwRenw8DxhbwDd3B0JiSdTHCsTE8yQ2wBqQgTazIlz9WoFEjCrSaVv/oZ3XQnY4CBUjEfYGQ8aVOjTA==" }, "node_modules/@leafygreen-ui/palette": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/@leafygreen-ui/palette/-/palette-3.4.7.tgz", - "integrity": "sha512-AsvPlbvF7CERiZbAQR8hy3lAJ2/rieXI3cO0jsOwV8ztDqYNotKAdLujyr/NviudrRUenYiXrLizIKVlSPUMuA==" + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@leafygreen-ui/palette/-/palette-3.4.2.tgz", + "integrity": "sha512-uR+fPOlU2Hyg1gHb4iFDtZE1SRmuj591apZpHYwAJ3JF1oqHmHVUZy9XTGN+V1Y299FGWsKrCU7OJxS7bg3nDg==" }, "node_modules/@leafygreen-ui/toggle": { "version": "7.0.5", @@ -3197,9 +3185,9 @@ } }, "node_modules/@mongodb-js/mongodb-constants": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@mongodb-js/mongodb-constants/-/mongodb-constants-0.2.2.tgz", - "integrity": "sha512-vm1G+/WRWmXGyE9ZnhDv9toe+LRu1x0F/lGEwqWESfBiUUUuVZhj25fS2o4IL7H4pJ31sFxr7/gu+ER8OkmtzA==" + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@mongodb-js/mongodb-constants/-/mongodb-constants-0.2.1.tgz", + "integrity": "sha512-arCTQYvK9scQszbQQcPba7Ru5HYrc8YINcGcM4HKMCcg+8A17U+3Y3AEI7N/oe2VE+1GFsrh8MoKBch4jEvY1g==" }, "node_modules/@mongodb-js/prettier-config-compass": { "version": "1.0.0", @@ -3891,18 +3879,18 @@ "dev": true }, "node_modules/@types/analytics-node": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/@types/analytics-node/-/analytics-node-3.1.10.tgz", - "integrity": "sha512-dvn8iy2EQZDlQGgRNT9SW2Ljn9L3VgwcrpJvonufnNygZWB1XEufXNvDhUtwNUqNyHhD0hbDCCFb9j+B7vE5cA==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@types/analytics-node/-/analytics-node-3.1.9.tgz", + "integrity": "sha512-C7L7/Dd/CmBST7AvgoCnf4yI9h6W5aYfCOcfUZS5GHlXDQjnXLVOUDpTdwTIZjW4lKECeil6+G+Ul6Xzwv/P0g==", "dev": true }, "node_modules/@types/babel__core": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", - "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", + "version": "7.1.19", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", + "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" @@ -3926,9 +3914,9 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", - "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", + "version": "7.18.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.1.tgz", + "integrity": "sha512-FSdLaZh2UxaMuLp9lixWaHq/golWTRWOnRsAXzDTDSDOQLuZb1nsdCt6pJSPWSEQt2eFZ2YVk3oYhn+1kLMeMA==", "dependencies": { "@babel/types": "^7.3.0" } @@ -3940,9 +3928,9 @@ "dev": true }, "node_modules/@types/chai": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", - "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==" + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.3.tgz", + "integrity": "sha512-hC7OMnszpxhZPduX+m+nrx+uFoLkWOMiR4oa/AZF3MuSETYTZmFfJAHqZEM8MVlvfG7BEUcgvtwoCTxBp6hm3g==" }, "node_modules/@types/chai-fs": { "version": "2.0.2", @@ -4198,9 +4186,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "14.18.36", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.36.tgz", - "integrity": "sha512-FXKWbsJ6a1hIrRxv+FoukuHnGTgEzKYGi7kilfMae96AL9UNkPFNWJEEYWzdRI9ooIkbr4AKldyuSTLql06vLQ==" + "version": "14.18.29", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.29.tgz", + "integrity": "sha512-LhF+9fbIX4iPzhsRLpK5H7iPdvW8L4IwGciXQIOEcuF62+9nw/VQVsOViAOOGxY3OlOKGLFv0sWwJXdwQeTn6A==" }, "node_modules/@types/normalize-package-data": { "version": "2.4.0", @@ -4259,12 +4247,6 @@ "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" }, - "node_modules/@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", - "dev": true - }, "node_modules/@types/sinon": { "version": "9.0.11", "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-9.0.11.tgz", @@ -4332,18 +4314,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.53.0.tgz", - "integrity": "sha512-alFpFWNucPLdUOySmXCJpzr6HKC3bu7XooShWM+3w/EL6J2HIoB2PFxpLnq4JauWVk6DiVeNKzQlFEaE+X9sGw==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.38.0.tgz", + "integrity": "sha512-GgHi/GNuUbTOeoJiEANi0oI6fF3gBQc3bGFYj40nnAPCbhrtEDf2rjBmefFadweBmO1Du1YovHeDP2h5JLhtTQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.53.0", - "@typescript-eslint/type-utils": "5.53.0", - "@typescript-eslint/utils": "5.53.0", + "@typescript-eslint/scope-manager": "5.38.0", + "@typescript-eslint/type-utils": "5.38.0", + "@typescript-eslint/utils": "5.38.0", "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", "regexpp": "^3.2.0", "semver": "^7.3.7", "tsutils": "^3.21.0" @@ -4375,14 +4355,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.53.0.tgz", - "integrity": "sha512-MKBw9i0DLYlmdOb3Oq/526+al20AJZpANdT6Ct9ffxcV8nKCHz63t/S0IhlTFNsBIHJv+GY5SFJ0XfqVeydQrQ==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.38.0.tgz", + "integrity": "sha512-/F63giJGLDr0ms1Cr8utDAxP2SPiglaD6V+pCOcG35P2jCqdfR7uuEhz1GIC3oy4hkUF8xA1XSXmd9hOh/a5EA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.53.0", - "@typescript-eslint/types": "5.53.0", - "@typescript-eslint/typescript-estree": "5.53.0", + "@typescript-eslint/scope-manager": "5.38.0", + "@typescript-eslint/types": "5.38.0", + "@typescript-eslint/typescript-estree": "5.38.0", "debug": "^4.3.4" }, "engines": { @@ -4402,13 +4382,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.53.0.tgz", - "integrity": "sha512-Opy3dqNsp/9kBBeCPhkCNR7fmdSQqA+47r21hr9a14Bx0xnkElEQmhoHga+VoaoQ6uDHjDKmQPIYcUcKJifS7w==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.38.0.tgz", + "integrity": "sha512-ByhHIuNyKD9giwkkLqzezZ9y5bALW8VNY6xXcP+VxoH4JBDKjU5WNnsiD4HJdglHECdV+lyaxhvQjTUbRboiTA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.53.0", - "@typescript-eslint/visitor-keys": "5.53.0" + "@typescript-eslint/types": "5.38.0", + "@typescript-eslint/visitor-keys": "5.38.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4419,13 +4399,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.53.0.tgz", - "integrity": "sha512-HO2hh0fmtqNLzTAme/KnND5uFNwbsdYhCZghK2SoxGp3Ifn2emv+hi0PBUjzzSh0dstUIFqOj3bp0AwQlK4OWw==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.38.0.tgz", + "integrity": "sha512-iZq5USgybUcj/lfnbuelJ0j3K9dbs1I3RICAJY9NZZpDgBYXmuUlYQGzftpQA9wC8cKgtS6DASTvF3HrXwwozA==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.53.0", - "@typescript-eslint/utils": "5.53.0", + "@typescript-eslint/typescript-estree": "5.38.0", + "@typescript-eslint/utils": "5.38.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -4446,9 +4426,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.53.0.tgz", - "integrity": "sha512-5kcDL9ZUIP756K6+QOAfPkigJmCPHcLN7Zjdz76lQWWDdzfOhZDTj1irs6gPBKiXx5/6O3L0+AvupAut3z7D2A==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.38.0.tgz", + "integrity": "sha512-HHu4yMjJ7i3Cb+8NUuRCdOGu2VMkfmKyIJsOr9PfkBVYLYrtMCK/Ap50Rpov+iKpxDTfnqvDbuPLgBE5FwUNfA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4459,13 +4439,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.53.0.tgz", - "integrity": "sha512-eKmipH7QyScpHSkhbptBBYh9v8FxtngLquq292YTEQ1pxVs39yFBlLC1xeIZcPPz1RWGqb7YgERJRGkjw8ZV7w==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.38.0.tgz", + "integrity": "sha512-6P0RuphkR+UuV7Avv7MU3hFoWaGcrgOdi8eTe1NwhMp2/GjUJoODBTRWzlHpZh6lFOaPmSvgxGlROa0Sg5Zbyg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.53.0", - "@typescript-eslint/visitor-keys": "5.53.0", + "@typescript-eslint/types": "5.38.0", + "@typescript-eslint/visitor-keys": "5.38.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -4486,19 +4466,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.53.0.tgz", - "integrity": "sha512-VUOOtPv27UNWLxFwQK/8+7kvxVC+hPHNsJjzlJyotlaHjLSIgOCKj9I0DBUjwOOA64qjBwx5afAPjksqOxMO0g==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.38.0.tgz", + "integrity": "sha512-6sdeYaBgk9Fh7N2unEXGz+D+som2QCQGPAf1SxrkEr+Z32gMreQ0rparXTNGRRfYUWk/JzbGdcM8NSSd6oqnTA==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.53.0", - "@typescript-eslint/types": "5.53.0", - "@typescript-eslint/typescript-estree": "5.53.0", + "@typescript-eslint/scope-manager": "5.38.0", + "@typescript-eslint/types": "5.38.0", + "@typescript-eslint/typescript-estree": "5.38.0", "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", - "semver": "^7.3.7" + "eslint-utils": "^3.0.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4512,12 +4490,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.53.0.tgz", - "integrity": "sha512-JqNLnX3leaHFZEN0gCh81sIvgrp/2GOACZNgO4+Tkf64u51kTpAyWFOY8XHx8XuXr3N2C9zgPPHtcpMg6z1g0w==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.38.0.tgz", + "integrity": "sha512-MxnrdIyArnTi+XyFLR+kt/uNAcdOnmT+879os7qDRI+EYySR4crXJq9BXPfRzzLGq0wgxkwidrCJ9WCAoacm1w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.53.0", + "@typescript-eslint/types": "5.38.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -4544,9 +4522,9 @@ "dev": true }, "node_modules/@vscode/test-electron": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.2.3.tgz", - "integrity": "sha512-7DmdGYQTqRNaLHKG3j56buc9DkstriY4aV0S3Zj32u0U9/T0L8vwWAC9QGCh1meu1VXDEla1ze27TkqysHGP0Q==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.1.5.tgz", + "integrity": "sha512-O/ioqFpV+RvKbRykX2ItYPnbcZ4Hk5V0rY4uhQjQTLhGL9WZUvS7exzuYQCCI+ilSqJpctvxq2llTfGXf9UnnA==", "dev": true, "dependencies": { "http-proxy-agent": "^4.0.1", @@ -4555,7 +4533,7 @@ "unzipper": "^0.10.11" }, "engines": { - "node": ">=16" + "node": ">=8.9.3" } }, "node_modules/@vscode/vsce": { @@ -5068,12 +5046,6 @@ "prop-types": "^15.7.2", "prop-types-exact": "^1.2.0", "react-is": "^16.13.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - }, - "peerDependencies": { - "react": "^0.14 || ^15.0.0 || ^16.0.0-alpha" } }, "node_modules/ajv": { @@ -5245,7 +5217,7 @@ "node_modules/ansi": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz", - "integrity": "sha512-iFY7JCgHbepc0b82yLaw4IMortylNb6wG4kL+4R0C3iv6i+RHGHux/yUX5BTiRvSX/shMnngjR1YyNMnXEFh5A==", + "integrity": "sha1-DELU+xcWDVqa8eSEus4cZpIsGyE=", "dev": true }, "node_modules/ansi-colors": { @@ -5493,18 +5465,44 @@ } }, "node_modules/array.prototype.find": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.2.1.tgz", - "integrity": "sha512-I2ri5Z9uMpMvnsNrHre9l3PaX+z9D0/z6F7Yt2u15q7wt0I62g5kX6xUKR1SJiefgG+u2/gJUmM8B47XRvQR6w==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.1.1.tgz", + "integrity": "sha512-mi+MYNJYLTx2eNYy+Yh6raoQacCsNeeMUaspFPh9Y141lFSsWxxB8V9mM2ye+eqiRs917J6/pJ4M9ZPzenWckA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.4" + } + }, + "node_modules/array.prototype.find/node_modules/es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array.prototype.find/node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" } }, "node_modules/array.prototype.flat": { @@ -5635,18 +5633,6 @@ "url": "https://tidelift.com/funding/github/npm/autoprefixer" } }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -6128,12 +6114,13 @@ } }, "node_modules/bson-transpilers": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bson-transpilers/-/bson-transpilers-2.0.2.tgz", - "integrity": "sha512-FmY2vXr54rEcftux3/gspJ9RivX/kPz4O5XdAVuL2OxqYowXcDro+SETnMq5gWIy613o3DPLdGuAalDADOMHSQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bson-transpilers/-/bson-transpilers-2.0.0.tgz", + "integrity": "sha512-gHd/NCuZsbn+61uh1pDxI0dQxxkkq9SqsSc8hWN1Lwvu2dbnDLcPfBDaL3meYxb/sTDg+5drETbqgMwNsWg1vw==", "dependencies": { "antlr4": "4.7.2", "bson": "^4.4.1", + "context-eval": "^0.1.0", "js-yaml": "^3.13.1" } }, @@ -6292,16 +6279,13 @@ } }, "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz", + "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==", "dev": true, "dependencies": { "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "get-intrinsic": "^1.0.0" } }, "node_modules/call-me-maybe": { @@ -6415,14 +6399,14 @@ } }, "node_modules/chai": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", - "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", + "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", "dev": true, "dependencies": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", - "deep-eql": "^4.1.2", + "deep-eql": "^3.0.1", "get-func-name": "^2.0.0", "loupe": "^2.3.1", "pathval": "^1.1.1", @@ -7385,9 +7369,9 @@ } }, "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", + "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", "dev": true, "dependencies": { "ini": "^1.3.4", @@ -7435,6 +7419,11 @@ "node": ">= 0.6" } }, + "node_modules/context-eval": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/context-eval/-/context-eval-0.1.0.tgz", + "integrity": "sha1-P8pxfX3wI6l4XwjGWkGJo93wP6s=" + }, "node_modules/context-map-webpack-plugin": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/context-map-webpack-plugin/-/context-map-webpack-plugin-0.1.0.tgz", @@ -7580,7 +7569,7 @@ "node_modules/css-select": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha512-dUQOBoqdR7QwV90WysXPLXG5LO7nhYBgiWVfxF80DKPF8zx1t/pUd2FYy73emg3zrjtM6dzmYgbHKfV2rxiHQA==", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", "dev": true, "dependencies": { "boolbase": "~1.0.0", @@ -7947,15 +7936,15 @@ } }, "node_modules/deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", "dev": true, "dependencies": { "type-detect": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=0.12" } }, "node_modules/deep-extend": { @@ -8000,19 +7989,15 @@ } }, "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "dev": true, "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" + "object-keys": "^1.0.12" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/define-properties/node_modules/object-keys": { @@ -8379,7 +8364,7 @@ "node_modules/docopt": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/docopt/-/docopt-0.6.2.tgz", - "integrity": "sha512-NqTbaYeE4gA/wU1hdKFdU+AFahpDOpgGLzHP42k6H6DKExJd0A55KEVWYhL9FEmHmgeLvEU2vuKXDuU+4yToOw==", + "integrity": "sha1-so6eIiDaXsSffqW7JKR3h0Be6xE=", "dev": true, "engines": { "node": ">=0.10.0" @@ -8451,7 +8436,7 @@ "node_modules/domutils": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", "dev": true, "dependencies": { "dom-serializer": "0", @@ -8459,9 +8444,9 @@ } }, "node_modules/dotenv": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", - "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "version": "16.0.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.2.tgz", + "integrity": "sha512-JvpYKUmzQhYoIFgK2MOnF3bciIZoItIIoryihy0rIA+H4Jy0FmgyKYAHCTN98P5ybGSJcIFbh6QKeJdtZd1qhA==", "engines": { "node": ">=12" } @@ -8469,7 +8454,7 @@ "node_modules/downcache": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/downcache/-/downcache-0.0.9.tgz", - "integrity": "sha512-AssoVsNYu5DnPY0Ro67lkbiAr66sk5IHuiIGm3pzFzWmTzkcEoFjDlG8szzP4x+ZN2OHehKTZbwDrC7l2Q52+g==", + "integrity": "sha1-eQuwQkaJE2EVzpPyqhWUbG2AbQ4=", "dev": true, "dependencies": { "extend": "^3.0.0", @@ -8484,7 +8469,7 @@ "node_modules/downcache/node_modules/gauge": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.7.tgz", - "integrity": "sha512-fVbU2wRE91yDvKUnrIaQlHKAWKY5e08PmztCrwuH5YVQ+Z/p3d0ny2T48o6uvAAXHIUnfaQdHkmxYbQft1eHVA==", + "integrity": "sha1-6c7FSD09TuDvRLYKfZnkk14TbZM=", "dev": true, "dependencies": { "ansi": "^0.3.0", @@ -8495,12 +8480,12 @@ } }, "node_modules/downcache/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "dependencies": { - "minimist": "^1.2.6" + "minimist": "^1.2.5" }, "bin": { "mkdirp": "bin/cmd.js" @@ -8509,7 +8494,7 @@ "node_modules/downcache/node_modules/npmlog": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-2.0.4.tgz", - "integrity": "sha512-DaL6RTb8Qh4tMe2ttPT1qWccETy2Vi5/8p+htMpLBeXJTr2CAqnF5WQtSP2eFpvaNbhLZ5uilDb98mRm4Q+lZQ==", + "integrity": "sha1-mLUlMPJRTKkNCexbIsiEZyI3VpI=", "dev": true, "dependencies": { "ansi": "~0.3.1", @@ -8638,20 +8623,20 @@ } }, "node_modules/ejson-shell-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ejson-shell-parser/-/ejson-shell-parser-1.2.1.tgz", - "integrity": "sha512-xXRwH+O4EtL62ue8EmY8vNVr/AGRbRIv76WNuhXoWWwcT5TAvGKe4AqJh46QNXisVZe5e1JxvBdTnD3SO8ZLzA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ejson-shell-parser/-/ejson-shell-parser-1.2.0.tgz", + "integrity": "sha512-2DbCot5/HYcO6kY91nLU5I0CKLTuK9LiKiwaY7OFvfqf3xVgYAvUiLAQKHKeqUFlIUXY3KwRtXfaF5Vic6R1dA==", "dependencies": { "acorn": "^8.1.0" }, "peerDependencies": { - "bson": "^4.2.3 || ^5.0.0" + "bson": "^4.2.3" } }, "node_modules/ejson-shell-parser/node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", "bin": { "acorn": "bin/acorn" }, @@ -8758,28 +8743,20 @@ } }, "node_modules/enzyme-adapter-react-16": { - "version": "1.15.7", - "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.15.7.tgz", - "integrity": "sha512-LtjKgvlTc/H7adyQcj+aq0P0H07LDL480WQl1gU512IUyaDo/sbOaNDdZsJXYW2XaoPqrLLE9KbZS+X2z6BASw==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.15.6.tgz", + "integrity": "sha512-yFlVJCXh8T+mcQo8M6my9sPgeGzj85HSHi6Apgf1Cvq/7EL/J9+1JoJmJsRxZgyTvPMAqOEpRSu/Ii/ZpyOk0g==", "dev": true, "dependencies": { - "enzyme-adapter-utils": "^1.14.1", - "enzyme-shallow-equal": "^1.0.5", + "enzyme-adapter-utils": "^1.14.0", + "enzyme-shallow-equal": "^1.0.4", "has": "^1.0.3", - "object.assign": "^4.1.4", - "object.values": "^1.1.5", - "prop-types": "^15.8.1", + "object.assign": "^4.1.2", + "object.values": "^1.1.2", + "prop-types": "^15.7.2", "react-is": "^16.13.1", "react-test-renderer": "^16.0.0-0", "semver": "^5.7.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - }, - "peerDependencies": { - "enzyme": "^3.0.0", - "react": "^16.0.0-0", - "react-dom": "^16.0.0-0" } }, "node_modules/enzyme-adapter-react-16/node_modules/semver": { @@ -8792,24 +8769,18 @@ } }, "node_modules/enzyme-adapter-utils": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.14.1.tgz", - "integrity": "sha512-JZgMPF1QOI7IzBj24EZoDpaeG/p8Os7WeBZWTJydpsH7JRStc7jYbHE4CmNQaLqazaGFyLM8ALWA3IIZvxW3PQ==", + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.14.0.tgz", + "integrity": "sha512-F/z/7SeLt+reKFcb7597IThpDp0bmzcH1E9Oabqv+o01cID2/YInlqHbFl7HzWBl4h3OdZYedtwNDOmSKkk0bg==", "dev": true, "dependencies": { "airbnb-prop-types": "^2.16.0", - "function.prototype.name": "^1.1.5", + "function.prototype.name": "^1.1.3", "has": "^1.0.3", - "object.assign": "^4.1.4", - "object.fromentries": "^2.0.5", - "prop-types": "^15.8.1", + "object.assign": "^4.1.2", + "object.fromentries": "^2.0.3", + "prop-types": "^15.7.2", "semver": "^5.7.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - }, - "peerDependencies": { - "react": "0.13.x || 0.14.x || ^15.0.0-0 || ^16.0.0-0" } }, "node_modules/enzyme-adapter-utils/node_modules/semver": { @@ -8822,16 +8793,13 @@ } }, "node_modules/enzyme-shallow-equal": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.5.tgz", - "integrity": "sha512-i6cwm7hN630JXenxxJFBKzgLC3hMTafFQXflvzHgPmDhOBhxUWDe8AeRv1qp2/uWJ2Y8z5yLWMzmAfkTOiOCZg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.4.tgz", + "integrity": "sha512-MttIwB8kKxypwHvRynuC3ahyNc+cFbR8mjVIltnmzQ0uKGqmsfO4bfBuLxb0beLNPhjblUEYvEbsg+VSygvF1Q==", "dev": true, "dependencies": { "has": "^1.0.3", - "object-is": "^1.1.5" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "object-is": "^1.1.2" } }, "node_modules/enzyme/node_modules/lodash.escape": { @@ -8867,50 +8835,26 @@ } }, "node_modules/es-abstract": { - "version": "1.21.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", - "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.4", - "is-array-buffer": "^3.0.1", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/es-abstract/node_modules/object-keys": { @@ -8928,29 +8872,6 @@ "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", "dev": true }, - "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - } - }, "node_modules/es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -9105,15 +9026,15 @@ } }, "node_modules/eslint": { - "version": "8.34.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.34.0.tgz", - "integrity": "sha512-1Z8iFsucw+7kSqXNZVslXS8Ioa4u2KM7GPwuKtkTFAqZ/cHMcEaR+1+Br0wLlot49cNxIiZk5wp8EAbPcYZxTg==", + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.1.tgz", + "integrity": "sha512-w7C1IXCc6fNqjpuYd0yPlcTKKmHlHHktRkzmBPZ+7cvNBQuiNjx0xaMTjAJGCafJhQkrFJooREv0CtrVzmHwqg==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.4.1", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint/eslintrc": "^1.3.2", + "@humanwhocodes/config-array": "^0.10.4", + "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -9129,14 +9050,14 @@ "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", + "glob-parent": "^6.0.1", + "globals": "^13.15.0", + "globby": "^11.1.0", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", @@ -9789,9 +9710,9 @@ } }, "node_modules/eslint/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -9966,9 +9887,9 @@ } }, "node_modules/espree": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", - "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", + "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", "dev": true, "dependencies": { "acorn": "^8.8.0", @@ -9983,9 +9904,9 @@ } }, "node_modules/espree/node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -10684,9 +10605,6 @@ }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/file-entry-cache": { @@ -10826,15 +10744,6 @@ } } }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, "node_modules/for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -11005,21 +10914,18 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.3.tgz", + "integrity": "sha512-H51qkbNSp8mtkJt+nyW1gyStBiKZxfRqySNUR99ylq6BPXHKI4SEvIlTKp4odLfjRKJV04DFWMU3G/YRlQOsag==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "es-abstract": "^1.18.0-next.1", + "functions-have-names": "^1.2.1" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/functional-red-black-tree": { @@ -11029,13 +10935,10 @@ "dev": true }, "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.1.tgz", + "integrity": "sha512-j48B/ZI7VKs3sgeI2cZp7WXWmZXu7Iq5pl5/vptV5N2mq+DGFuS/ulaDjtaoLpYzuD6u8UgrUKHfgo7fDTSiBA==", + "dev": true }, "node_modules/gauge": { "version": "2.7.4", @@ -11098,17 +11001,14 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz", + "integrity": "sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg==", "dev": true, "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "has-symbols": "^1.0.1" } }, "node_modules/get-mongodb-version": { @@ -11173,22 +11073,6 @@ "node": ">=6" } }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", @@ -11276,21 +11160,6 @@ "node": ">=4" } }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -11320,18 +11189,6 @@ "node": ">= 4" } }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/got": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", @@ -11469,15 +11326,6 @@ "node": ">= 0.4.0" } }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -11486,30 +11334,6 @@ "node": ">=4" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/has-symbol-support-x": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", @@ -11520,15 +11344,12 @@ } }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", "dev": true, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-to-string-tag-x": { @@ -11543,21 +11364,6 @@ "node": "*" } }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", @@ -11734,21 +11540,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "dev": true }, "node_modules/htmlparser2/node_modules/string_decoder": { "version": "1.3.0", @@ -11981,19 +11773,50 @@ } }, "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.2.tgz", + "integrity": "sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.0", + "es-abstract": "^1.17.0-next.1", "has": "^1.0.3", - "side-channel": "^1.0.4" + "side-channel": "^1.0.2" }, "engines": { "node": ">= 0.4" } }, + "node_modules/internal-slot/node_modules/es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/internal-slot/node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/interpret": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", @@ -12092,37 +11915,11 @@ "node": ">=0.10.0" } }, - "node_modules/is-array-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz", - "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -12136,19 +11933,12 @@ } }, "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.1.tgz", + "integrity": "sha512-TqZuVwa/sppcrhUCAYkGBk7w0yxfQQnxq28fjkO53tnK9FQXmdwz2JS5+GjsWQ6RByES1K40nI+yDic5c9/aAQ==", "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-buffer": { @@ -12157,15 +11947,12 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", "dev": true, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-ci": { @@ -12406,15 +12193,12 @@ "dev": true }, "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", + "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", "dev": true, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-number": { @@ -12440,15 +12224,6 @@ "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==", "dev": true }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", @@ -12482,19 +12257,15 @@ "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" }, "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "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, "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "has-symbols": "^1.0.1" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-retry-allowed": { @@ -12505,18 +12276,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -12527,18 +12286,12 @@ } }, "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-subset": { @@ -12559,25 +12312,6 @@ "node": ">= 0.4" } }, - "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -12600,18 +12334,6 @@ "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-what": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.12.0.tgz", @@ -15243,8 +14965,7 @@ "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", "engines": [ "node >= 0.2.0" - ], - "optional": true + ] }, "node_modules/jsonpointer.js": { "version": "0.4.0", @@ -15256,7 +14977,6 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "optional": true, "dependencies": { "jsonparse": "^1.2.0", "through": ">=2.2.7 <3" @@ -15458,7 +15178,7 @@ "node_modules/klaw": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", "dev": true, "optionalDependencies": { "graceful-fs": "^4.1.9" @@ -15726,13 +15446,7 @@ "node_modules/lodash.assignin": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", - "integrity": "sha512-yX/rx6d/UTVh7sSVWVSIMjfnz95evAgDFdb1ZozC35I9mSFCkmzptOzevxjgbQUsc78NR44LVHWjsoMQXy9FDg==", - "dev": true - }, - "node_modules/lodash.bind": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", - "integrity": "sha512-lxdsn7xxlCymgLYo1gGvVrfHmkjDiyqVv62FAeF2i5ta72BipE1SLxw8hPEPLhD4/247Ijw07UQH7Hq/chT5LA==", + "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=", "dev": true }, "node_modules/lodash.camelcase": { @@ -15756,19 +15470,19 @@ "node_modules/lodash.difference": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==", + "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=", "dev": true }, "node_modules/lodash.filter": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", - "integrity": "sha512-pXYUy7PR8BCLwX5mgJ/aNtyOvuJTdZAo9EQFUvMIYugqmJxnrYaANvTbgndOzHSCSR0wnlBBfRXJL5SbWxo3FQ==", + "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=", "dev": true }, "node_modules/lodash.flatten": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", "dev": true }, "node_modules/lodash.flattendeep": { @@ -15780,7 +15494,7 @@ "node_modules/lodash.foreach": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", - "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==", + "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=", "dev": true }, "node_modules/lodash.forin": { @@ -15796,8 +15510,7 @@ "node_modules/lodash.isfunction": { "version": "3.0.9", "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", - "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==", - "optional": true + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==" }, "node_modules/lodash.isplainobject": { "version": "4.0.6", @@ -15812,7 +15525,7 @@ "node_modules/lodash.map": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", - "integrity": "sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==", + "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=", "dev": true }, "node_modules/lodash.merge": { @@ -15824,56 +15537,55 @@ "node_modules/lodash.pad": { "version": "4.5.1", "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.5.1.tgz", - "integrity": "sha512-mvUHifnLqM+03YNzeTBS1/Gr6JRFjd3rRx88FHWUvamVaT9k2O/kXha3yBSOwB9/DTQrSTLJNHvLBBt2FdX7Mg==", + "integrity": "sha1-QzCUmoM6fI2iLMIPaibE1Z3runA=", "dev": true }, "node_modules/lodash.padend": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", - "integrity": "sha512-sOQs2aqGpbl27tmCS1QNZA09Uqp01ZzWfDUoD+xzTii0E7dSQfRKcRetFwa+uXaxaqL+TKm7CgD2JdKP7aZBSw==", + "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=", "dev": true }, "node_modules/lodash.padstart": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz", - "integrity": "sha512-sW73O6S8+Tg66eY56DBk85aQzzUJDtpoXFBgELMd5P/SotAguo+1kYO6RuYgXxA4HJH3LFTFPASX6ET6bjfriw==", + "integrity": "sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs=", "dev": true }, "node_modules/lodash.pick": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==", + "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=", "dev": true }, "node_modules/lodash.reduce": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", - "integrity": "sha512-6raRe2vxCYBhpBu+B+TtNGUzah+hQjVdu3E17wfusjyrXBka2nBS8OH/gjVZ5PvHOhWmIZTYri09Z6n/QfnNMw==", + "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=", "dev": true }, "node_modules/lodash.reject": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz", - "integrity": "sha512-qkTuvgEzYdyhiJBx42YPzPo71R1aEr0z79kAv7Ixg8wPFEjgRgJdUsGMG3Hf3OYSF/kHI79XhNlt+5Ar6OzwxQ==", + "integrity": "sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU=", "dev": true }, "node_modules/lodash.some": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", - "integrity": "sha512-j7MJE+TuT51q9ggt4fSgVqro163BEFjAt3u97IqU+JA2DkWl80nFTrowzLpZ/BnpN7rrl0JA/593NAdd8p/scQ==", + "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=", "dev": true }, "node_modules/lodash.startswith": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/lodash.startswith/-/lodash.startswith-4.2.1.tgz", - "integrity": "sha512-XClYR1h4/fJ7H+mmCKppbiBmljN/nGs73iq2SjCT9SF4CBPoUHzLvWmH1GtZMhMBZSiRkHXfeA2RY1eIlJ75ww==", + "integrity": "sha1-xZjErc4YiiflMUVzHNxsDnF3YAw=", "dev": true }, "node_modules/lodash.transform": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.transform/-/lodash.transform-4.6.0.tgz", - "integrity": "sha1-EjBkIvYzJK7YSD0/ODMrX2cFR6A=", - "optional": true + "integrity": "sha1-EjBkIvYzJK7YSD0/ODMrX2cFR6A=" }, "node_modules/log-symbols": { "version": "4.0.0", @@ -16236,7 +15948,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -16245,12 +15956,9 @@ } }, "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, "node_modules/mixin-deep": { "version": "1.3.2", @@ -16339,16 +16047,16 @@ } }, "node_modules/mocha-junit-reporter": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/mocha-junit-reporter/-/mocha-junit-reporter-2.2.0.tgz", - "integrity": "sha512-W83Ddf94nfLiTBl24aS8IVyFvO8aRDLlCvb+cKb/VEaN5dEbcqu3CXiTe8MQK2DvzS7oKE1RsFTxzN302GGbDQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mocha-junit-reporter/-/mocha-junit-reporter-2.0.2.tgz", + "integrity": "sha512-vYwWq5hh3v1lG0gdQCBxwNipBfvDiAM1PHroQRNp96+2l72e9wEUTw+mzoK+O0SudgfQ7WvTQZ9Nh3qkAYAjfg==", "dev": true, "dependencies": { - "debug": "^4.3.4", - "md5": "^2.3.0", - "mkdirp": "~1.0.4", + "debug": "^2.2.0", + "md5": "^2.1.0", + "mkdirp": "~0.5.1", "strip-ansi": "^6.0.1", - "xml": "^1.0.1" + "xml": "^1.0.0" }, "peerDependencies": { "mocha": ">=2.2.5" @@ -16363,6 +16071,33 @@ "node": ">=8" } }, + "node_modules/mocha-junit-reporter/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/mocha-junit-reporter/node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mocha-junit-reporter/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, "node_modules/mocha-junit-reporter/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -16376,9 +16111,9 @@ } }, "node_modules/mocha-multi": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/mocha-multi/-/mocha-multi-1.1.7.tgz", - "integrity": "sha512-SXZRgHy0XiRTASyOp0p6fjOkdj+R62L6cqutnYyQOvIjNznJuUwzykxctypeRiOwPd+gfn4yt3NRulMQyI8Tzg==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/mocha-multi/-/mocha-multi-1.1.6.tgz", + "integrity": "sha512-hMVmd9C1h4PEiFNwHxn8aa5/EgGLg0UswdOrlrq1Y8ieKmot8hZLYaiESIgg/He3E4oxwaXPWT1V1PJ0qNJlUQ==", "dev": true, "dependencies": { "debug": "^4.1.1", @@ -16391,7 +16126,7 @@ "node": ">=6.0.0" }, "peerDependencies": { - "mocha": ">=2.2.0 <7 || >=9" + "mocha": ">=2.2.0 <7 || ^9" } }, "node_modules/mocha-multi/node_modules/lodash.once": { @@ -16721,15 +16456,14 @@ "version": "2.29.1", "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==", - "optional": true, "engines": { "node": "*" } }, "node_modules/mongodb": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.14.0.tgz", - "integrity": "sha512-coGKkWXIBczZPr284tYKFLg+KbGPPLlSbdgfKAb6QqCFt5bo5VFZ50O3FFzsw4rnkqjwT6D8Qcoo9nshYKM7Mg==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.13.0.tgz", + "integrity": "sha512-+taZ/bV8d1pYuHL4U+gSwkhmDrwkWbH1l4aah4YpmpscMwgFBkufIKxgP/G7m87/NUuQzc2Z75ZTI7ZOyqZLbw==", "dependencies": { "bson": "^4.7.0", "mongodb-connection-string-url": "^2.5.4", @@ -16752,9 +16486,9 @@ } }, "node_modules/mongodb-client-encryption": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/mongodb-client-encryption/-/mongodb-client-encryption-2.5.0.tgz", - "integrity": "sha512-et7DSQDhkbioK/G3FYtjML34ylLHmapM2665k7MMWCxSiXBNGovp8wSV4dRvJzXzKMfGvc/A4bJ7EcPSjxLCwg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/mongodb-client-encryption/-/mongodb-client-encryption-2.3.0.tgz", + "integrity": "sha512-cXuRYBmCj43rLeqP8gHa+CrloFe7TUCd/f16VduFGQzAN9ef5buMGIfSr2CEGBul/EjTCLlioctSSDmHAmpTqA==", "devOptional": true, "hasInstallScript": true, "dependencies": { @@ -16767,13 +16501,7 @@ "node": ">=12.9.0" }, "peerDependencies": { - "@aws-sdk/credential-providers": "^3.186.0", "mongodb": ">=3.4.0" - }, - "peerDependenciesMeta": { - "@aws-sdk/credential-providers": { - "optional": true - } } }, "node_modules/mongodb-client-encryption/node_modules/decompress-response": { @@ -17278,13 +17006,13 @@ } }, "node_modules/mongodb-download-url": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/mongodb-download-url/-/mongodb-download-url-1.3.0.tgz", - "integrity": "sha512-N7mRi3/LIAHCeTa+JtJVrVno4BNHVYF+6/WUamVFsbvCxtljDmQA1n9FSQxV4dfdiknR9zaoFcXAmd1gtg3Elg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mongodb-download-url/-/mongodb-download-url-1.0.0.tgz", + "integrity": "sha512-bvUE9Wa0P0ZpuazQ7UFHcvE03zdnXePSsntVBngqJQIM5m6JosMeW+nrabMyBvbGqiIsgXL96UF4Bj/FakKrLw==", "dev": true, "dependencies": { "debug": "^4.1.1", - "minimist": "^1.2.3", + "minimist": "^1.2.0", "node-fetch": "^2.6.1", "semver": "^7.1.1" }, @@ -17296,7 +17024,6 @@ "version": "1.11.0", "resolved": "https://registry.npmjs.org/mongodb-extended-json/-/mongodb-extended-json-1.11.0.tgz", "integrity": "sha512-+PLUMH7amvTYumCUR6alR474KmqtlmYeceJjsC+zcfdXls9IotfTp2WIuD6X5tO9dLDVCDqboqjgvXj/JjGj6g==", - "optional": true, "dependencies": { "async": "^3.1.0", "bson": "^1.0.1", @@ -17311,14 +17038,12 @@ "node_modules/mongodb-extended-json/node_modules/async": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", - "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==", - "optional": true + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" }, "node_modules/mongodb-extended-json/node_modules/bson": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.5.tgz", "integrity": "sha512-kDuEzldR21lHciPQAIulLs1LZlCXdLziXI6Mb/TDkwXhb//UORJNPXgcRs2CuO4H0DcMkpfT3/ySsP3unoZjBg==", - "optional": true, "engines": { "node": ">=0.6.19" } @@ -17370,20 +17095,19 @@ "integrity": "sha512-pCutlP/AU0hcJ/f1h2h3nmn79/gXrQo6088QvPCbdx7SBDkAeGPH4AYu28DgqZzFvsn5mtt2RUpsFicYhjaHow==" }, "node_modules/mongodb-query-parser": { - "version": "2.4.10", - "resolved": "https://registry.npmjs.org/mongodb-query-parser/-/mongodb-query-parser-2.4.10.tgz", - "integrity": "sha512-gFv1N184F7oMUINuvmUJBMq+tIy1BiELNRSPGWzabYjySRxvIR2c64MJS0b7pnb0eyfHBzfKoLy2LCrYBDt8Gg==", + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mongodb-query-parser/-/mongodb-query-parser-2.4.6.tgz", + "integrity": "sha512-R9uU//1IlhPPIGvB4ItMwus3E7nJJtBtrSrTV6wTslwDQfL6bpy9PXcIXVHdDsuJADQZdcvdvpj22VxdfqH2ig==", "dependencies": { + "bson": "^4.6.1", "debug": "^4.1.1", - "ejson-shell-parser": "^1.2.1", + "ejson-shell-parser": "^1.1.3", "is-json": "^2.0.1", "javascript-stringify": "^2.0.1", "lodash": "^4.17.15", "lru-cache": "^5.1.1", + "mongodb-extended-json": "^1.10.2", "mongodb-language-model": "^1.6.1" - }, - "peerDependencies": { - "bson": "^4.6.1 || ^5" } }, "node_modules/mongodb-query-parser/node_modules/lru-cache": { @@ -17408,9 +17132,9 @@ } }, "node_modules/mongodb-runner": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/mongodb-runner/-/mongodb-runner-4.10.0.tgz", - "integrity": "sha512-6hE4nA4+LMBPwLMXr/jQNRNtUdQgfmZOJE/4u5JX952hdUa0lPc+26Y45PdgbdMbfCYUfZK1cOBObZOBmTdQ6Q==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/mongodb-runner/-/mongodb-runner-4.9.0.tgz", + "integrity": "sha512-ltAC7FQ6NJ1XoMc5AJ+sbURsETKJeHd2ulvTpJGH+xO79b44ELCF2yETBzAmiEKTkj3MI2u0Awh0KQhWizgwWw==", "dev": true, "dependencies": { "async": "^3.1.0", @@ -17424,7 +17148,7 @@ "mongodb": "^3.4.0", "mongodb-dbpath": "^0.0.1", "mongodb-tools": "github:mongodb-js/mongodb-tools#0d1a90f49796c41f6d47c7c7999fe384014a16a0", - "mongodb-version-manager": "^1.5.0", + "mongodb-version-manager": "^1.4.5", "untildify": "^4.0.0", "which": "^2.0.1" }, @@ -17650,7 +17374,7 @@ "node_modules/mongodb-version-list": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/mongodb-version-list/-/mongodb-version-list-1.0.0.tgz", - "integrity": "sha512-F3kIABEMNjg3ZAX4SRbO1QPmhpP4NX2IgJq+lcUKidducTOVJafXJ+E+pMkgpU0xumC8QYbIZJ+8y4GZys9E4g==", + "integrity": "sha1-8lAxz83W8UWx3o/OKk6+wCiLtKQ=", "dev": true, "dependencies": { "cheerio": "^0.22.0", @@ -17667,7 +17391,7 @@ "node_modules/mongodb-version-list/node_modules/cheerio": { "version": "0.22.0", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", - "integrity": "sha512-8/MzidM6G/TgRelkzDG13y3Y9LxBjCb+8yOEZ9+wwq5gVF2w2pV0wmHvjfT0RvuxGyR7UEuK36r+yYMbT4uKgA==", + "integrity": "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=", "dev": true, "dependencies": { "css-select": "~1.2.0", @@ -17703,7 +17427,7 @@ "node_modules/mongodb-version-list/node_modules/fs-extra": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", - "integrity": "sha512-VerQV6vEKuhDWD2HGOybV6v5I73syoc/cXAbKlgTC7M/oFVEtklWlp9QH2Ijw3IaWDOQcMkldSPa7zXy79Z/UQ==", + "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", "dev": true, "dependencies": { "graceful-fs": "^4.1.2", @@ -17714,16 +17438,22 @@ "node_modules/mongodb-version-list/node_modules/jsonfile": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", "dev": true, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, + "node_modules/mongodb-version-list/node_modules/lodash.bind": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", + "integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=", + "dev": true + }, "node_modules/mongodb-version-list/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, "node_modules/mongodb-version-list/node_modules/semver": { @@ -17736,9 +17466,9 @@ } }, "node_modules/mongodb-version-manager": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/mongodb-version-manager/-/mongodb-version-manager-1.5.0.tgz", - "integrity": "sha512-VHijlQXvQFnX/9MzfGePyBNr9qHLHRHg6sM2ChFO+05Htf6JY50WzvDWZmtXUNGXEor80fXxhswwDJevGlZkyA==", + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/mongodb-version-manager/-/mongodb-version-manager-1.4.6.tgz", + "integrity": "sha512-UxXZy7iqHUa039Bp8e1Y2tSLh/X/JtHRqnlcVkqNEWpX/5ETPaKwrT7QIVZc1Tk5tEkQXjRHd6nQtUjcemOHmA==", "dev": true, "dependencies": { "ampersand-state": "^5.0.3", @@ -17764,9 +17494,9 @@ } }, "node_modules/mongodb-version-manager/node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==", "dev": true }, "node_modules/mongodb-version-manager/node_modules/chalk": { @@ -17795,7 +17525,7 @@ "node_modules/mongodb-version-manager/node_modules/decompress-response": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", "dev": true, "dependencies": { "mimic-response": "^1.0.0" @@ -17829,7 +17559,7 @@ "node_modules/mongodb-version-manager/node_modules/file-type": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", + "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", "dev": true, "engines": { "node": ">=4" @@ -17852,7 +17582,7 @@ "node_modules/mongodb-version-manager/node_modules/get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", "dev": true, "engines": { "node": ">=4" @@ -17916,7 +17646,7 @@ "node_modules/mongodb-version-manager/node_modules/p-event": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-event/-/p-event-1.3.0.tgz", - "integrity": "sha512-hV1zbA7gwqPVFcapfeATaNjQ3J0NuzorHPyG8GPL9g/Y/TplWVBVoCKCXL6Ej2zscrCEv195QNWJXuBH6XZuzA==", + "integrity": "sha1-jmtPT2XHK8W2/ii3XtqHT5akoIU=", "dev": true, "dependencies": { "p-timeout": "^1.1.1" @@ -17928,7 +17658,7 @@ "node_modules/mongodb-version-manager/node_modules/p-timeout": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", - "integrity": "sha512-gb0ryzr+K2qFqFv6qi3khoeqMZF/+ajxQipEF6NteZVnvz9tzdsfAVj3lYtn1gAXvH5lfLwfxEII799gt/mRIA==", + "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", "dev": true, "dependencies": { "p-finally": "^1.0.0" @@ -17940,7 +17670,7 @@ "node_modules/mongodb-version-manager/node_modules/pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true, "engines": { "node": ">=4" @@ -17949,7 +17679,7 @@ "node_modules/mongodb-version-manager/node_modules/prepend-http": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", "dev": true, "engines": { "node": ">=0.10.0" @@ -17979,7 +17709,7 @@ "node_modules/mongodb-version-manager/node_modules/url-parse-lax": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", "dev": true, "dependencies": { "prepend-http": "^1.0.1" @@ -18146,12 +17876,6 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, "node_modules/natural-orderby": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/natural-orderby/-/natural-orderby-2.0.3.tgz", @@ -18404,7 +18128,7 @@ "node_modules/npm-conf/node_modules/pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true, "engines": { "node": ">=4" @@ -18724,28 +18448,22 @@ } }, "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", + "dev": true }, "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.4.tgz", + "integrity": "sha512-1ZvAZ4wlF7IyPVOcE1Omikt7UpaFlOQq0HlSti+ZvDH3UiD2brwGMwDbyV43jao2bKJ+4+WdPJHSd7kgzKYVqg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.0", "define-properties": "^1.1.3" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object-keys": { @@ -18775,21 +18493,18 @@ } }, "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "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, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", "object-keys": "^1.1.1" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.assign/node_modules/object-keys": { @@ -18817,20 +18532,18 @@ } }, "node_modules/object.fromentries": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", - "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.3.tgz", + "integrity": "sha512-IDUSMXs6LOSJBWE++L0lzIbSqHl9KDCfff2x/JSEIDtEUavUnyMYC2ZGay/04Zq4UT8lvd4xNhU4/YHKibAOlw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "has": "^1.0.3" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.pick": { @@ -18846,20 +18559,18 @@ } }, "node_modules/object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.2.tgz", + "integrity": "sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "has": "^1.0.3" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/once": { @@ -20001,9 +19712,9 @@ } }, "node_modules/prettier": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz", - "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", "dev": true, "bin": { "prettier": "bin-prettier.js" @@ -20073,7 +19784,7 @@ "node_modules/proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", "dev": true }, "node_modules/prr": { @@ -20265,9 +19976,9 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/react-redux": { - "version": "7.2.9", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz", - "integrity": "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==", + "version": "7.2.8", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.8.tgz", + "integrity": "sha512-6+uDjhs3PSIclqoCk0kd6iX74gzrGc3W5zcAjbrFgEdIjRSQObdIwfx80unTkVUYvbQ95Y8Av3OvFHq1w5EOUw==", "dependencies": { "@babel/runtime": "^7.15.4", "@types/react-redux": "^7.1.20", @@ -20411,9 +20122,9 @@ } }, "node_modules/redux": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", - "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.0.tgz", + "integrity": "sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA==", "dependencies": { "@babel/runtime": "^7.9.2" } @@ -20421,7 +20132,7 @@ "node_modules/reflect.ownkeys": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz", - "integrity": "sha512-qOLsBKHCpSOFKK1NUOCGC5VyeufB6lEsFe92AL2bhIJsacZS1qdoOZSbPk3MYKuT2cFlRDnulKXuuElIrMjGUg==", + "integrity": "sha1-dJrO7H8/34tj+SegSAnpDFwLNGA=", "dev": true }, "node_modules/regenerator-runtime": { @@ -20443,20 +20154,47 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "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==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "es-abstract": "^1.17.0-next.1" }, "engines": { "node": ">= 0.4" + } + }, + "node_modules/regexp.prototype.flags/node_modules/es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/regexp.prototype.flags/node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" } }, "node_modules/regexpp": { @@ -20850,20 +20588,6 @@ "ret": "~0.1.10" } }, - "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -21157,9 +20881,9 @@ } }, "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -21270,17 +20994,13 @@ "optional": true }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.3.tgz", + "integrity": "sha512-A6+ByhlLkksFoUepsGxfj5x1gTSrs+OydsRptUxeNCabQpCFUvcwIczgOigI8vhY/OJCnPnyE9rGiwgvr9cS1g==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "es-abstract": "^1.18.0-next.0", + "object-inspect": "^1.8.0" } }, "node_modules/sift": { @@ -22079,31 +21799,23 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", + "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", + "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" } }, "node_modules/strip-ansi": { @@ -22818,9 +22530,9 @@ "dev": true }, "node_modules/ts-loader": { - "version": "9.4.2", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.2.tgz", - "integrity": "sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.1.tgz", + "integrity": "sha512-384TYAqGs70rn9F0VBnh6BPTfhga7yFNdC5gXbQpDrBj9/KsT4iRkGqKXhziofHOlE2j6YEaiTYVGKKvPhGWvw==", "dev": true, "dependencies": { "chalk": "^4.1.0", @@ -22996,20 +22708,6 @@ "node": ">=8" } }, - "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/typed-rest-client": { "version": "1.8.4", "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.4.tgz", @@ -23036,9 +22734,9 @@ } }, "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", + "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -23054,21 +22752,6 @@ "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", "dev": true }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/unbzip2-stream": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", @@ -23377,74 +23060,55 @@ } }, "node_modules/vscode-jsonrpc": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.1.0.tgz", - "integrity": "sha512-6TDy/abTQk+zDGYazgbIPc+4JoXdwC8NHU9Pbn4UJP1fehUyZmM4RHp5IthX7A6L5KS30PRui+j+tbbMMMafdw==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.0.2.tgz", + "integrity": "sha512-RY7HwI/ydoC1Wwg4gJ3y6LpU9FJRZAUnTYMXthqhFXXu77ErDd/xkREpGuk4MyYkk4a+XDWAMqe0S3KkelYQEQ==", "engines": { "node": ">=14.0.0" } }, "node_modules/vscode-languageclient": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-8.1.0.tgz", - "integrity": "sha512-GL4QdbYUF/XxQlAsvYWZRV3V34kOkpRlvV60/72ghHfsYFnS/v2MANZ9P6sHmxFcZKOse8O+L9G7Czg0NUWing==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-8.0.2.tgz", + "integrity": "sha512-lHlthJtphG9gibGb/y72CKqQUxwPsMXijJVpHEC2bvbFqxmkj9LwQ3aGU9dwjBLqsX1S4KjShYppLvg1UJDF/Q==", "dependencies": { - "minimatch": "^5.1.0", - "semver": "^7.3.7", - "vscode-languageserver-protocol": "3.17.3" + "minimatch": "^3.0.4", + "semver": "^7.3.5", + "vscode-languageserver-protocol": "3.17.2" }, "engines": { "vscode": "^1.67.0" } }, - "node_modules/vscode-languageclient/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/vscode-languageclient/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/vscode-languageserver": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-8.1.0.tgz", - "integrity": "sha512-eUt8f1z2N2IEUDBsKaNapkz7jl5QpskN2Y0G01T/ItMxBxw1fJwvtySGB9QMecatne8jFIWJGWI61dWjyTLQsw==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-8.0.2.tgz", + "integrity": "sha512-bpEt2ggPxKzsAOZlXmCJ50bV7VrxwCS5BI4+egUmure/oI/t4OlFzi/YNtVvY24A2UDOZAgwFGgnZPwqSJubkA==", "dependencies": { - "vscode-languageserver-protocol": "3.17.3" + "vscode-languageserver-protocol": "3.17.2" }, "bin": { "installServerIntoExtension": "bin/installServerIntoExtension" } }, "node_modules/vscode-languageserver-protocol": { - "version": "3.17.3", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.3.tgz", - "integrity": "sha512-924/h0AqsMtA5yK22GgMtCYiMdCOtWTSGgUOkgEDX+wk2b0x4sAfLiO4NxBxqbiVtz7K7/1/RgVrVI0NClZwqA==", + "version": "3.17.2", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.2.tgz", + "integrity": "sha512-8kYisQ3z/SQ2kyjlNeQxbkkTNmVFoQCqkmGrzLH6A9ecPlgTbp3wDTnUNqaUxYr4vlAcloxx8zwy7G5WdguYNg==", "dependencies": { - "vscode-jsonrpc": "8.1.0", - "vscode-languageserver-types": "3.17.3" + "vscode-jsonrpc": "8.0.2", + "vscode-languageserver-types": "3.17.2" } }, "node_modules/vscode-languageserver-textdocument": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.9.tgz", - "integrity": "sha512-NPfHVGFW2/fQEWHspr8x3PXhRgtFbuDZdl7p6ifuN3M7nk2Yjf5POr/NfDBuAiQG88DehDyJ7nGOT+p+edEtbw==" + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.7.tgz", + "integrity": "sha512-bFJH7UQxlXT8kKeyiyu41r22jCZXG8kuuVVA33OEJn1diWOZK5n8zBSPZFHVBOu8kXZ6h0LIRhf5UnCo61J4Hg==" }, "node_modules/vscode-languageserver-types": { - "version": "3.17.3", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.3.tgz", - "integrity": "sha512-SYU4z1dL0PyIMd4Vj8YOqFvHu7Hz/enbWtpfnVbJHU4Nd1YNYx8u0ennumc6h48GQNeOLxmwySmnADouT/AuZA==" + "version": "3.17.2", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.2.tgz", + "integrity": "sha512-zHhCWatviizPIq9B7Vh9uvrH6x3sK8itC84HkamnBWoDFJtzBf7SWlpLCZUit72b3os45h6RWQNC9xHRDF8dRA==" }, "node_modules/w3c-hr-time": { "version": "1.0.2", @@ -23514,9 +23178,9 @@ } }, "node_modules/webpack": { - "version": "5.75.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz", - "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==", + "version": "5.74.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", + "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -23742,47 +23406,11 @@ "node": ">= 8" } }, - "node_modules/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, - "dependencies": { - "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" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/which-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" }, - "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/wide-align": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", @@ -25657,25 +25285,13 @@ } }, "@babel/generator": { - "version": "7.21.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.1.tgz", - "integrity": "sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.0.tgz", + "integrity": "sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg==", "requires": { - "@babel/types": "^7.21.0", + "@babel/types": "^7.19.0", "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" - }, - "dependencies": { - "@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - } } }, "@babel/helper-compilation-targets": { @@ -25702,12 +25318,12 @@ "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==" }, "@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", "requires": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" } }, "@babel/helper-hoist-variables": { @@ -25763,9 +25379,9 @@ } }, "@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==" + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", + "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==" }, "@babel/helper-validator-identifier": { "version": "7.19.1", @@ -25818,9 +25434,9 @@ } }, "@babel/parser": { - "version": "7.21.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.1.tgz", - "integrity": "sha512-JzhBFpkuhBNYUY7qs+wTzNmyCWUHEaAFpQQD2YfU1rPL38/L43Wvid0fFkiOCnHvsGncRZgEPyGnltABLcVDTg==" + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.1.tgz", + "integrity": "sha512-h7RCSorm1DdTVGJf3P2Mhj3kdnkmF/EiysUkzS2TdgAYqyjFdMQJbVuXOBej2SBJaXan/lIVtT6KkGbyyq753A==" }, "@babel/plugin-syntax-async-generators": { "version": "7.8.4", @@ -25971,39 +25587,39 @@ } }, "@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", "requires": { "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" } }, "@babel/traverse": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.0.tgz", - "integrity": "sha512-Xdt2P1H4LKTO8ApPfnO1KmzYMFpp7D/EinoXzLYN/cHcBNrVCAkAtGUcXnHXrl/VGktureU6fkQrHSBE2URfoA==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.1.tgz", + "integrity": "sha512-0j/ZfZMxKukDaag2PtOPDbwuELqIar6lLskVPPJDjXMXjfLb1Obo/1yjxIGqqAJrmfaTIY3z2wFLAQ7qSkLsuA==", "requires": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.0", + "@babel/generator": "^7.19.0", "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", + "@babel/helper-function-name": "^7.19.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.0", - "@babel/types": "^7.21.0", + "@babel/parser": "^7.19.1", + "@babel/types": "^7.19.0", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.0.tgz", - "integrity": "sha512-uR7NWq2VNFnDi7EYqiRz2Jv/VQIu38tu64Zy8TX2nQFQ6etJ9V/Rr2msW8BS132mum2rL645qpDrLtAJtVpuow==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", + "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", "requires": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" } }, @@ -26161,15 +25777,15 @@ "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" }, "@eslint/eslintrc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", - "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.2.tgz", + "integrity": "sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.4.0", - "globals": "^13.19.0", + "globals": "^13.15.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -26184,18 +25800,18 @@ "dev": true }, "globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", "dev": true, "requires": { "type-fest": "^0.20.2" } }, "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true }, "js-yaml": { @@ -26225,24 +25841,24 @@ } }, "@fortawesome/fontawesome-common-types": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.3.0.tgz", - "integrity": "sha512-4BC1NMoacEBzSXRwKjZ/X/gmnbp/HU5Qqat7E8xqorUtBFZS+bwfGH5/wqOC2K6GV0rgEobp3OjGRMa5fK9pFg==" + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.2.0.tgz", + "integrity": "sha512-rBevIsj2nclStJ7AxTdfsa3ovHb1H+qApwrxcTVo+NNdeJiB9V75hsKfrkG5AwNcRUNxrPPiScGYCNmLMoh8pg==" }, "@fortawesome/fontawesome-svg-core": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.3.0.tgz", - "integrity": "sha512-uz9YifyKlixV6AcKlOX8WNdtF7l6nakGyLYxYaCa823bEBqyj/U2ssqtctO38itNEwXb8/lMzjdoJ+aaJuOdrw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.2.0.tgz", + "integrity": "sha512-Cf2mAAeMWFMzpLC7Y9H1I4o3wEU+XovVJhTiNG8ZNgSQj53yl7OCJaS80K4YjrABWZzbAHVaoHE1dVJ27AAYXw==", "requires": { - "@fortawesome/fontawesome-common-types": "6.3.0" + "@fortawesome/fontawesome-common-types": "6.2.0" } }, "@fortawesome/free-solid-svg-icons": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.3.0.tgz", - "integrity": "sha512-x5tMwzF2lTH8pyv8yeZRodItP2IVlzzmBuD1M7BjawWgg9XAvktqJJ91Qjgoaf8qJpHQ8FEU9VxRfOkLhh86QA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.2.0.tgz", + "integrity": "sha512-UjCILHIQ4I8cN46EiQn0CZL/h8AwCGgR//1c4R96Q5viSRwuKVo0NdQEc4bm+69ZwC0dUvjbDqAHF1RR5FA3XA==", "requires": { - "@fortawesome/fontawesome-common-types": "6.3.0" + "@fortawesome/fontawesome-common-types": "6.2.0" } }, "@fortawesome/react-fontawesome": { @@ -26254,27 +25870,22 @@ } }, "@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", + "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "dependencies": { - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } + "minimatch": "^3.0.4" } }, + "@humanwhocodes/gitignore-to-minimatch": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", + "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", + "dev": true + }, "@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -26288,9 +25899,9 @@ "dev": true }, "@iconify-icons/codicon": { - "version": "1.2.21", - "resolved": "https://registry.npmjs.org/@iconify-icons/codicon/-/codicon-1.2.21.tgz", - "integrity": "sha512-thIa+5jVVVSz048cSQQpQfnXU+zfQjxF3ofmkZHN+7fc6cHclKRxPPXSeVj7dHZzpgQx4pbijHPIUzIni+Pegw==", + "version": "1.2.16", + "resolved": "https://registry.npmjs.org/@iconify-icons/codicon/-/codicon-1.2.16.tgz", + "integrity": "sha512-85rBsFEhhq2qSBfIEF0hzUk31i4GjeRzNyd0DZGFWo5v+PgAeTBiv8ftsTDf8d2fxy9F5kesT/R7bOtRy1xKmw==", "requires": { "@iconify/types": "*" } @@ -26837,9 +26448,9 @@ } }, "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", + "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==" }, "@jridgewell/set-array": { "version": "1.1.2", @@ -26857,9 +26468,9 @@ } }, "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", + "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==" }, "@jridgewell/trace-mapping": { "version": "0.3.9", @@ -26930,14 +26541,14 @@ } }, "@leafygreen-ui/logo": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@leafygreen-ui/logo/-/logo-6.3.0.tgz", - "integrity": "sha512-hxAevbD/wfOjobRp7rVhqPyV/oFRUgwLuUdPn+JG1cBT/ALIeqz7fRz4jE6SyNc3ZXSWvphw/zHaKQSExVcXQQ==" + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/@leafygreen-ui/logo/-/logo-6.1.3.tgz", + "integrity": "sha512-b0UfZ6ypwRenw8DxhbwDd3B0JiSdTHCsTE8yQ2wBqQgTazIlz9WoFEjCrSaVv/oZ3XQnY4CBUjEfYGQ8aVOjTA==" }, "@leafygreen-ui/palette": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/@leafygreen-ui/palette/-/palette-3.4.7.tgz", - "integrity": "sha512-AsvPlbvF7CERiZbAQR8hy3lAJ2/rieXI3cO0jsOwV8ztDqYNotKAdLujyr/NviudrRUenYiXrLizIKVlSPUMuA==" + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@leafygreen-ui/palette/-/palette-3.4.2.tgz", + "integrity": "sha512-uR+fPOlU2Hyg1gHb4iFDtZE1SRmuj591apZpHYwAJ3JF1oqHmHVUZy9XTGN+V1Y299FGWsKrCU7OJxS7bg3nDg==" }, "@leafygreen-ui/toggle": { "version": "7.0.5", @@ -26979,9 +26590,9 @@ } }, "@mongodb-js/mongodb-constants": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@mongodb-js/mongodb-constants/-/mongodb-constants-0.2.2.tgz", - "integrity": "sha512-vm1G+/WRWmXGyE9ZnhDv9toe+LRu1x0F/lGEwqWESfBiUUUuVZhj25fS2o4IL7H4pJ31sFxr7/gu+ER8OkmtzA==" + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@mongodb-js/mongodb-constants/-/mongodb-constants-0.2.1.tgz", + "integrity": "sha512-arCTQYvK9scQszbQQcPba7Ru5HYrc8YINcGcM4HKMCcg+8A17U+3Y3AEI7N/oe2VE+1GFsrh8MoKBch4jEvY1g==" }, "@mongodb-js/prettier-config-compass": { "version": "1.0.0", @@ -27536,18 +27147,18 @@ "dev": true }, "@types/analytics-node": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/@types/analytics-node/-/analytics-node-3.1.10.tgz", - "integrity": "sha512-dvn8iy2EQZDlQGgRNT9SW2Ljn9L3VgwcrpJvonufnNygZWB1XEufXNvDhUtwNUqNyHhD0hbDCCFb9j+B7vE5cA==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@types/analytics-node/-/analytics-node-3.1.9.tgz", + "integrity": "sha512-C7L7/Dd/CmBST7AvgoCnf4yI9h6W5aYfCOcfUZS5GHlXDQjnXLVOUDpTdwTIZjW4lKECeil6+G+Ul6Xzwv/P0g==", "dev": true }, "@types/babel__core": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", - "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", + "version": "7.1.19", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", + "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", "requires": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" @@ -27571,9 +27182,9 @@ } }, "@types/babel__traverse": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", - "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", + "version": "7.18.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.1.tgz", + "integrity": "sha512-FSdLaZh2UxaMuLp9lixWaHq/golWTRWOnRsAXzDTDSDOQLuZb1nsdCt6pJSPWSEQt2eFZ2YVk3oYhn+1kLMeMA==", "requires": { "@babel/types": "^7.3.0" } @@ -27585,9 +27196,9 @@ "dev": true }, "@types/chai": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", - "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==" + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.3.tgz", + "integrity": "sha512-hC7OMnszpxhZPduX+m+nrx+uFoLkWOMiR4oa/AZF3MuSETYTZmFfJAHqZEM8MVlvfG7BEUcgvtwoCTxBp6hm3g==" }, "@types/chai-fs": { "version": "2.0.2", @@ -27830,9 +27441,9 @@ "dev": true }, "@types/node": { - "version": "14.18.36", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.36.tgz", - "integrity": "sha512-FXKWbsJ6a1hIrRxv+FoukuHnGTgEzKYGi7kilfMae96AL9UNkPFNWJEEYWzdRI9ooIkbr4AKldyuSTLql06vLQ==" + "version": "14.18.29", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.29.tgz", + "integrity": "sha512-LhF+9fbIX4iPzhsRLpK5H7iPdvW8L4IwGciXQIOEcuF62+9nw/VQVsOViAOOGxY3OlOKGLFv0sWwJXdwQeTn6A==" }, "@types/normalize-package-data": { "version": "2.4.0", @@ -27891,12 +27502,6 @@ "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" }, - "@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", - "dev": true - }, "@types/sinon": { "version": "9.0.11", "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-9.0.11.tgz", @@ -27964,18 +27569,16 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.53.0.tgz", - "integrity": "sha512-alFpFWNucPLdUOySmXCJpzr6HKC3bu7XooShWM+3w/EL6J2HIoB2PFxpLnq4JauWVk6DiVeNKzQlFEaE+X9sGw==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.38.0.tgz", + "integrity": "sha512-GgHi/GNuUbTOeoJiEANi0oI6fF3gBQc3bGFYj40nnAPCbhrtEDf2rjBmefFadweBmO1Du1YovHeDP2h5JLhtTQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.53.0", - "@typescript-eslint/type-utils": "5.53.0", - "@typescript-eslint/utils": "5.53.0", + "@typescript-eslint/scope-manager": "5.38.0", + "@typescript-eslint/type-utils": "5.38.0", + "@typescript-eslint/utils": "5.38.0", "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", "regexpp": "^3.2.0", "semver": "^7.3.7", "tsutils": "^3.21.0" @@ -27990,53 +27593,53 @@ } }, "@typescript-eslint/parser": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.53.0.tgz", - "integrity": "sha512-MKBw9i0DLYlmdOb3Oq/526+al20AJZpANdT6Ct9ffxcV8nKCHz63t/S0IhlTFNsBIHJv+GY5SFJ0XfqVeydQrQ==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.38.0.tgz", + "integrity": "sha512-/F63giJGLDr0ms1Cr8utDAxP2SPiglaD6V+pCOcG35P2jCqdfR7uuEhz1GIC3oy4hkUF8xA1XSXmd9hOh/a5EA==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.53.0", - "@typescript-eslint/types": "5.53.0", - "@typescript-eslint/typescript-estree": "5.53.0", + "@typescript-eslint/scope-manager": "5.38.0", + "@typescript-eslint/types": "5.38.0", + "@typescript-eslint/typescript-estree": "5.38.0", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.53.0.tgz", - "integrity": "sha512-Opy3dqNsp/9kBBeCPhkCNR7fmdSQqA+47r21hr9a14Bx0xnkElEQmhoHga+VoaoQ6uDHjDKmQPIYcUcKJifS7w==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.38.0.tgz", + "integrity": "sha512-ByhHIuNyKD9giwkkLqzezZ9y5bALW8VNY6xXcP+VxoH4JBDKjU5WNnsiD4HJdglHECdV+lyaxhvQjTUbRboiTA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.53.0", - "@typescript-eslint/visitor-keys": "5.53.0" + "@typescript-eslint/types": "5.38.0", + "@typescript-eslint/visitor-keys": "5.38.0" } }, "@typescript-eslint/type-utils": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.53.0.tgz", - "integrity": "sha512-HO2hh0fmtqNLzTAme/KnND5uFNwbsdYhCZghK2SoxGp3Ifn2emv+hi0PBUjzzSh0dstUIFqOj3bp0AwQlK4OWw==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.38.0.tgz", + "integrity": "sha512-iZq5USgybUcj/lfnbuelJ0j3K9dbs1I3RICAJY9NZZpDgBYXmuUlYQGzftpQA9wC8cKgtS6DASTvF3HrXwwozA==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.53.0", - "@typescript-eslint/utils": "5.53.0", + "@typescript-eslint/typescript-estree": "5.38.0", + "@typescript-eslint/utils": "5.38.0", "debug": "^4.3.4", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.53.0.tgz", - "integrity": "sha512-5kcDL9ZUIP756K6+QOAfPkigJmCPHcLN7Zjdz76lQWWDdzfOhZDTj1irs6gPBKiXx5/6O3L0+AvupAut3z7D2A==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.38.0.tgz", + "integrity": "sha512-HHu4yMjJ7i3Cb+8NUuRCdOGu2VMkfmKyIJsOr9PfkBVYLYrtMCK/Ap50Rpov+iKpxDTfnqvDbuPLgBE5FwUNfA==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.53.0.tgz", - "integrity": "sha512-eKmipH7QyScpHSkhbptBBYh9v8FxtngLquq292YTEQ1pxVs39yFBlLC1xeIZcPPz1RWGqb7YgERJRGkjw8ZV7w==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.38.0.tgz", + "integrity": "sha512-6P0RuphkR+UuV7Avv7MU3hFoWaGcrgOdi8eTe1NwhMp2/GjUJoODBTRWzlHpZh6lFOaPmSvgxGlROa0Sg5Zbyg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.53.0", - "@typescript-eslint/visitor-keys": "5.53.0", + "@typescript-eslint/types": "5.38.0", + "@typescript-eslint/visitor-keys": "5.38.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -28045,28 +27648,26 @@ } }, "@typescript-eslint/utils": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.53.0.tgz", - "integrity": "sha512-VUOOtPv27UNWLxFwQK/8+7kvxVC+hPHNsJjzlJyotlaHjLSIgOCKj9I0DBUjwOOA64qjBwx5afAPjksqOxMO0g==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.38.0.tgz", + "integrity": "sha512-6sdeYaBgk9Fh7N2unEXGz+D+som2QCQGPAf1SxrkEr+Z32gMreQ0rparXTNGRRfYUWk/JzbGdcM8NSSd6oqnTA==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.53.0", - "@typescript-eslint/types": "5.53.0", - "@typescript-eslint/typescript-estree": "5.53.0", + "@typescript-eslint/scope-manager": "5.38.0", + "@typescript-eslint/types": "5.38.0", + "@typescript-eslint/typescript-estree": "5.38.0", "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", - "semver": "^7.3.7" + "eslint-utils": "^3.0.0" } }, "@typescript-eslint/visitor-keys": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.53.0.tgz", - "integrity": "sha512-JqNLnX3leaHFZEN0gCh81sIvgrp/2GOACZNgO4+Tkf64u51kTpAyWFOY8XHx8XuXr3N2C9zgPPHtcpMg6z1g0w==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.38.0.tgz", + "integrity": "sha512-MxnrdIyArnTi+XyFLR+kt/uNAcdOnmT+879os7qDRI+EYySR4crXJq9BXPfRzzLGq0wgxkwidrCJ9WCAoacm1w==", "dev": true, "requires": { - "@typescript-eslint/types": "5.53.0", + "@typescript-eslint/types": "5.38.0", "eslint-visitor-keys": "^3.3.0" }, "dependencies": { @@ -28085,9 +27686,9 @@ "dev": true }, "@vscode/test-electron": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.2.3.tgz", - "integrity": "sha512-7DmdGYQTqRNaLHKG3j56buc9DkstriY4aV0S3Zj32u0U9/T0L8vwWAC9QGCh1meu1VXDEla1ze27TkqysHGP0Q==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.1.5.tgz", + "integrity": "sha512-O/ioqFpV+RvKbRykX2ItYPnbcZ4Hk5V0rY4uhQjQTLhGL9WZUvS7exzuYQCCI+ilSqJpctvxq2llTfGXf9UnnA==", "dev": true, "requires": { "http-proxy-agent": "^4.0.1", @@ -28698,7 +28299,7 @@ "ansi": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz", - "integrity": "sha512-iFY7JCgHbepc0b82yLaw4IMortylNb6wG4kL+4R0C3iv6i+RHGHux/yUX5BTiRvSX/shMnngjR1YyNMnXEFh5A==", + "integrity": "sha1-DELU+xcWDVqa8eSEus4cZpIsGyE=", "dev": true }, "ansi-colors": { @@ -28904,15 +28505,40 @@ "dev": true }, "array.prototype.find": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.2.1.tgz", - "integrity": "sha512-I2ri5Z9uMpMvnsNrHre9l3PaX+z9D0/z6F7Yt2u15q7wt0I62g5kX6xUKR1SJiefgG+u2/gJUmM8B47XRvQR6w==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.1.1.tgz", + "integrity": "sha512-mi+MYNJYLTx2eNYy+Yh6raoQacCsNeeMUaspFPh9Y141lFSsWxxB8V9mM2ye+eqiRs917J6/pJ4M9ZPzenWckA==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.4" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "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.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + } } }, "array.prototype.flat": { @@ -29009,12 +28635,6 @@ "postcss-value-parser": "^4.1.0" } }, - "available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true - }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -29447,12 +29067,13 @@ } }, "bson-transpilers": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bson-transpilers/-/bson-transpilers-2.0.2.tgz", - "integrity": "sha512-FmY2vXr54rEcftux3/gspJ9RivX/kPz4O5XdAVuL2OxqYowXcDro+SETnMq5gWIy613o3DPLdGuAalDADOMHSQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bson-transpilers/-/bson-transpilers-2.0.0.tgz", + "integrity": "sha512-gHd/NCuZsbn+61uh1pDxI0dQxxkkq9SqsSc8hWN1Lwvu2dbnDLcPfBDaL3meYxb/sTDg+5drETbqgMwNsWg1vw==", "requires": { "antlr4": "4.7.2", "bson": "^4.4.1", + "context-eval": "^0.1.0", "js-yaml": "^3.13.1" } }, @@ -29558,13 +29179,13 @@ } }, "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz", + "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==", "dev": true, "requires": { "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "get-intrinsic": "^1.0.0" } }, "call-me-maybe": { @@ -29652,14 +29273,14 @@ } }, "chai": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", - "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", + "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", "dev": true, "requires": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", - "deep-eql": "^4.1.2", + "deep-eql": "^3.0.1", "get-func-name": "^2.0.0", "loupe": "^2.3.1", "pathval": "^1.1.1", @@ -30416,9 +30037,9 @@ } }, "config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", + "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", "dev": true, "requires": { "ini": "^1.3.4", @@ -30462,6 +30083,11 @@ "safe-buffer": "5.1.2" } }, + "context-eval": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/context-eval/-/context-eval-0.1.0.tgz", + "integrity": "sha1-P8pxfX3wI6l4XwjGWkGJo93wP6s=" + }, "context-map-webpack-plugin": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/context-map-webpack-plugin/-/context-map-webpack-plugin-0.1.0.tgz", @@ -30579,7 +30205,7 @@ "css-select": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha512-dUQOBoqdR7QwV90WysXPLXG5LO7nhYBgiWVfxF80DKPF8zx1t/pUd2FYy73emg3zrjtM6dzmYgbHKfV2rxiHQA==", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", "dev": true, "requires": { "boolbase": "~1.0.0", @@ -30880,9 +30506,9 @@ } }, "deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", "dev": true, "requires": { "type-detect": "^4.0.0" @@ -30923,13 +30549,12 @@ } }, "define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "dev": true, "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" + "object-keys": "^1.0.12" }, "dependencies": { "object-keys": { @@ -31212,7 +30837,7 @@ "docopt": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/docopt/-/docopt-0.6.2.tgz", - "integrity": "sha512-NqTbaYeE4gA/wU1hdKFdU+AFahpDOpgGLzHP42k6H6DKExJd0A55KEVWYhL9FEmHmgeLvEU2vuKXDuU+4yToOw==", + "integrity": "sha1-so6eIiDaXsSffqW7JKR3h0Be6xE=", "dev": true }, "doctrine": { @@ -31274,7 +30899,7 @@ "domutils": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", "dev": true, "requires": { "dom-serializer": "0", @@ -31282,14 +30907,14 @@ } }, "dotenv": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", - "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==" + "version": "16.0.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.2.tgz", + "integrity": "sha512-JvpYKUmzQhYoIFgK2MOnF3bciIZoItIIoryihy0rIA+H4Jy0FmgyKYAHCTN98P5ybGSJcIFbh6QKeJdtZd1qhA==" }, "downcache": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/downcache/-/downcache-0.0.9.tgz", - "integrity": "sha512-AssoVsNYu5DnPY0Ro67lkbiAr66sk5IHuiIGm3pzFzWmTzkcEoFjDlG8szzP4x+ZN2OHehKTZbwDrC7l2Q52+g==", + "integrity": "sha1-eQuwQkaJE2EVzpPyqhWUbG2AbQ4=", "dev": true, "requires": { "extend": "^3.0.0", @@ -31304,7 +30929,7 @@ "gauge": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.7.tgz", - "integrity": "sha512-fVbU2wRE91yDvKUnrIaQlHKAWKY5e08PmztCrwuH5YVQ+Z/p3d0ny2T48o6uvAAXHIUnfaQdHkmxYbQft1eHVA==", + "integrity": "sha1-6c7FSD09TuDvRLYKfZnkk14TbZM=", "dev": true, "requires": { "ansi": "^0.3.0", @@ -31315,18 +30940,18 @@ } }, "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { - "minimist": "^1.2.6" + "minimist": "^1.2.5" } }, "npmlog": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-2.0.4.tgz", - "integrity": "sha512-DaL6RTb8Qh4tMe2ttPT1qWccETy2Vi5/8p+htMpLBeXJTr2CAqnF5WQtSP2eFpvaNbhLZ5uilDb98mRm4Q+lZQ==", + "integrity": "sha1-mLUlMPJRTKkNCexbIsiEZyI3VpI=", "dev": true, "requires": { "ansi": "~0.3.1", @@ -31446,17 +31071,17 @@ } }, "ejson-shell-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ejson-shell-parser/-/ejson-shell-parser-1.2.1.tgz", - "integrity": "sha512-xXRwH+O4EtL62ue8EmY8vNVr/AGRbRIv76WNuhXoWWwcT5TAvGKe4AqJh46QNXisVZe5e1JxvBdTnD3SO8ZLzA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ejson-shell-parser/-/ejson-shell-parser-1.2.0.tgz", + "integrity": "sha512-2DbCot5/HYcO6kY91nLU5I0CKLTuK9LiKiwaY7OFvfqf3xVgYAvUiLAQKHKeqUFlIUXY3KwRtXfaF5Vic6R1dA==", "requires": { "acorn": "^8.1.0" }, "dependencies": { "acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==" + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==" } } }, @@ -31558,17 +31183,17 @@ } }, "enzyme-adapter-react-16": { - "version": "1.15.7", - "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.15.7.tgz", - "integrity": "sha512-LtjKgvlTc/H7adyQcj+aq0P0H07LDL480WQl1gU512IUyaDo/sbOaNDdZsJXYW2XaoPqrLLE9KbZS+X2z6BASw==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.15.6.tgz", + "integrity": "sha512-yFlVJCXh8T+mcQo8M6my9sPgeGzj85HSHi6Apgf1Cvq/7EL/J9+1JoJmJsRxZgyTvPMAqOEpRSu/Ii/ZpyOk0g==", "dev": true, "requires": { - "enzyme-adapter-utils": "^1.14.1", - "enzyme-shallow-equal": "^1.0.5", + "enzyme-adapter-utils": "^1.14.0", + "enzyme-shallow-equal": "^1.0.4", "has": "^1.0.3", - "object.assign": "^4.1.4", - "object.values": "^1.1.5", - "prop-types": "^15.8.1", + "object.assign": "^4.1.2", + "object.values": "^1.1.2", + "prop-types": "^15.7.2", "react-is": "^16.13.1", "react-test-renderer": "^16.0.0-0", "semver": "^5.7.0" @@ -31583,17 +31208,17 @@ } }, "enzyme-adapter-utils": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.14.1.tgz", - "integrity": "sha512-JZgMPF1QOI7IzBj24EZoDpaeG/p8Os7WeBZWTJydpsH7JRStc7jYbHE4CmNQaLqazaGFyLM8ALWA3IIZvxW3PQ==", + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.14.0.tgz", + "integrity": "sha512-F/z/7SeLt+reKFcb7597IThpDp0bmzcH1E9Oabqv+o01cID2/YInlqHbFl7HzWBl4h3OdZYedtwNDOmSKkk0bg==", "dev": true, "requires": { "airbnb-prop-types": "^2.16.0", - "function.prototype.name": "^1.1.5", + "function.prototype.name": "^1.1.3", "has": "^1.0.3", - "object.assign": "^4.1.4", - "object.fromentries": "^2.0.5", - "prop-types": "^15.8.1", + "object.assign": "^4.1.2", + "object.fromentries": "^2.0.3", + "prop-types": "^15.7.2", "semver": "^5.7.1" }, "dependencies": { @@ -31606,13 +31231,13 @@ } }, "enzyme-shallow-equal": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.5.tgz", - "integrity": "sha512-i6cwm7hN630JXenxxJFBKzgLC3hMTafFQXflvzHgPmDhOBhxUWDe8AeRv1qp2/uWJ2Y8z5yLWMzmAfkTOiOCZg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.4.tgz", + "integrity": "sha512-MttIwB8kKxypwHvRynuC3ahyNc+cFbR8mjVIltnmzQ0uKGqmsfO4bfBuLxb0beLNPhjblUEYvEbsg+VSygvF1Q==", "dev": true, "requires": { "has": "^1.0.3", - "object-is": "^1.1.5" + "object-is": "^1.1.2" } }, "errno": { @@ -31633,44 +31258,23 @@ } }, "es-abstract": { - "version": "1.21.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", - "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", "dev": true, "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.4", - "is-array-buffer": "^3.0.1", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" }, "dependencies": { "object-keys": { @@ -31687,26 +31291,6 @@ "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", "dev": true }, - "es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" - } - }, - "es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, "es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -31848,15 +31432,15 @@ } }, "eslint": { - "version": "8.34.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.34.0.tgz", - "integrity": "sha512-1Z8iFsucw+7kSqXNZVslXS8Ioa4u2KM7GPwuKtkTFAqZ/cHMcEaR+1+Br0wLlot49cNxIiZk5wp8EAbPcYZxTg==", + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.1.tgz", + "integrity": "sha512-w7C1IXCc6fNqjpuYd0yPlcTKKmHlHHktRkzmBPZ+7cvNBQuiNjx0xaMTjAJGCafJhQkrFJooREv0CtrVzmHwqg==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.4.1", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint/eslintrc": "^1.3.2", + "@humanwhocodes/config-array": "^0.10.4", + "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -31872,14 +31456,14 @@ "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", + "glob-parent": "^6.0.1", + "globals": "^13.15.0", + "globby": "^11.1.0", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", @@ -31979,9 +31563,9 @@ } }, "globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -32494,9 +32078,9 @@ "dev": true }, "espree": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", - "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", + "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", "dev": true, "requires": { "acorn": "^8.8.0", @@ -32505,9 +32089,9 @@ }, "dependencies": { "acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", "dev": true }, "eslint-visitor-keys": { @@ -33179,15 +32763,6 @@ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.5.tgz", "integrity": "sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA==" }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "requires": { - "is-callable": "^1.1.3" - } - }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -33331,15 +32906,15 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.3.tgz", + "integrity": "sha512-H51qkbNSp8mtkJt+nyW1gyStBiKZxfRqySNUR99ylq6BPXHKI4SEvIlTKp4odLfjRKJV04DFWMU3G/YRlQOsag==", "dev": true, "requires": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "es-abstract": "^1.18.0-next.1", + "functions-have-names": "^1.2.1" } }, "functional-red-black-tree": { @@ -33349,9 +32924,9 @@ "dev": true }, "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.1.tgz", + "integrity": "sha512-j48B/ZI7VKs3sgeI2cZp7WXWmZXu7Iq5pl5/vptV5N2mq+DGFuS/ulaDjtaoLpYzuD6u8UgrUKHfgo7fDTSiBA==", "dev": true }, "gauge": { @@ -33406,14 +32981,14 @@ "dev": true }, "get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz", + "integrity": "sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg==", "dev": true, "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", - "has-symbols": "^1.0.3" + "has-symbols": "^1.0.1" } }, "get-mongodb-version": { @@ -33463,16 +33038,6 @@ "pump": "^3.0.0" } }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", @@ -33544,15 +33109,6 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, - "globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3" - } - }, "globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -33575,15 +33131,6 @@ } } }, - "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.3" - } - }, "got": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", @@ -33696,32 +33243,11 @@ "function-bind": "^1.1.1" } }, - "has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true - }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, - "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.1" - } - }, - "has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true - }, "has-symbol-support-x": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", @@ -33729,9 +33255,9 @@ "dev": true }, "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", "dev": true }, "has-to-string-tag-x": { @@ -33743,15 +33269,6 @@ "has-symbol-support-x": "^1.4.1" } }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", @@ -34086,14 +33603,41 @@ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, "internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.2.tgz", + "integrity": "sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g==", "dev": true, "requires": { - "get-intrinsic": "^1.2.0", + "es-abstract": "^1.17.0-next.1", "has": "^1.0.3", - "side-channel": "^1.0.4" + "side-channel": "^1.0.2" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "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.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + } } }, "interpret": { @@ -34175,31 +33719,11 @@ } } }, - "is-array-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz", - "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-typed-array": "^1.1.10" - } - }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "requires": { - "has-bigints": "^1.0.1" - } - }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -34210,14 +33734,10 @@ } }, "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.1.tgz", + "integrity": "sha512-TqZuVwa/sppcrhUCAYkGBk7w0yxfQQnxq28fjkO53tnK9FQXmdwz2JS5+GjsWQ6RByES1K40nI+yDic5c9/aAQ==", + "dev": true }, "is-buffer": { "version": "1.1.6", @@ -34225,9 +33745,9 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", "dev": true }, "is-ci": { @@ -34414,9 +33934,9 @@ "dev": true }, "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", + "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", "dev": true }, "is-number": { @@ -34436,12 +33956,6 @@ "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==", "dev": true }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, "is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", @@ -34469,13 +33983,12 @@ "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" }, "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "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": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "has-symbols": "^1.0.1" } }, "is-retry-allowed": { @@ -34483,15 +33996,6 @@ "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" }, - "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -34499,13 +34003,10 @@ "dev": true }, "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true }, "is-subset": { "version": "0.1.1", @@ -34522,19 +34023,6 @@ "has-symbols": "^1.0.1" } }, - "is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - } - }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -34551,15 +34039,6 @@ "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, "is-what": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.12.0.tgz", @@ -36809,8 +36288,7 @@ "jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "optional": true + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" }, "jsonpointer.js": { "version": "0.4.0", @@ -36822,7 +36300,6 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "optional": true, "requires": { "jsonparse": "^1.2.0", "through": ">=2.2.7 <3" @@ -36968,7 +36445,7 @@ "klaw": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", "dev": true, "requires": { "graceful-fs": "^4.1.9" @@ -37188,13 +36665,7 @@ "lodash.assignin": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", - "integrity": "sha512-yX/rx6d/UTVh7sSVWVSIMjfnz95evAgDFdb1ZozC35I9mSFCkmzptOzevxjgbQUsc78NR44LVHWjsoMQXy9FDg==", - "dev": true - }, - "lodash.bind": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", - "integrity": "sha512-lxdsn7xxlCymgLYo1gGvVrfHmkjDiyqVv62FAeF2i5ta72BipE1SLxw8hPEPLhD4/247Ijw07UQH7Hq/chT5LA==", + "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=", "dev": true }, "lodash.camelcase": { @@ -37218,19 +36689,19 @@ "lodash.difference": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==", + "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=", "dev": true }, "lodash.filter": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", - "integrity": "sha512-pXYUy7PR8BCLwX5mgJ/aNtyOvuJTdZAo9EQFUvMIYugqmJxnrYaANvTbgndOzHSCSR0wnlBBfRXJL5SbWxo3FQ==", + "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=", "dev": true }, "lodash.flatten": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", "dev": true }, "lodash.flattendeep": { @@ -37242,7 +36713,7 @@ "lodash.foreach": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", - "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==", + "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=", "dev": true }, "lodash.forin": { @@ -37258,8 +36729,7 @@ "lodash.isfunction": { "version": "3.0.9", "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", - "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==", - "optional": true + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==" }, "lodash.isplainobject": { "version": "4.0.6", @@ -37274,7 +36744,7 @@ "lodash.map": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", - "integrity": "sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==", + "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=", "dev": true }, "lodash.merge": { @@ -37286,56 +36756,55 @@ "lodash.pad": { "version": "4.5.1", "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.5.1.tgz", - "integrity": "sha512-mvUHifnLqM+03YNzeTBS1/Gr6JRFjd3rRx88FHWUvamVaT9k2O/kXha3yBSOwB9/DTQrSTLJNHvLBBt2FdX7Mg==", + "integrity": "sha1-QzCUmoM6fI2iLMIPaibE1Z3runA=", "dev": true }, "lodash.padend": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", - "integrity": "sha512-sOQs2aqGpbl27tmCS1QNZA09Uqp01ZzWfDUoD+xzTii0E7dSQfRKcRetFwa+uXaxaqL+TKm7CgD2JdKP7aZBSw==", + "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=", "dev": true }, "lodash.padstart": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz", - "integrity": "sha512-sW73O6S8+Tg66eY56DBk85aQzzUJDtpoXFBgELMd5P/SotAguo+1kYO6RuYgXxA4HJH3LFTFPASX6ET6bjfriw==", + "integrity": "sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs=", "dev": true }, "lodash.pick": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==", + "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=", "dev": true }, "lodash.reduce": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", - "integrity": "sha512-6raRe2vxCYBhpBu+B+TtNGUzah+hQjVdu3E17wfusjyrXBka2nBS8OH/gjVZ5PvHOhWmIZTYri09Z6n/QfnNMw==", + "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=", "dev": true }, "lodash.reject": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz", - "integrity": "sha512-qkTuvgEzYdyhiJBx42YPzPo71R1aEr0z79kAv7Ixg8wPFEjgRgJdUsGMG3Hf3OYSF/kHI79XhNlt+5Ar6OzwxQ==", + "integrity": "sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU=", "dev": true }, "lodash.some": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", - "integrity": "sha512-j7MJE+TuT51q9ggt4fSgVqro163BEFjAt3u97IqU+JA2DkWl80nFTrowzLpZ/BnpN7rrl0JA/593NAdd8p/scQ==", + "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=", "dev": true }, "lodash.startswith": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/lodash.startswith/-/lodash.startswith-4.2.1.tgz", - "integrity": "sha512-XClYR1h4/fJ7H+mmCKppbiBmljN/nGs73iq2SjCT9SF4CBPoUHzLvWmH1GtZMhMBZSiRkHXfeA2RY1eIlJ75ww==", + "integrity": "sha1-xZjErc4YiiflMUVzHNxsDnF3YAw=", "dev": true }, "lodash.transform": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.transform/-/lodash.transform-4.6.0.tgz", - "integrity": "sha1-EjBkIvYzJK7YSD0/ODMrX2cFR6A=", - "optional": true + "integrity": "sha1-EjBkIvYzJK7YSD0/ODMrX2cFR6A=" }, "log-symbols": { "version": "4.0.0", @@ -37638,15 +37107,14 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, "mixin-deep": { "version": "1.3.2", @@ -37949,16 +37417,16 @@ } }, "mocha-junit-reporter": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/mocha-junit-reporter/-/mocha-junit-reporter-2.2.0.tgz", - "integrity": "sha512-W83Ddf94nfLiTBl24aS8IVyFvO8aRDLlCvb+cKb/VEaN5dEbcqu3CXiTe8MQK2DvzS7oKE1RsFTxzN302GGbDQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mocha-junit-reporter/-/mocha-junit-reporter-2.0.2.tgz", + "integrity": "sha512-vYwWq5hh3v1lG0gdQCBxwNipBfvDiAM1PHroQRNp96+2l72e9wEUTw+mzoK+O0SudgfQ7WvTQZ9Nh3qkAYAjfg==", "dev": true, "requires": { - "debug": "^4.3.4", - "md5": "^2.3.0", - "mkdirp": "~1.0.4", + "debug": "^2.2.0", + "md5": "^2.1.0", + "mkdirp": "~0.5.1", "strip-ansi": "^6.0.1", - "xml": "^1.0.1" + "xml": "^1.0.0" }, "dependencies": { "ansi-regex": { @@ -37967,6 +37435,30 @@ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -37979,9 +37471,9 @@ } }, "mocha-multi": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/mocha-multi/-/mocha-multi-1.1.7.tgz", - "integrity": "sha512-SXZRgHy0XiRTASyOp0p6fjOkdj+R62L6cqutnYyQOvIjNznJuUwzykxctypeRiOwPd+gfn4yt3NRulMQyI8Tzg==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/mocha-multi/-/mocha-multi-1.1.6.tgz", + "integrity": "sha512-hMVmd9C1h4PEiFNwHxn8aa5/EgGLg0UswdOrlrq1Y8ieKmot8hZLYaiESIgg/He3E4oxwaXPWT1V1PJ0qNJlUQ==", "dev": true, "requires": { "debug": "^4.1.1", @@ -38002,13 +37494,12 @@ "moment": { "version": "2.29.1", "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==", - "optional": true + "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" }, "mongodb": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.14.0.tgz", - "integrity": "sha512-coGKkWXIBczZPr284tYKFLg+KbGPPLlSbdgfKAb6QqCFt5bo5VFZ50O3FFzsw4rnkqjwT6D8Qcoo9nshYKM7Mg==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.13.0.tgz", + "integrity": "sha512-+taZ/bV8d1pYuHL4U+gSwkhmDrwkWbH1l4aah4YpmpscMwgFBkufIKxgP/G7m87/NUuQzc2Z75ZTI7ZOyqZLbw==", "requires": { "@aws-sdk/credential-providers": "^3.186.0", "bson": "^4.7.0", @@ -38026,9 +37517,9 @@ } }, "mongodb-client-encryption": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/mongodb-client-encryption/-/mongodb-client-encryption-2.5.0.tgz", - "integrity": "sha512-et7DSQDhkbioK/G3FYtjML34ylLHmapM2665k7MMWCxSiXBNGovp8wSV4dRvJzXzKMfGvc/A4bJ7EcPSjxLCwg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/mongodb-client-encryption/-/mongodb-client-encryption-2.3.0.tgz", + "integrity": "sha512-cXuRYBmCj43rLeqP8gHa+CrloFe7TUCd/f16VduFGQzAN9ef5buMGIfSr2CEGBul/EjTCLlioctSSDmHAmpTqA==", "devOptional": true, "requires": { "bindings": "^1.5.0", @@ -38440,13 +37931,13 @@ } }, "mongodb-download-url": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/mongodb-download-url/-/mongodb-download-url-1.3.0.tgz", - "integrity": "sha512-N7mRi3/LIAHCeTa+JtJVrVno4BNHVYF+6/WUamVFsbvCxtljDmQA1n9FSQxV4dfdiknR9zaoFcXAmd1gtg3Elg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mongodb-download-url/-/mongodb-download-url-1.0.0.tgz", + "integrity": "sha512-bvUE9Wa0P0ZpuazQ7UFHcvE03zdnXePSsntVBngqJQIM5m6JosMeW+nrabMyBvbGqiIsgXL96UF4Bj/FakKrLw==", "dev": true, "requires": { "debug": "^4.1.1", - "minimist": "^1.2.3", + "minimist": "^1.2.0", "node-fetch": "^2.6.1", "semver": "^7.1.1" } @@ -38455,7 +37946,6 @@ "version": "1.11.0", "resolved": "https://registry.npmjs.org/mongodb-extended-json/-/mongodb-extended-json-1.11.0.tgz", "integrity": "sha512-+PLUMH7amvTYumCUR6alR474KmqtlmYeceJjsC+zcfdXls9IotfTp2WIuD6X5tO9dLDVCDqboqjgvXj/JjGj6g==", - "optional": true, "requires": { "async": "^3.1.0", "bson": "^1.0.1", @@ -38470,14 +37960,12 @@ "async": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", - "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==", - "optional": true + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" }, "bson": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.5.tgz", - "integrity": "sha512-kDuEzldR21lHciPQAIulLs1LZlCXdLziXI6Mb/TDkwXhb//UORJNPXgcRs2CuO4H0DcMkpfT3/ySsP3unoZjBg==", - "optional": true + "integrity": "sha512-kDuEzldR21lHciPQAIulLs1LZlCXdLziXI6Mb/TDkwXhb//UORJNPXgcRs2CuO4H0DcMkpfT3/ySsP3unoZjBg==" } } }, @@ -38530,16 +38018,18 @@ "integrity": "sha512-pCutlP/AU0hcJ/f1h2h3nmn79/gXrQo6088QvPCbdx7SBDkAeGPH4AYu28DgqZzFvsn5mtt2RUpsFicYhjaHow==" }, "mongodb-query-parser": { - "version": "2.4.10", - "resolved": "https://registry.npmjs.org/mongodb-query-parser/-/mongodb-query-parser-2.4.10.tgz", - "integrity": "sha512-gFv1N184F7oMUINuvmUJBMq+tIy1BiELNRSPGWzabYjySRxvIR2c64MJS0b7pnb0eyfHBzfKoLy2LCrYBDt8Gg==", + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mongodb-query-parser/-/mongodb-query-parser-2.4.6.tgz", + "integrity": "sha512-R9uU//1IlhPPIGvB4ItMwus3E7nJJtBtrSrTV6wTslwDQfL6bpy9PXcIXVHdDsuJADQZdcvdvpj22VxdfqH2ig==", "requires": { + "bson": "^4.6.1", "debug": "^4.1.1", - "ejson-shell-parser": "^1.2.1", + "ejson-shell-parser": "^1.1.3", "is-json": "^2.0.1", "javascript-stringify": "^2.0.1", "lodash": "^4.17.15", "lru-cache": "^5.1.1", + "mongodb-extended-json": "^1.10.2", "mongodb-language-model": "^1.6.1" }, "dependencies": { @@ -38567,9 +38057,9 @@ } }, "mongodb-runner": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/mongodb-runner/-/mongodb-runner-4.10.0.tgz", - "integrity": "sha512-6hE4nA4+LMBPwLMXr/jQNRNtUdQgfmZOJE/4u5JX952hdUa0lPc+26Y45PdgbdMbfCYUfZK1cOBObZOBmTdQ6Q==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/mongodb-runner/-/mongodb-runner-4.9.0.tgz", + "integrity": "sha512-ltAC7FQ6NJ1XoMc5AJ+sbURsETKJeHd2ulvTpJGH+xO79b44ELCF2yETBzAmiEKTkj3MI2u0Awh0KQhWizgwWw==", "dev": true, "requires": { "async": "^3.1.0", @@ -38583,7 +38073,7 @@ "mongodb": "^3.4.0", "mongodb-dbpath": "^0.0.1", "mongodb-tools": "github:mongodb-js/mongodb-tools#0d1a90f49796c41f6d47c7c7999fe384014a16a0", - "mongodb-version-manager": "^1.5.0", + "mongodb-version-manager": "^1.4.5", "untildify": "^4.0.0", "which": "^2.0.1" }, @@ -38740,7 +38230,7 @@ "mongodb-version-list": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/mongodb-version-list/-/mongodb-version-list-1.0.0.tgz", - "integrity": "sha512-F3kIABEMNjg3ZAX4SRbO1QPmhpP4NX2IgJq+lcUKidducTOVJafXJ+E+pMkgpU0xumC8QYbIZJ+8y4GZys9E4g==", + "integrity": "sha1-8lAxz83W8UWx3o/OKk6+wCiLtKQ=", "dev": true, "requires": { "cheerio": "^0.22.0", @@ -38754,7 +38244,7 @@ "cheerio": { "version": "0.22.0", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", - "integrity": "sha512-8/MzidM6G/TgRelkzDG13y3Y9LxBjCb+8yOEZ9+wwq5gVF2w2pV0wmHvjfT0RvuxGyR7UEuK36r+yYMbT4uKgA==", + "integrity": "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=", "dev": true, "requires": { "css-select": "~1.2.0", @@ -38787,7 +38277,7 @@ "fs-extra": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", - "integrity": "sha512-VerQV6vEKuhDWD2HGOybV6v5I73syoc/cXAbKlgTC7M/oFVEtklWlp9QH2Ijw3IaWDOQcMkldSPa7zXy79Z/UQ==", + "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", "dev": true, "requires": { "graceful-fs": "^4.1.2", @@ -38798,16 +38288,22 @@ "jsonfile": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", "dev": true, "requires": { "graceful-fs": "^4.1.6" } }, + "lodash.bind": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", + "integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=", + "dev": true + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, "semver": { @@ -38819,9 +38315,9 @@ } }, "mongodb-version-manager": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/mongodb-version-manager/-/mongodb-version-manager-1.5.0.tgz", - "integrity": "sha512-VHijlQXvQFnX/9MzfGePyBNr9qHLHRHg6sM2ChFO+05Htf6JY50WzvDWZmtXUNGXEor80fXxhswwDJevGlZkyA==", + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/mongodb-version-manager/-/mongodb-version-manager-1.4.6.tgz", + "integrity": "sha512-UxXZy7iqHUa039Bp8e1Y2tSLh/X/JtHRqnlcVkqNEWpX/5ETPaKwrT7QIVZc1Tk5tEkQXjRHd6nQtUjcemOHmA==", "dev": true, "requires": { "ampersand-state": "^5.0.3", @@ -38843,9 +38339,9 @@ }, "dependencies": { "async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==", "dev": true }, "chalk": { @@ -38871,7 +38367,7 @@ "decompress-response": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", "dev": true, "requires": { "mimic-response": "^1.0.0" @@ -38899,7 +38395,7 @@ "file-type": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", + "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", "dev": true }, "filenamify": { @@ -38916,7 +38412,7 @@ "get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", "dev": true }, "got": { @@ -38965,7 +38461,7 @@ "p-event": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-event/-/p-event-1.3.0.tgz", - "integrity": "sha512-hV1zbA7gwqPVFcapfeATaNjQ3J0NuzorHPyG8GPL9g/Y/TplWVBVoCKCXL6Ej2zscrCEv195QNWJXuBH6XZuzA==", + "integrity": "sha1-jmtPT2XHK8W2/ii3XtqHT5akoIU=", "dev": true, "requires": { "p-timeout": "^1.1.1" @@ -38974,7 +38470,7 @@ "p-timeout": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", - "integrity": "sha512-gb0ryzr+K2qFqFv6qi3khoeqMZF/+ajxQipEF6NteZVnvz9tzdsfAVj3lYtn1gAXvH5lfLwfxEII799gt/mRIA==", + "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", "dev": true, "requires": { "p-finally": "^1.0.0" @@ -38983,13 +38479,13 @@ "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true }, "prepend-http": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", "dev": true }, "semver": { @@ -39010,7 +38506,7 @@ "url-parse-lax": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", "dev": true, "requires": { "prepend-http": "^1.0.1" @@ -39133,12 +38629,6 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, "natural-orderby": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/natural-orderby/-/natural-orderby-2.0.3.tgz", @@ -39353,7 +38843,7 @@ "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true } } @@ -39601,18 +39091,18 @@ } }, "object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", "dev": true }, "object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.4.tgz", + "integrity": "sha512-1ZvAZ4wlF7IyPVOcE1Omikt7UpaFlOQq0HlSti+ZvDH3UiD2brwGMwDbyV43jao2bKJ+4+WdPJHSd7kgzKYVqg==", "dev": true, "requires": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.0", "define-properties": "^1.1.3" } }, @@ -39637,14 +39127,14 @@ } }, "object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "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.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", "object-keys": "^1.1.1" }, "dependencies": { @@ -39669,14 +39159,15 @@ } }, "object.fromentries": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", - "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.3.tgz", + "integrity": "sha512-IDUSMXs6LOSJBWE++L0lzIbSqHl9KDCfff2x/JSEIDtEUavUnyMYC2ZGay/04Zq4UT8lvd4xNhU4/YHKibAOlw==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "has": "^1.0.3" } }, "object.pick": { @@ -39689,14 +39180,15 @@ } }, "object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.2.tgz", + "integrity": "sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "has": "^1.0.3" } }, "once": { @@ -40570,9 +40062,9 @@ "dev": true }, "prettier": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz", - "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", "dev": true }, "process": { @@ -40624,7 +40116,7 @@ "proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", "dev": true }, "prr": { @@ -40783,9 +40275,9 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "react-redux": { - "version": "7.2.9", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz", - "integrity": "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==", + "version": "7.2.8", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.8.tgz", + "integrity": "sha512-6+uDjhs3PSIclqoCk0kd6iX74gzrGc3W5zcAjbrFgEdIjRSQObdIwfx80unTkVUYvbQ95Y8Av3OvFHq1w5EOUw==", "requires": { "@babel/runtime": "^7.15.4", "@types/react-redux": "^7.1.20", @@ -40904,9 +40396,9 @@ } }, "redux": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", - "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.0.tgz", + "integrity": "sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA==", "requires": { "@babel/runtime": "^7.9.2" } @@ -40914,7 +40406,7 @@ "reflect.ownkeys": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz", - "integrity": "sha512-qOLsBKHCpSOFKK1NUOCGC5VyeufB6lEsFe92AL2bhIJsacZS1qdoOZSbPk3MYKuT2cFlRDnulKXuuElIrMjGUg==", + "integrity": "sha1-dJrO7H8/34tj+SegSAnpDFwLNGA=", "dev": true }, "regenerator-runtime": { @@ -40933,14 +40425,40 @@ } }, "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "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==", "dev": true, "requires": { - "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "es-abstract": "^1.17.0-next.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "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.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + } } }, "regexpp": { @@ -41243,17 +40761,6 @@ "ret": "~0.1.10" } }, - "safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - } - }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -41503,9 +41010,9 @@ } }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "requires": { "lru-cache": "^6.0.0" } @@ -41597,14 +41104,13 @@ "optional": true }, "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.3.tgz", + "integrity": "sha512-A6+ByhlLkksFoUepsGxfj5x1gTSrs+OydsRptUxeNCabQpCFUvcwIczgOigI8vhY/OJCnPnyE9rGiwgvr9cS1g==", "dev": true, "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "es-abstract": "^1.18.0-next.0", + "object-inspect": "^1.8.0" } }, "sift": { @@ -42258,25 +41764,23 @@ } }, "string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", + "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" } }, "string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", + "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" } }, "strip-ansi": { @@ -42836,9 +42340,9 @@ } }, "ts-loader": { - "version": "9.4.2", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.2.tgz", - "integrity": "sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.1.tgz", + "integrity": "sha512-384TYAqGs70rn9F0VBnh6BPTfhga7yFNdC5gXbQpDrBj9/KsT4iRkGqKXhziofHOlE2j6YEaiTYVGKKvPhGWvw==", "dev": true, "requires": { "chalk": "^4.1.0", @@ -42954,17 +42458,6 @@ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true }, - "typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - } - }, "typed-rest-client": { "version": "1.8.4", "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.4.tgz", @@ -42991,9 +42484,9 @@ } }, "typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", + "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==", "dev": true }, "uc.micro": { @@ -43002,18 +42495,6 @@ "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", "dev": true }, - "unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - } - }, "unbzip2-stream": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", @@ -43270,64 +42751,46 @@ } }, "vscode-jsonrpc": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.1.0.tgz", - "integrity": "sha512-6TDy/abTQk+zDGYazgbIPc+4JoXdwC8NHU9Pbn4UJP1fehUyZmM4RHp5IthX7A6L5KS30PRui+j+tbbMMMafdw==" + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.0.2.tgz", + "integrity": "sha512-RY7HwI/ydoC1Wwg4gJ3y6LpU9FJRZAUnTYMXthqhFXXu77ErDd/xkREpGuk4MyYkk4a+XDWAMqe0S3KkelYQEQ==" }, "vscode-languageclient": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-8.1.0.tgz", - "integrity": "sha512-GL4QdbYUF/XxQlAsvYWZRV3V34kOkpRlvV60/72ghHfsYFnS/v2MANZ9P6sHmxFcZKOse8O+L9G7Czg0NUWing==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-8.0.2.tgz", + "integrity": "sha512-lHlthJtphG9gibGb/y72CKqQUxwPsMXijJVpHEC2bvbFqxmkj9LwQ3aGU9dwjBLqsX1S4KjShYppLvg1UJDF/Q==", "requires": { - "minimatch": "^5.1.0", - "semver": "^7.3.7", - "vscode-languageserver-protocol": "3.17.3" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "requires": { - "brace-expansion": "^2.0.1" - } - } + "minimatch": "^3.0.4", + "semver": "^7.3.5", + "vscode-languageserver-protocol": "3.17.2" } }, "vscode-languageserver": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-8.1.0.tgz", - "integrity": "sha512-eUt8f1z2N2IEUDBsKaNapkz7jl5QpskN2Y0G01T/ItMxBxw1fJwvtySGB9QMecatne8jFIWJGWI61dWjyTLQsw==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-8.0.2.tgz", + "integrity": "sha512-bpEt2ggPxKzsAOZlXmCJ50bV7VrxwCS5BI4+egUmure/oI/t4OlFzi/YNtVvY24A2UDOZAgwFGgnZPwqSJubkA==", "requires": { - "vscode-languageserver-protocol": "3.17.3" + "vscode-languageserver-protocol": "3.17.2" } }, "vscode-languageserver-protocol": { - "version": "3.17.3", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.3.tgz", - "integrity": "sha512-924/h0AqsMtA5yK22GgMtCYiMdCOtWTSGgUOkgEDX+wk2b0x4sAfLiO4NxBxqbiVtz7K7/1/RgVrVI0NClZwqA==", + "version": "3.17.2", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.2.tgz", + "integrity": "sha512-8kYisQ3z/SQ2kyjlNeQxbkkTNmVFoQCqkmGrzLH6A9ecPlgTbp3wDTnUNqaUxYr4vlAcloxx8zwy7G5WdguYNg==", "requires": { - "vscode-jsonrpc": "8.1.0", - "vscode-languageserver-types": "3.17.3" + "vscode-jsonrpc": "8.0.2", + "vscode-languageserver-types": "3.17.2" } }, "vscode-languageserver-textdocument": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.9.tgz", - "integrity": "sha512-NPfHVGFW2/fQEWHspr8x3PXhRgtFbuDZdl7p6ifuN3M7nk2Yjf5POr/NfDBuAiQG88DehDyJ7nGOT+p+edEtbw==" + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.7.tgz", + "integrity": "sha512-bFJH7UQxlXT8kKeyiyu41r22jCZXG8kuuVVA33OEJn1diWOZK5n8zBSPZFHVBOu8kXZ6h0LIRhf5UnCo61J4Hg==" }, "vscode-languageserver-types": { - "version": "3.17.3", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.3.tgz", - "integrity": "sha512-SYU4z1dL0PyIMd4Vj8YOqFvHu7Hz/enbWtpfnVbJHU4Nd1YNYx8u0ennumc6h48GQNeOLxmwySmnADouT/AuZA==" + "version": "3.17.2", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.2.tgz", + "integrity": "sha512-zHhCWatviizPIq9B7Vh9uvrH6x3sK8itC84HkamnBWoDFJtzBf7SWlpLCZUit72b3os45h6RWQNC9xHRDF8dRA==" }, "w3c-hr-time": { "version": "1.0.2", @@ -43390,9 +42853,9 @@ "dev": true }, "webpack": { - "version": "5.75.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz", - "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==", + "version": "5.74.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", + "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.3", @@ -43548,38 +43011,11 @@ "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" - } - }, "which-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" }, - "which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" - } - }, "wide-align": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", diff --git a/package.json b/package.json index 569779de8..0d857094c 100644 --- a/package.json +++ b/package.json @@ -64,7 +64,7 @@ "engines": { "vscode": "^1.75.1", "node": "^16.16.0", - "npm": "^8.8.0" + "npm": "^8.15.1" }, "activationEvents": [ "onView:mongoDB", @@ -972,27 +972,27 @@ } }, "dependencies": { - "@babel/parser": "^7.21.1", - "@babel/traverse": "^7.21.0", - "@fortawesome/fontawesome-svg-core": "^6.3.0", - "@fortawesome/free-solid-svg-icons": "^6.3.0", + "@babel/parser": "^7.19.1", + "@babel/traverse": "^7.19.1", + "@fortawesome/fontawesome-svg-core": "^6.2.0", + "@fortawesome/free-solid-svg-icons": "^6.2.0", "@fortawesome/react-fontawesome": "^0.2.0", - "@iconify-icons/codicon": "^1.2.21", + "@iconify-icons/codicon": "^1.2.16", "@iconify/react": "^1.1.4", - "@leafygreen-ui/logo": "^6.3.0", - "@leafygreen-ui/palette": "^3.4.7", + "@leafygreen-ui/logo": "^6.1.3", + "@leafygreen-ui/palette": "^3.4.2", "@leafygreen-ui/toggle": "^7.0.5", - "@mongodb-js/mongodb-constants": "^0.2.2", + "@mongodb-js/mongodb-constants": "^0.2.1", "@mongosh/browser-runtime-electron": "^1.6.2", "@mongosh/i18n": "^1.6.2", "@mongosh/service-provider-server": "^1.6.2", "@mongosh/shell-api": "^1.6.2", "analytics-node": "^5.1.2", - "bson": "^4.7.2", - "bson-transpilers": "^2.0.2", + "bson": "^4.7.0", + "bson-transpilers": "^2.0.0", "classnames": "^2.3.2", "debug": "^4.3.4", - "dotenv": "^16.0.3", + "dotenv": "^16.0.2", "micromatch": "^4.0.5", "mongodb": "^4.13.0", "mongodb-build-info": "^1.5.0", @@ -1000,25 +1000,25 @@ "mongodb-connection-string-url": "^2.5.3", "mongodb-data-service": "^22.1.1", "mongodb-ns": "^2.4.0", - "mongodb-query-parser": "^2.4.10", + "mongodb-query-parser": "^2.4.6", "mongodb-schema": "^9.0.0", "numeral": "^2.0.6", "react": "^16.14.0", "react-dom": "^16.14.0", - "react-redux": "^7.2.9", - "redux": "^4.2.1", + "react-redux": "^7.2.8", + "redux": "^4.2.0", "ts-log": "^2.2.5", "uuid": "^8.3.2", - "vscode-languageclient": "^8.1.0", - "vscode-languageserver": "^8.1.0", - "vscode-languageserver-textdocument": "^1.0.9" + "vscode-languageclient": "^8.0.2", + "vscode-languageserver": "^8.0.2", + "vscode-languageserver-textdocument": "^1.0.7" }, "devDependencies": { "@mongodb-js/prettier-config-compass": "^1.0.0", - "@types/analytics-node": "^3.1.10", - "@types/babel__core": "^7.20.0", - "@types/babel__traverse": "^7.18.3", - "@types/chai": "^4.3.4", + "@types/analytics-node": "^3.1.9", + "@types/babel__core": "^7.1.19", + "@types/babel__traverse": "^7.18.1", + "@types/chai": "^4.3.3", "@types/chai-fs": "^2.0.2", "@types/chai-json-schema": "^1.4.6", "@types/debug": "^4.1.7", @@ -1027,19 +1027,19 @@ "@types/jest": "^26.0.24", "@types/micromatch": "^4.0.2", "@types/mocha": "^8.2.3", - "@types/node": "^14.18.36", + "@types/node": "^14.18.29", "@types/react": "^17.0.50", "@types/react-dom": "^17.0.17", "@types/sinon": "^9.0.11", "@types/uuid": "^8.3.4", - "@types/vscode": "^1.75.1", - "@typescript-eslint/eslint-plugin": "^5.53.0", - "@typescript-eslint/parser": "^5.53.0", - "@vscode/test-electron": "^2.2.3", - "@vscode/vsce": "^2.17.0", + "@types/vscode": "^1.74.0", + "@typescript-eslint/eslint-plugin": "^5.38.0", + "@typescript-eslint/parser": "^5.38.0", + "@vscode/test-electron": "^2.1.5", + "@vscode/vsce": "^2.16.0", "autoprefixer": "^9.8.8", "buffer": "^6.0.3", - "chai": "^4.3.7", + "chai": "^4.3.6", "chai-as-promised": "^7.1.1", "chai-fs": "^2.0.0", "chai-json-schema": "^1.5.1", @@ -1051,8 +1051,8 @@ "depcheck": "^1.4.3", "download": "^8.0.0", "enzyme": "^3.11.0", - "enzyme-adapter-react-16": "^1.15.7", - "eslint": "^8.34.0", + "enzyme-adapter-react-16": "^1.15.6", + "eslint": "^8.23.1", "eslint-config-mongodb-js": "^5.0.3", "eslint-plugin-mocha": "^10.1.0", "execa": "^1.0.0", @@ -1064,27 +1064,27 @@ "less-loader": "^5.0.0", "mkdirp": "^1.0.4", "mocha": "^8.4.0", - "mocha-junit-reporter": "^2.2.0", - "mocha-multi": "^1.1.7", - "mongodb-client-encryption": "^2.5.0", - "mongodb-runner": "^4.10.0", + "mocha-junit-reporter": "^2.0.2", + "mocha-multi": "^1.1.6", + "mongodb-client-encryption": "^2.2.1", + "mongodb-runner": "^4.9.0", "node-loader": "^0.6.0", "npm-run-all": "^4.1.5", "ora": "^5.4.1", "postcss-loader": "^3.0.0", "pre-commit": "^1.2.2", - "prettier": "^2.8.4", + "prettier": "^2.7.1", "process": "^0.11.10", - "semver": "^7.3.8", + "semver": "^7.3.7", "sinon": "^9.2.4", "sinon-chai": "^3.7.0", "stream-browserify": "^3.0.0", "style-loader": "^1.3.0", "ts-jest": "^26.5.6", - "ts-loader": "^9.4.2", + "ts-loader": "^9.4.1", "ts-node": "^10.9.1", - "typescript": "^4.9.5", - "webpack": "^5.75.0", + "typescript": "^4.8.3", + "webpack": "^5.74.0", "webpack-cli": "^4.10.0", "xvfb-maybe": "^0.2.1", "yargs-parser": "^20.2.9" From ad04e91d21267a4e6980828f34f264607d48622e Mon Sep 17 00:00:00 2001 From: Alena Khineika Date: Tue, 21 Feb 2023 15:42:08 +0100 Subject: [PATCH 22/36] refactor: reformat --- src/language/worker.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/language/worker.ts b/src/language/worker.ts index 03049b6a1..5feda3d26 100644 --- a/src/language/worker.ts +++ b/src/language/worker.ts @@ -14,7 +14,7 @@ import { ServerCommands } from './serverCommands'; // MongoClientOptions is the second argument of CliServiceProvider.connect(connectionStr, options) type MongoClientOptions = NonNullable< - Parameters<(typeof CliServiceProvider)['connect']>[1] + Parameters[1] >; interface EvaluationResult { From dd641672a0f8c18d6edf2a858ef36480ad3ac1f3 Mon Sep 17 00:00:00 2001 From: Alena Khineika Date: Tue, 21 Feb 2023 15:53:14 +0100 Subject: [PATCH 23/36] test: use activeTextEditor from the playground controller --- src/test/suite/mdbExtensionController.test.ts | 66 ++++++++++--------- 1 file changed, 36 insertions(+), 30 deletions(-) diff --git a/src/test/suite/mdbExtensionController.test.ts b/src/test/suite/mdbExtensionController.test.ts index 803f3f8cf..24d8137c2 100644 --- a/src/test/suite/mdbExtensionController.test.ts +++ b/src/test/suite/mdbExtensionController.test.ts @@ -567,12 +567,13 @@ suite('MDBExtensionController Test Suite', function () { await vscode.commands.executeCommand('mdb.addDatabase', mockTreeItem); - assert( - vscode.window.activeTextEditor?.document.languageId === 'javascript' - ); - assert(vscode.window.activeTextEditor?.document.uri.scheme === 'untitled'); + const activeTextEditor = + mdbTestExtension.testExtensionController._playgroundController + ._activeTextEditor; + assert(activeTextEditor?.document.languageId === 'javascript'); + assert(activeTextEditor?.document.uri.scheme === 'untitled'); - const content = vscode.window.activeTextEditor.document.getText(); + const content = activeTextEditor.document.getText(); assert(content.includes('// Create a new database.')); assert(content.includes('NEW_DATABASE_NAME')); assert(content.includes('NEW_COLLECTION_NAME')); @@ -691,12 +692,13 @@ suite('MDBExtensionController Test Suite', function () { await vscode.commands.executeCommand('mdb.addCollection', mockTreeItem); - assert( - vscode.window.activeTextEditor?.document.languageId === 'javascript' - ); - assert(vscode.window.activeTextEditor?.document.uri.scheme === 'untitled'); + const activeTextEditor = + mdbTestExtension.testExtensionController._playgroundController + ._activeTextEditor; + assert(activeTextEditor?.document.languageId === 'javascript'); + assert(activeTextEditor?.document.uri.scheme === 'untitled'); - const content = vscode.window.activeTextEditor.document.getText(); + const content = activeTextEditor.document.getText(); assert(content.includes('// The current database to use.')); assert(content.includes('iceCreamDB')); assert(content.includes('NEW_COLLECTION_NAME')); @@ -1348,12 +1350,13 @@ suite('MDBExtensionController Test Suite', function () { collectionName: 'colllllllllName', }); - assert( - vscode.window.activeTextEditor?.document.languageId === 'javascript' - ); - assert(vscode.window.activeTextEditor?.document.uri.scheme === 'untitled'); + const activeTextEditor = + mdbTestExtension.testExtensionController._playgroundController + ._activeTextEditor; + assert(activeTextEditor?.document.languageId === 'javascript'); + assert(activeTextEditor?.document.uri.scheme === 'untitled'); - const content = vscode.window.activeTextEditor.document.getText(); + const content = activeTextEditor.document.getText(); assert(content.includes('Search for documents in the current collection.')); assert(content.includes('dbbbbbName')); assert(content.includes('colllllllllName')); @@ -1367,12 +1370,13 @@ suite('MDBExtensionController Test Suite', function () { collectionName: 'colllllllllName', }); - assert( - vscode.window.activeTextEditor?.document.languageId === 'javascript' - ); - assert(vscode.window.activeTextEditor?.document.uri.scheme === 'untitled'); + const activeTextEditor = + mdbTestExtension.testExtensionController._playgroundController + ._activeTextEditor; + assert(activeTextEditor?.document.languageId === 'javascript'); + assert(activeTextEditor?.document.uri.scheme === 'untitled'); - const content = vscode.window.activeTextEditor.document.getText(); + const content = activeTextEditor.document.getText(); assert(content.includes('Create a new index in the collection.')); assert(content.includes('dbbbbbName')); assert(content.includes('colllllllllName')); @@ -1388,12 +1392,13 @@ suite('MDBExtensionController Test Suite', function () { await vscode.commands.executeCommand('mdb.createPlayground'); - assert( - vscode.window.activeTextEditor?.document.languageId === 'javascript' - ); - assert(vscode.window.activeTextEditor?.document.uri.scheme === 'untitled'); + const activeTextEditor = + mdbTestExtension.testExtensionController._playgroundController + ._activeTextEditor; + assert(activeTextEditor?.document.languageId === 'javascript'); + assert(activeTextEditor?.document.uri.scheme === 'untitled'); - const content = vscode.window.activeTextEditor.document.getText(); + const content = activeTextEditor.document.getText(); assert(content.includes('// MongoDB Playground')); await vscode.commands.executeCommand('workbench.action.closeActiveEditor'); @@ -1407,12 +1412,13 @@ suite('MDBExtensionController Test Suite', function () { await vscode.commands.executeCommand('mdb.createPlayground'); - assert( - vscode.window.activeTextEditor?.document.languageId === 'javascript' - ); - assert(vscode.window.activeTextEditor?.document.uri.scheme === 'untitled'); + const activeTextEditor = + mdbTestExtension.testExtensionController._playgroundController + ._activeTextEditor; + assert(activeTextEditor?.document.languageId === 'javascript'); + assert(activeTextEditor?.document.uri.scheme === 'untitled'); - const content = vscode.window.activeTextEditor.document.getText(); + const content = activeTextEditor.document.getText(); assert.strictEqual(content, ''); await vscode.commands.executeCommand('workbench.action.closeActiveEditor'); From 414c3a706ef7fabdeca601b9d77e5e2ed1e2a924 Mon Sep 17 00:00:00 2001 From: Alena Khineika Date: Fri, 24 Feb 2023 16:18:44 +0100 Subject: [PATCH 24/36] refactor: os homedir --- src/editors/playgroundController.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/editors/playgroundController.ts b/src/editors/playgroundController.ts index b268521c3..6a1c38aca 100644 --- a/src/editors/playgroundController.ts +++ b/src/editors/playgroundController.ts @@ -278,7 +278,7 @@ export default class PlaygroundController { // therefore we explicitly specify the workspace folder path // or OS temp directory if a user has not opened workspaces. const workspaceFolder = vscode.workspace.workspaceFolders?.[0]; - const filePath = workspaceFolder?.uri.fsPath || os.tmpdir(); + const filePath = workspaceFolder?.uri.fsPath || os.homedir(); const numberUntitledPlaygrounds = vscode.workspace.textDocuments.filter( (doc) => isPlayground(doc.uri) From 8d77ef332f38ebbe1aa934e9b10c337083850364 Mon Sep 17 00:00:00 2001 From: Alena Khineika Date: Mon, 27 Feb 2023 17:51:18 +0100 Subject: [PATCH 25/36] refactor: clean up --- package.json | 24 +++++++------ scripts/update-grammar.ts | 2 -- scripts/update-snippets.ts | 2 -- src/editors/playgroundController.ts | 20 ++++------- .../activeConnectionCodeLensProvider.test.ts | 4 +-- .../editors/playgroundController.test.ts | 2 +- ...aygroundSelectedCodeActionProvider.test.ts | 4 +-- .../telemetry/connectionTelemetry.test.ts | 36 ++++++++++++------- 8 files changed, 48 insertions(+), 46 deletions(-) diff --git a/package.json b/package.json index 0d857094c..de7d37028 100644 --- a/package.json +++ b/package.json @@ -626,7 +626,7 @@ { "command": "mdb.runPlayground", "group": "navigation", - "when": "mdb.showRunPlaygroundButton == true" + "when": "mdb.isPlayground == true" } ], "commandPalette": [ @@ -636,27 +636,31 @@ }, { "command": "mdb.runSelectedPlaygroundBlocks", - "when": "mdb.showRunPlaygroundButton == true" + "when": "mdb.isPlayground == true" }, { "command": "mdb.runAllPlaygroundBlocks", - "when": "mdb.showRunPlaygroundButton == true" + "when": "mdb.isPlayground == true" + }, + { + "command": "mdb.exportToRuby", + "when": "mdb.isPlayground == true" }, { "command": "mdb.exportToPython", - "when": "mdb.showRunPlaygroundButton == true" + "when": "mdb.isPlayground == true" }, { "command": "mdb.exportToJava", - "when": "mdb.showRunPlaygroundButton == true" + "when": "mdb.isPlayground == true" }, { "command": "mdb.exportToCsharp", - "when": "mdb.showRunPlaygroundButton == true" + "when": "mdb.isPlayground == true" }, { "command": "mdb.exportToNode", - "when": "mdb.showRunPlaygroundButton == true" + "when": "mdb.isPlayground == true" }, { "command": "mdb.refreshPlaygroundsFromTreeView", @@ -813,19 +817,19 @@ "command": "mdb.runSelectedPlaygroundBlocks", "key": "ctrl+alt+s", "mac": "cmd+alt+s", - "when": "mdb.showRunPlaygroundButton == true" + "when": "mdb.isPlayground == true" }, { "command": "mdb.runAllPlaygroundBlocks", "key": "ctrl+alt+r", "mac": "cmd+alt+r", - "when": "mdb.showRunPlaygroundButton == true" + "when": "mdb.isPlayground == true" }, { "command": "mdb.saveMongoDBDocument", "key": "ctrl+s", "mac": "cmd+s", - "when": "editorLangId == json" + "when": "mdb.isPlayground == true" } ], "capabilities": { diff --git a/scripts/update-grammar.ts b/scripts/update-grammar.ts index dd7526cdc..ad89ab40e 100644 --- a/scripts/update-grammar.ts +++ b/scripts/update-grammar.ts @@ -1,5 +1,3 @@ -#! /usr/bin/env ts-node - import path from 'path'; import mkdirp from 'mkdirp'; import ora from 'ora'; diff --git a/scripts/update-snippets.ts b/scripts/update-snippets.ts index 30afeb679..943ed3462 100755 --- a/scripts/update-snippets.ts +++ b/scripts/update-snippets.ts @@ -1,5 +1,3 @@ -#! /usr/bin/env ts-node - import path from 'path'; import mkdirp from 'mkdirp'; import ora from 'ora'; diff --git a/src/editors/playgroundController.ts b/src/editors/playgroundController.ts index 6a1c38aca..5daa5939c 100644 --- a/src/editors/playgroundController.ts +++ b/src/editors/playgroundController.ts @@ -156,19 +156,11 @@ export default class PlaygroundController { this._playgroundResultTextDocument = editor?.document; } - if (isPlayground(editor?.document.uri)) { - void vscode.commands.executeCommand( - 'setContext', - 'mdb.showRunPlaygroundButton', - true - ); - } else { - void vscode.commands.executeCommand( - 'setContext', - 'mdb.showRunPlaygroundButton', - false - ); - } + void vscode.commands.executeCommand( + 'setContext', + 'mdb.isPlayground', + isPlayground(editor?.document.uri) + ); if (editor?.document.languageId !== 'Log') { this._activeTextEditor = editor; @@ -276,7 +268,7 @@ export default class PlaygroundController { try { // The MacOS default folder for saving files is a read-only root (/) directory, // therefore we explicitly specify the workspace folder path - // or OS temp directory if a user has not opened workspaces. + // or OS home directory if a user has not opened workspaces. const workspaceFolder = vscode.workspace.workspaceFolders?.[0]; const filePath = workspaceFolder?.uri.fsPath || os.homedir(); diff --git a/src/test/suite/editors/activeConnectionCodeLensProvider.test.ts b/src/test/suite/editors/activeConnectionCodeLensProvider.test.ts index ff2751f1b..3fca3bfad 100644 --- a/src/test/suite/editors/activeConnectionCodeLensProvider.test.ts +++ b/src/test/suite/editors/activeConnectionCodeLensProvider.test.ts @@ -28,7 +28,7 @@ suite('Active Connection CodeLens Provider Test Suite', () => { suite('the MongoDB playground in JS', () => { beforeEach(async () => { const fileName = path.join( - os.tmpdir(), + os.homedir(), `playground-${uuidv4()}.mongodb.js` ); const documentUri = vscode.Uri.from({ @@ -138,7 +138,7 @@ suite('Active Connection CodeLens Provider Test Suite', () => { suite('the regular JS file', () => { beforeEach(async () => { - const fileName = path.join(os.tmpdir(), `regular-file-${uuidv4()}.js`); + const fileName = path.join(os.homedir(), `regular-file-${uuidv4()}.js`); const documentUri = vscode.Uri.from({ path: fileName, scheme: 'untitled', diff --git a/src/test/suite/editors/playgroundController.test.ts b/src/test/suite/editors/playgroundController.test.ts index 1c5807e1b..66e37c64e 100644 --- a/src/test/suite/editors/playgroundController.test.ts +++ b/src/test/suite/editors/playgroundController.test.ts @@ -205,7 +205,7 @@ suite('Playground Controller Test Suite', function () { suite('playground is open', () => { const fileName = path.join( - os.tmpdir(), + os.homedir(), `playground-${uuidv4()}.mongodb.js` ); const documentUri = vscode.Uri.from({ path: fileName, scheme: 'untitled' }); diff --git a/src/test/suite/editors/playgroundSelectedCodeActionProvider.test.ts b/src/test/suite/editors/playgroundSelectedCodeActionProvider.test.ts index 7777b172f..04646bed6 100644 --- a/src/test/suite/editors/playgroundSelectedCodeActionProvider.test.ts +++ b/src/test/suite/editors/playgroundSelectedCodeActionProvider.test.ts @@ -33,7 +33,7 @@ suite('Playground Selected CodeAction Provider Test Suite', function () { beforeEach(async () => { const fileName = path.join( - os.tmpdir(), + os.homedir(), `playground-${uuidv4()}.mongodb.js` ); const documentUri = vscode.Uri.from({ @@ -492,7 +492,7 @@ suite('Playground Selected CodeAction Provider Test Suite', function () { const testCodeActionProvider = new PlaygroundSelectedCodeActionProvider(); beforeEach(async () => { - const fileName = path.join(os.tmpdir(), `regular-file-${uuidv4()}.js`); + const fileName = path.join(os.homedir(), `regular-file-${uuidv4()}.js`); const documentUri = vscode.Uri.from({ path: fileName, scheme: 'untitled', diff --git a/src/test/suite/telemetry/connectionTelemetry.test.ts b/src/test/suite/telemetry/connectionTelemetry.test.ts index af3bd5a63..b7a662892 100644 --- a/src/test/suite/telemetry/connectionTelemetry.test.ts +++ b/src/test/suite/telemetry/connectionTelemetry.test.ts @@ -1,5 +1,5 @@ -import { beforeEach, afterEach } from 'mocha'; -import { connect } from 'mongodb-data-service'; +import { before, after, beforeEach, afterEach } from 'mocha'; +import { connect, DataServiceImpl } from 'mongodb-data-service'; import { expect } from 'chai'; import sinon from 'sinon'; @@ -12,20 +12,30 @@ suite('ConnectionTelemetry Controller Test Suite', function () { this.timeout(8000); suite('with mock data service', () => { - const mockDataService: any = { - getConnectionString: () => ({ + let mockDataService: DataServiceImpl; + + before(() => { + mockDataService = new DataServiceImpl({ + connectionString: TEST_DATABASE_URI, + }); + + sinon.stub(mockDataService, 'getConnectionString').returns({ hosts: ['localhost:27018'], searchParams: { get: () => null }, username: 'authMechanism', - }), - instance: () => - Promise.resolve({ - dataLake: {}, - build: {}, - genuineMongoDB: {}, - host: {}, - }), - }; + } as unknown as ReturnType); + + sinon.stub(mockDataService, 'instance').resolves({ + dataLake: {}, + build: {}, + genuineMongoDB: {}, + host: {}, + } as unknown as Awaited>); + }); + + after(() => { + sinon.restore(); + }); test('it returns is_used_connect_screen true when the connection type is form', async () => { const instanceTelemetry = await getConnectionTelemetryProperties( From 9f4f808f4338dddb9388798a81a2478306acc9e2 Mon Sep 17 00:00:00 2001 From: Alena Khineika Date: Mon, 27 Feb 2023 20:02:21 +0100 Subject: [PATCH 26/36] refactor: address pr comments --- src/explorer/playgroundsTree.ts | 14 ++- src/telemetry/telemetryService.ts | 6 +- src/test/runTest.ts | 3 +- .../activeConnectionCodeLensProvider.test.ts | 7 +- .../editors/playgroundController.test.ts | 6 +- ...aygroundSelectedCodeActionProvider.test.ts | 13 +-- .../language/languageServerController.test.ts | 1 + src/test/suite/mdbExtensionController.test.ts | 12 +-- .../telemetry/connectionTelemetry.test.ts | 98 +++++++++++-------- src/utils/playground.ts | 21 +--- tsconfig.json | 4 +- 11 files changed, 94 insertions(+), 91 deletions(-) diff --git a/src/explorer/playgroundsTree.ts b/src/explorer/playgroundsTree.ts index e6cc8af2f..3386e1dcf 100644 --- a/src/explorer/playgroundsTree.ts +++ b/src/explorer/playgroundsTree.ts @@ -111,14 +111,12 @@ export default class PlaygroundsTree excludeFromPlaygroundsSearch, }); - this._playgroundsTreeItems = {}; - - playgrounds.forEach((element) => { - this._playgroundsTreeItems[element.path] = new PlaygroundsTreeItem( - element.name, - element.path - ); - }); + this._playgroundsTreeItems = Object.fromEntries( + playgrounds.map((playground) => [ + playground.path, + new PlaygroundsTreeItem(playground.name, playground.path), + ]) + ); return this._playgroundsTreeItems; } diff --git a/src/telemetry/telemetryService.ts b/src/telemetry/telemetryService.ts index 479ee2be9..0d2640fb6 100644 --- a/src/telemetry/telemetryService.ts +++ b/src/telemetry/telemetryService.ts @@ -8,10 +8,8 @@ import SegmentAnalytics from 'analytics-node'; import { ConnectionTypes } from '../connectionController'; import { createLogger } from '../logging'; import { DocumentSource } from '../documentSource'; -import { - getConnectionTelemetryProperties, - NewConnectionTelemetryEventProperties, -} from './connectionTelemetry'; +import { getConnectionTelemetryProperties } from './connectionTelemetry'; +import type { NewConnectionTelemetryEventProperties } from './connectionTelemetry'; import type { ShellExecuteAllResult } from '../types/playgroundType'; import { StorageController } from '../storage'; diff --git a/src/test/runTest.ts b/src/test/runTest.ts index 7e67dc4a9..1b426f0b6 100644 --- a/src/test/runTest.ts +++ b/src/test/runTest.ts @@ -10,8 +10,7 @@ async function main(): Promise { // Passed to `--extensionDevelopmentPath` const extensionDevelopmentPath = path.join(__dirname, '../../'); - // The path to test runner - // Passed to --extensionTestsPath + // The path to test runner pased to --extensionTestsPath const extensionTestsPath = path.join(__dirname, './suite/index'); // This is the workspace we open in our tests. diff --git a/src/test/suite/editors/activeConnectionCodeLensProvider.test.ts b/src/test/suite/editors/activeConnectionCodeLensProvider.test.ts index 3fca3bfad..ecd14c41c 100644 --- a/src/test/suite/editors/activeConnectionCodeLensProvider.test.ts +++ b/src/test/suite/editors/activeConnectionCodeLensProvider.test.ts @@ -1,9 +1,8 @@ import * as vscode from 'vscode'; import { beforeEach, afterEach } from 'mocha'; -import { DataService } from 'mongodb-data-service'; +import type { DataService } from 'mongodb-data-service'; import chai from 'chai'; import sinon from 'sinon'; -import * as os from 'os'; import { v4 as uuidv4 } from 'uuid'; import path from 'path'; @@ -28,7 +27,7 @@ suite('Active Connection CodeLens Provider Test Suite', () => { suite('the MongoDB playground in JS', () => { beforeEach(async () => { const fileName = path.join( - os.homedir(), + 'nonexistent', `playground-${uuidv4()}.mongodb.js` ); const documentUri = vscode.Uri.from({ @@ -138,7 +137,7 @@ suite('Active Connection CodeLens Provider Test Suite', () => { suite('the regular JS file', () => { beforeEach(async () => { - const fileName = path.join(os.homedir(), `regular-file-${uuidv4()}.js`); + const fileName = path.join('nonexistent', `regular-file-${uuidv4()}.js`); const documentUri = vscode.Uri.from({ path: fileName, scheme: 'untitled', diff --git a/src/test/suite/editors/playgroundController.test.ts b/src/test/suite/editors/playgroundController.test.ts index 66e37c64e..26621454c 100644 --- a/src/test/suite/editors/playgroundController.test.ts +++ b/src/test/suite/editors/playgroundController.test.ts @@ -1,9 +1,8 @@ import * as vscode from 'vscode'; import { before, beforeEach, afterEach } from 'mocha'; import chai from 'chai'; -import { DataService } from 'mongodb-data-service'; +import type { DataService } from 'mongodb-data-service'; import sinon from 'sinon'; -import * as os from 'os'; import { v4 as uuidv4 } from 'uuid'; import path from 'path'; @@ -32,6 +31,7 @@ suite('Playground Controller Test Suite', function () { const mockExtensionContext = new TestExtensionContext(); + // The test extension runner. mockExtensionContext.extensionPath = '../../'; const mockStorageController = new StorageController(mockExtensionContext); @@ -205,7 +205,7 @@ suite('Playground Controller Test Suite', function () { suite('playground is open', () => { const fileName = path.join( - os.homedir(), + 'nonexistent', `playground-${uuidv4()}.mongodb.js` ); const documentUri = vscode.Uri.from({ path: fileName, scheme: 'untitled' }); diff --git a/src/test/suite/editors/playgroundSelectedCodeActionProvider.test.ts b/src/test/suite/editors/playgroundSelectedCodeActionProvider.test.ts index 04646bed6..f7793092f 100644 --- a/src/test/suite/editors/playgroundSelectedCodeActionProvider.test.ts +++ b/src/test/suite/editors/playgroundSelectedCodeActionProvider.test.ts @@ -2,7 +2,6 @@ import * as vscode from 'vscode'; import { beforeEach, afterEach } from 'mocha'; import chai from 'chai'; import sinon from 'sinon'; -import * as os from 'os'; import { v4 as uuidv4 } from 'uuid'; import path from 'path'; @@ -25,15 +24,17 @@ const expect = chai.expect; suite('Playground Selected CodeAction Provider Test Suite', function () { this.timeout(5000); - const testExtensionContext = new TestExtensionContext(); - testExtensionContext.extensionPath = '../../'; + const mockExtensionContext = new TestExtensionContext(); + + // The test extension runner. + mockExtensionContext.extensionPath = '../../'; suite('the MongoDB playground in JS', () => { const testCodeActionProvider = new PlaygroundSelectedCodeActionProvider(); beforeEach(async () => { const fileName = path.join( - os.homedir(), + 'nonexistent', `playground-${uuidv4()}.mongodb.js` ); const documentUri = vscode.Uri.from({ @@ -52,7 +53,7 @@ suite('Playground Selected CodeAction Provider Test Suite', function () { sinon.replace( mdbTestExtension.testExtensionController, '_languageServerController', - new LanguageServerController(testExtensionContext) + new LanguageServerController(mockExtensionContext) ); sinon.replace( vscode.window, @@ -492,7 +493,7 @@ suite('Playground Selected CodeAction Provider Test Suite', function () { const testCodeActionProvider = new PlaygroundSelectedCodeActionProvider(); beforeEach(async () => { - const fileName = path.join(os.homedir(), `regular-file-${uuidv4()}.js`); + const fileName = path.join('nonexistent', `regular-file-${uuidv4()}.js`); const documentUri = vscode.Uri.from({ path: fileName, scheme: 'untitled', diff --git a/src/test/suite/language/languageServerController.test.ts b/src/test/suite/language/languageServerController.test.ts index 48a9d9a1e..36a5a2a70 100644 --- a/src/test/suite/language/languageServerController.test.ts +++ b/src/test/suite/language/languageServerController.test.ts @@ -27,6 +27,7 @@ chai.use(require('chai-as-promised')); suite('Language Server Controller Test Suite', () => { const mockExtensionContext = new TestExtensionContext(); + // The test extension runner. mockExtensionContext.extensionPath = '../../'; const mockStorageController = new StorageController(mockExtensionContext); diff --git a/src/test/suite/mdbExtensionController.test.ts b/src/test/suite/mdbExtensionController.test.ts index 24d8137c2..18eb96ac8 100644 --- a/src/test/suite/mdbExtensionController.test.ts +++ b/src/test/suite/mdbExtensionController.test.ts @@ -570,7 +570,7 @@ suite('MDBExtensionController Test Suite', function () { const activeTextEditor = mdbTestExtension.testExtensionController._playgroundController ._activeTextEditor; - assert(activeTextEditor?.document.languageId === 'javascript'); + assert.strictEqual(activeTextEditor?.document.languageId, 'javascript'); assert(activeTextEditor?.document.uri.scheme === 'untitled'); const content = activeTextEditor.document.getText(); @@ -695,7 +695,7 @@ suite('MDBExtensionController Test Suite', function () { const activeTextEditor = mdbTestExtension.testExtensionController._playgroundController ._activeTextEditor; - assert(activeTextEditor?.document.languageId === 'javascript'); + assert.strictEqual(activeTextEditor?.document.languageId, 'javascript'); assert(activeTextEditor?.document.uri.scheme === 'untitled'); const content = activeTextEditor.document.getText(); @@ -1353,7 +1353,7 @@ suite('MDBExtensionController Test Suite', function () { const activeTextEditor = mdbTestExtension.testExtensionController._playgroundController ._activeTextEditor; - assert(activeTextEditor?.document.languageId === 'javascript'); + assert.strictEqual(activeTextEditor?.document.languageId, 'javascript'); assert(activeTextEditor?.document.uri.scheme === 'untitled'); const content = activeTextEditor.document.getText(); @@ -1373,7 +1373,7 @@ suite('MDBExtensionController Test Suite', function () { const activeTextEditor = mdbTestExtension.testExtensionController._playgroundController ._activeTextEditor; - assert(activeTextEditor?.document.languageId === 'javascript'); + assert.strictEqual(activeTextEditor?.document.languageId, 'javascript'); assert(activeTextEditor?.document.uri.scheme === 'untitled'); const content = activeTextEditor.document.getText(); @@ -1395,7 +1395,7 @@ suite('MDBExtensionController Test Suite', function () { const activeTextEditor = mdbTestExtension.testExtensionController._playgroundController ._activeTextEditor; - assert(activeTextEditor?.document.languageId === 'javascript'); + assert.strictEqual(activeTextEditor?.document.languageId, 'javascript'); assert(activeTextEditor?.document.uri.scheme === 'untitled'); const content = activeTextEditor.document.getText(); @@ -1415,7 +1415,7 @@ suite('MDBExtensionController Test Suite', function () { const activeTextEditor = mdbTestExtension.testExtensionController._playgroundController ._activeTextEditor; - assert(activeTextEditor?.document.languageId === 'javascript'); + assert.strictEqual(activeTextEditor?.document.languageId, 'javascript'); assert(activeTextEditor?.document.uri.scheme === 'untitled'); const content = activeTextEditor.document.getText(); diff --git a/src/test/suite/telemetry/connectionTelemetry.test.ts b/src/test/suite/telemetry/connectionTelemetry.test.ts index b7a662892..c429e595f 100644 --- a/src/test/suite/telemetry/connectionTelemetry.test.ts +++ b/src/test/suite/telemetry/connectionTelemetry.test.ts @@ -1,36 +1,47 @@ import { before, after, beforeEach, afterEach } from 'mocha'; -import { connect, DataServiceImpl } from 'mongodb-data-service'; +import { connect } from 'mongodb-data-service'; import { expect } from 'chai'; import sinon from 'sinon'; +import type { DataService } from 'mongodb-data-service'; + +import getCloudInfoModule from 'mongodb-cloud-info'; import { ConnectionTypes } from '../../../connectionController'; -import { getConnectionTelemetryProperties } from '../../../telemetry/connectionTelemetry'; +import * as connectionTelemetry from '../../../telemetry/connectionTelemetry'; const TEST_DATABASE_URI = 'mongodb://localhost:27018'; suite('ConnectionTelemetry Controller Test Suite', function () { - this.timeout(8000); + this.timeout(15000); suite('with mock data service', () => { - let mockDataService: DataServiceImpl; + let mockDataService: DataService; before(() => { - mockDataService = new DataServiceImpl({ - connectionString: TEST_DATABASE_URI, - }); - - sinon.stub(mockDataService, 'getConnectionString').returns({ + const getConnectionStringStub = sinon.stub(); + getConnectionStringStub.returns({ hosts: ['localhost:27018'], searchParams: { get: () => null }, username: 'authMechanism', - } as unknown as ReturnType); + } as unknown as ReturnType); - sinon.stub(mockDataService, 'instance').resolves({ + const instanceStub = sinon.stub(); + instanceStub.resolves({ dataLake: {}, build: {}, genuineMongoDB: {}, host: {}, - } as unknown as Awaited>); + } as unknown as Awaited>); + + mockDataService = { + getConnectionString: getConnectionStringStub, + instance: instanceStub, + } as Pick< + DataService, + 'getConnectionString' | 'instance' + > as unknown as DataService; + + sinon.stub(getCloudInfoModule, 'getCloudInfo').resolves({}); }); after(() => { @@ -38,10 +49,11 @@ suite('ConnectionTelemetry Controller Test Suite', function () { }); test('it returns is_used_connect_screen true when the connection type is form', async () => { - const instanceTelemetry = await getConnectionTelemetryProperties( - mockDataService, - ConnectionTypes.CONNECTION_FORM - ); + const instanceTelemetry = + await connectionTelemetry.getConnectionTelemetryProperties( + mockDataService, + ConnectionTypes.CONNECTION_FORM + ); expect(instanceTelemetry.is_used_connect_screen).to.equal(true); expect(instanceTelemetry.is_used_command_palette).to.equal(false); @@ -49,10 +61,11 @@ suite('ConnectionTelemetry Controller Test Suite', function () { }); test('it returns is_used_command_palette true when the connection type is string', async () => { - const instanceTelemetry = await getConnectionTelemetryProperties( - mockDataService, - ConnectionTypes.CONNECTION_STRING - ); + const instanceTelemetry = + await connectionTelemetry.getConnectionTelemetryProperties( + mockDataService, + ConnectionTypes.CONNECTION_STRING + ); expect(instanceTelemetry.is_used_connect_screen).to.equal(false); expect(instanceTelemetry.is_used_command_palette).to.equal(true); @@ -60,10 +73,11 @@ suite('ConnectionTelemetry Controller Test Suite', function () { }); test('it returns is_used_saved_connection true when the connection type is id', async () => { - const instanceTelemetry = await getConnectionTelemetryProperties( - mockDataService, - ConnectionTypes.CONNECTION_ID - ); + const instanceTelemetry = + await connectionTelemetry.getConnectionTelemetryProperties( + mockDataService, + ConnectionTypes.CONNECTION_ID + ); expect(instanceTelemetry.is_used_connect_screen).to.equal(false); expect(instanceTelemetry.is_used_command_palette).to.equal(false); @@ -71,28 +85,31 @@ suite('ConnectionTelemetry Controller Test Suite', function () { }); test('it has is_localhost false for a remote connection', async () => { - const instanceTelemetry = await getConnectionTelemetryProperties( - mockDataService, - ConnectionTypes.CONNECTION_STRING - ); + const instanceTelemetry = + await connectionTelemetry.getConnectionTelemetryProperties( + mockDataService, + ConnectionTypes.CONNECTION_STRING + ); expect(instanceTelemetry.is_localhost).to.equal(false); }); test('it has a default is atlas false', async () => { - const instanceTelemetry = await getConnectionTelemetryProperties( - mockDataService, - ConnectionTypes.CONNECTION_STRING - ); + const instanceTelemetry = + await connectionTelemetry.getConnectionTelemetryProperties( + mockDataService, + ConnectionTypes.CONNECTION_STRING + ); expect(instanceTelemetry.is_atlas).to.equal(false); }); test('it has a default driver auth mechanism undefined', async () => { - const instanceTelemetry = await getConnectionTelemetryProperties( - mockDataService, - ConnectionTypes.CONNECTION_STRING - ); + const instanceTelemetry = + await connectionTelemetry.getConnectionTelemetryProperties( + mockDataService, + ConnectionTypes.CONNECTION_STRING + ); expect(instanceTelemetry.auth_strategy).to.equal('DEFAULT'); }); @@ -111,10 +128,11 @@ suite('ConnectionTelemetry Controller Test Suite', function () { }); test('track new connection event fetches the connection instance information', async () => { - const instanceTelemetry = await getConnectionTelemetryProperties( - dataServ, - ConnectionTypes.CONNECTION_STRING - ); + const instanceTelemetry = + await connectionTelemetry.getConnectionTelemetryProperties( + dataServ, + ConnectionTypes.CONNECTION_STRING + ); expect(instanceTelemetry.is_localhost).to.equal(true); expect(instanceTelemetry.is_atlas).to.equal(false); diff --git a/src/utils/playground.ts b/src/utils/playground.ts index 6183eda3e..72effe505 100644 --- a/src/utils/playground.ts +++ b/src/utils/playground.ts @@ -72,19 +72,13 @@ export const isPlayground = (fileUri?: vscode.Uri) => { return false; } - // Allow users to save playgrounds with `.mongodb` extension. - if (fileNameParts.length === 2) { - return fileNameParts[fileNameParts.length - 1] === 'mongodb'; - } - // The default playgrounds extension is `.mongodb.js`. const extension = fileNameParts[fileNameParts.length - 1]; const secondaryExtension = fileNameParts[fileNameParts.length - 2]; return ( - fileNameParts.length > 1 && - (extension === 'mongodb' || - (extension === 'js' && secondaryExtension === 'mongodb')) + extension === 'mongodb' || + (extension === 'js' && secondaryExtension === 'mongodb') ); }; @@ -98,10 +92,7 @@ export const getPlaygrounds = async ({ playgrounds?: { name: string; path: string }[]; }): Promise<{ name: string; path: string }[]> => { const fileNames = await getFileNames(fsPath); - - for (let i = 0; i < fileNames.length; i++) { - const fileName = fileNames[i]; - + for (const fileName of fileNames) { try { const stat = await getStat(path.join(fsPath, fileName)); const fileUri = vscode.Uri.file(path.join(fsPath, fileName)); @@ -109,10 +100,8 @@ export const getPlaygrounds = async ({ if (stat.type === vscode.FileType.File && isPlayground(fileUri)) { playgrounds.push({ name: fileName, path: fileUri.fsPath }); } else if ( - (stat.type === vscode.FileType.Directory && - !excludeFromPlaygroundsSearch) || - (stat.type === vscode.FileType.Directory && - excludeFromPlaygroundsSearch && + stat.type === vscode.FileType.Directory && + (!excludeFromPlaygroundsSearch || !micromatch.isMatch(fileName, excludeFromPlaygroundsSearch)) ) { await getPlaygrounds({ diff --git a/tsconfig.json b/tsconfig.json index 144c43d8b..869b9fd61 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,9 +2,9 @@ "compilerOptions": { "module": "commonjs", "noImplicitAny": false, - "target": "es2018", + "target": "es2019", "outDir": "out", - "lib": ["dom", "es2018"], + "lib": ["dom", "es2019"], "types": ["node"], "jsx": "react", "sourceMap": true, From c8d59c9880fb955fbbecbd29c5a750a109594a1b Mon Sep 17 00:00:00 2001 From: Alena Khineika Date: Mon, 27 Feb 2023 20:42:19 +0100 Subject: [PATCH 27/36] test: try bigger timeout --- src/test/suite/telemetry/connectionTelemetry.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/suite/telemetry/connectionTelemetry.test.ts b/src/test/suite/telemetry/connectionTelemetry.test.ts index c429e595f..10f1b40a1 100644 --- a/src/test/suite/telemetry/connectionTelemetry.test.ts +++ b/src/test/suite/telemetry/connectionTelemetry.test.ts @@ -12,9 +12,8 @@ import * as connectionTelemetry from '../../../telemetry/connectionTelemetry'; const TEST_DATABASE_URI = 'mongodb://localhost:27018'; suite('ConnectionTelemetry Controller Test Suite', function () { - this.timeout(15000); - suite('with mock data service', () => { + this.timeout(8000); let mockDataService: DataService; before(() => { @@ -116,6 +115,7 @@ suite('ConnectionTelemetry Controller Test Suite', function () { }); suite('with live connection', () => { + this.timeout(20000); let dataServ; beforeEach(async () => { From d04bab4dde552ada0b8763334b051dd90906d819 Mon Sep 17 00:00:00 2001 From: Alena Khineika Date: Mon, 27 Feb 2023 22:12:24 +0100 Subject: [PATCH 28/36] test: less playground documents open --- .../activeConnectionCodeLensProvider.ts | 8 +-- .../playgroundSelectedCodeActionProvider.ts | 8 +-- .../activeConnectionCodeLensProvider.test.ts | 45 +++------------- ...aygroundSelectedCodeActionProvider.test.ts | 53 +++++-------------- src/utils/playground.ts | 11 ++-- 5 files changed, 37 insertions(+), 88 deletions(-) diff --git a/src/editors/activeConnectionCodeLensProvider.ts b/src/editors/activeConnectionCodeLensProvider.ts index 4fc53c54d..4710b108a 100644 --- a/src/editors/activeConnectionCodeLensProvider.ts +++ b/src/editors/activeConnectionCodeLensProvider.ts @@ -33,10 +33,12 @@ export default class ActiveConnectionCodeLensProvider this._onDidChangeCodeLenses.fire(); } - provideCodeLenses(): vscode.CodeLens[] { - const editorUri = this.activeTextEditor?.document.uri; + isPlayground(): boolean { + return isPlayground(this.activeTextEditor?.document.uri); + } - if (!isPlayground(editorUri)) { + provideCodeLenses(): vscode.CodeLens[] { + if (!this.isPlayground()) { return []; } diff --git a/src/editors/playgroundSelectedCodeActionProvider.ts b/src/editors/playgroundSelectedCodeActionProvider.ts index e651e6ee7..ec412b3b9 100644 --- a/src/editors/playgroundSelectedCodeActionProvider.ts +++ b/src/editors/playgroundSelectedCodeActionProvider.ts @@ -43,10 +43,12 @@ export default class PlaygroundSelectedCodeActionProvider this._onDidChangeCodeCodeAction.fire(); } - provideCodeActions(): vscode.CodeAction[] | undefined { - const editorUri = this.activeTextEditor?.document.uri; + isPlayground(): boolean { + return isPlayground(this.activeTextEditor?.document.uri); + } - if (!this.selection || !isPlayground(editorUri)) { + provideCodeActions(): vscode.CodeAction[] | undefined { + if (!this.selection || !this.isPlayground()) { return; } diff --git a/src/test/suite/editors/activeConnectionCodeLensProvider.test.ts b/src/test/suite/editors/activeConnectionCodeLensProvider.test.ts index 222092381..4ad2772d9 100644 --- a/src/test/suite/editors/activeConnectionCodeLensProvider.test.ts +++ b/src/test/suite/editors/activeConnectionCodeLensProvider.test.ts @@ -2,8 +2,6 @@ import * as vscode from 'vscode'; import { beforeEach, afterEach } from 'mocha'; import chai from 'chai'; import sinon from 'sinon'; -import { v4 as uuidv4 } from 'uuid'; -import path from 'path'; import type { DataService } from 'mongodb-data-service'; import ActiveConnectionCodeLensProvider from '../../../editors/activeConnectionCodeLensProvider'; @@ -25,25 +23,6 @@ suite('Active Connection CodeLens Provider Test Suite', () => { const testStatusView = new StatusView(mockExtensionContext); suite('the MongoDB playground in JS', () => { - beforeEach(async () => { - const fileName = path.join( - 'nonexistent', - `playground-${uuidv4()}.mongodb.js` - ); - const documentUri = vscode.Uri.from({ - path: fileName, - scheme: 'untitled', - }); - const document = await vscode.workspace.openTextDocument(documentUri); - await vscode.window.showTextDocument(document); - }); - - afterEach(async () => { - await vscode.commands.executeCommand( - 'workbench.action.closeActiveEditor' - ); - }); - suite('user is not connected', () => { const testConnectionController = new ConnectionController( testStatusView, @@ -60,6 +39,8 @@ suite('Active Connection CodeLens Provider Test Suite', () => { vscode.window.activeTextEditor ); sinon.replace(vscode.window, 'showQuickPick', mockShowQuickPick); + const mockIsPlayground = sinon.fake.returns(true); + sinon.replace(testCodeLensProvider, 'isPlayground', mockIsPlayground); }); afterEach(() => { @@ -117,6 +98,8 @@ suite('Active Connection CodeLens Provider Test Suite', () => { 'getActiveConnectionName', sinon.fake.returns('fakeName') ); + const mockIsPlayground = sinon.fake.returns(true); + sinon.replace(testCodeLensProvider, 'isPlayground', mockIsPlayground); }); afterEach(() => { @@ -141,22 +124,6 @@ suite('Active Connection CodeLens Provider Test Suite', () => { }); suite('the regular JS file', () => { - beforeEach(async () => { - const fileName = path.join('nonexistent', `regular-file-${uuidv4()}.js`); - const documentUri = vscode.Uri.from({ - path: fileName, - scheme: 'untitled', - }); - const document = await vscode.workspace.openTextDocument(documentUri); - await vscode.window.showTextDocument(document); - }); - - afterEach(async () => { - await vscode.commands.executeCommand( - 'workbench.action.closeActiveEditor' - ); - }); - suite('user is not connected', () => { const testConnectionController = new ConnectionController( testStatusView, @@ -170,6 +137,8 @@ suite('Active Connection CodeLens Provider Test Suite', () => { beforeEach(() => { sinon.replace(vscode.window, 'showQuickPick', mockShowQuickPick); + const mockIsPlayground = sinon.fake.returns(false); + sinon.replace(testCodeLensProvider, 'isPlayground', mockIsPlayground); }); afterEach(() => { @@ -219,6 +188,8 @@ suite('Active Connection CodeLens Provider Test Suite', () => { 'getActiveConnectionName', sinon.fake.returns('fakeName') ); + const mockIsPlayground = sinon.fake.returns(false); + sinon.replace(testCodeLensProvider, 'isPlayground', mockIsPlayground); }); afterEach(() => { diff --git a/src/test/suite/editors/playgroundSelectedCodeActionProvider.test.ts b/src/test/suite/editors/playgroundSelectedCodeActionProvider.test.ts index f7793092f..54419a582 100644 --- a/src/test/suite/editors/playgroundSelectedCodeActionProvider.test.ts +++ b/src/test/suite/editors/playgroundSelectedCodeActionProvider.test.ts @@ -2,10 +2,8 @@ import * as vscode from 'vscode'; import { beforeEach, afterEach } from 'mocha'; import chai from 'chai'; import sinon from 'sinon'; -import { v4 as uuidv4 } from 'uuid'; -import path from 'path'; -import ActiveDBCodeLensProvider from '../../../editors/activeConnectionCodeLensProvider'; +import ActiveConnectionCodeLensProvider from '../../../editors/activeConnectionCodeLensProvider'; import ExportToLanguageCodeLensProvider from '../../../editors/exportToLanguageCodeLensProvider'; import PlaygroundSelectedCodeActionProvider from '../../../editors/playgroundSelectedCodeActionProvider'; import { ExplorerController } from '../../../explorer'; @@ -33,23 +31,6 @@ suite('Playground Selected CodeAction Provider Test Suite', function () { const testCodeActionProvider = new PlaygroundSelectedCodeActionProvider(); beforeEach(async () => { - const fileName = path.join( - 'nonexistent', - `playground-${uuidv4()}.mongodb.js` - ); - const documentUri = vscode.Uri.from({ - path: fileName, - scheme: 'untitled', - }); - const edit = new vscode.WorkspaceEdit(); - edit.insert(documentUri, new vscode.Position(0, 0), '123'); - await vscode.workspace.applyEdit(edit); - const document = await vscode.workspace.openTextDocument(documentUri); - await vscode.window.showTextDocument(document); - testCodeActionProvider.setActiveTextEditor( - vscode.window.activeTextEditor - ); - sinon.replace( mdbTestExtension.testExtensionController, '_languageServerController', @@ -65,9 +46,10 @@ suite('Playground Selected CodeAction Provider Test Suite', function () { TEST_DATABASE_URI ); - const testActiveDBCodeLensProvider = new ActiveDBCodeLensProvider( - mdbTestExtension.testExtensionController._connectionController - ); + const activeConnectionCodeLensProvider = + new ActiveConnectionCodeLensProvider( + mdbTestExtension.testExtensionController._connectionController + ); const testExportToLanguageCodeLensProvider = new ExportToLanguageCodeLensProvider(); const testExplorerController = new ExplorerController( @@ -81,7 +63,7 @@ suite('Playground Selected CodeAction Provider Test Suite', function () { mdbTestExtension.testExtensionController._telemetryService, mdbTestExtension.testExtensionController._statusView, mdbTestExtension.testExtensionController._playgroundResultViewProvider, - testActiveDBCodeLensProvider, + activeConnectionCodeLensProvider, testExportToLanguageCodeLensProvider, testCodeActionProvider, testExplorerController @@ -100,6 +82,9 @@ suite('Playground Selected CodeAction Provider Test Suite', function () { await mdbTestExtension.testExtensionController._languageServerController.startLanguageServer(); await mdbTestExtension.testExtensionController._playgroundController._connectToServiceProvider(); + + const mockIsPlayground = sinon.fake.returns(true); + sinon.replace(testCodeActionProvider, 'isPlayground', mockIsPlayground); }); afterEach(async () => { @@ -492,23 +477,13 @@ suite('Playground Selected CodeAction Provider Test Suite', function () { suite('the regular JS file', () => { const testCodeActionProvider = new PlaygroundSelectedCodeActionProvider(); - beforeEach(async () => { - const fileName = path.join('nonexistent', `regular-file-${uuidv4()}.js`); - const documentUri = vscode.Uri.from({ - path: fileName, - scheme: 'untitled', - }); - const document = await vscode.workspace.openTextDocument(documentUri); - await vscode.window.showTextDocument(document); - testCodeActionProvider.setActiveTextEditor( - vscode.window.activeTextEditor - ); + beforeEach(() => { + const mockIsPlayground = sinon.fake.returns(false); + sinon.replace(testCodeActionProvider, 'isPlayground', mockIsPlayground); }); - afterEach(async () => { - await vscode.commands.executeCommand( - 'workbench.action.closeActiveEditor' - ); + afterEach(() => { + sinon.restore(); }); test('returns undefined when text is not selected', () => { diff --git a/src/utils/playground.ts b/src/utils/playground.ts index 72effe505..5f84f4439 100644 --- a/src/utils/playground.ts +++ b/src/utils/playground.ts @@ -85,12 +85,11 @@ export const isPlayground = (fileUri?: vscode.Uri) => { export const getPlaygrounds = async ({ fsPath, excludeFromPlaygroundsSearch, - playgrounds = [], }: { fsPath: string; excludeFromPlaygroundsSearch?: string[]; - playgrounds?: { name: string; path: string }[]; }): Promise<{ name: string; path: string }[]> => { + const result: { name: string; path: string }[] = []; const fileNames = await getFileNames(fsPath); for (const fileName of fileNames) { try { @@ -98,22 +97,22 @@ export const getPlaygrounds = async ({ const fileUri = vscode.Uri.file(path.join(fsPath, fileName)); if (stat.type === vscode.FileType.File && isPlayground(fileUri)) { - playgrounds.push({ name: fileName, path: fileUri.fsPath }); + result.push({ name: fileName, path: fileUri.fsPath }); } else if ( stat.type === vscode.FileType.Directory && (!excludeFromPlaygroundsSearch || !micromatch.isMatch(fileName, excludeFromPlaygroundsSearch)) ) { - await getPlaygrounds({ + const playgrounds = await getPlaygrounds({ fsPath: fileUri.fsPath, excludeFromPlaygroundsSearch, - playgrounds, }); + result.push(...playgrounds); } } catch (error) { log.error('Get playgrounds recursively from the workspace error', error); } } - return playgrounds; + return result; }; From 6c849d92c746eb0cbc5c137dfdf09706e158e7a0 Mon Sep 17 00:00:00 2001 From: Alena Khineika Date: Tue, 28 Feb 2023 17:45:27 +0100 Subject: [PATCH 29/36] test: clean up --- package-lock.json | 20 + package.json | 1 + scripts/update-snippets.ts | 0 src/test/suite/mdbExtensionController.test.ts | 3316 ++++++++--------- .../telemetry/connectionTelemetry.test.ts | 7 +- src/utils/playground.ts | 2 +- 6 files changed, 1641 insertions(+), 1705 deletions(-) mode change 100755 => 100644 scripts/update-snippets.ts diff --git a/package-lock.json b/package-lock.json index cbdd04a64..60155c8a7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -61,6 +61,7 @@ "@types/glob": "^7.2.0", "@types/jest": "^26.0.24", "@types/micromatch": "^4.0.2", + "@types/mkdirp": "^2.0.0", "@types/mocha": "^8.2.3", "@types/node": "^14.18.29", "@types/react": "^17.0.50", @@ -4375,6 +4376,16 @@ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", "dev": true }, + "node_modules/@types/mkdirp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-2.0.0.tgz", + "integrity": "sha512-c/iUqMymAlxLAyIK3u5SzrwkrkyOdv1XDc91T+b5FsY7Jr6ERhUD19jJHOhPW4GD6tmN6mFEorfSdks525pwdQ==", + "deprecated": "This is a stub types definition. mkdirp provides its own type definitions, so you do not need this installed.", + "dev": true, + "dependencies": { + "mkdirp": "*" + } + }, "node_modules/@types/mocha": { "version": "8.2.3", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.3.tgz", @@ -27829,6 +27840,15 @@ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", "dev": true }, + "@types/mkdirp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-2.0.0.tgz", + "integrity": "sha512-c/iUqMymAlxLAyIK3u5SzrwkrkyOdv1XDc91T+b5FsY7Jr6ERhUD19jJHOhPW4GD6tmN6mFEorfSdks525pwdQ==", + "dev": true, + "requires": { + "mkdirp": "*" + } + }, "@types/mocha": { "version": "8.2.3", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.3.tgz", diff --git a/package.json b/package.json index 7d300910c..187963ed4 100644 --- a/package.json +++ b/package.json @@ -1028,6 +1028,7 @@ "@types/glob": "^7.2.0", "@types/jest": "^26.0.24", "@types/micromatch": "^4.0.2", + "@types/mkdirp": "^2.0.0", "@types/mocha": "^8.2.3", "@types/node": "^14.18.29", "@types/react": "^17.0.50", diff --git a/scripts/update-snippets.ts b/scripts/update-snippets.ts old mode 100755 new mode 100644 diff --git a/src/test/suite/mdbExtensionController.test.ts b/src/test/suite/mdbExtensionController.test.ts index 1a15dd6d7..c35f5e218 100644 --- a/src/test/suite/mdbExtensionController.test.ts +++ b/src/test/suite/mdbExtensionController.test.ts @@ -29,1830 +29,1744 @@ const testDatabaseURI = 'mongodb://localhost:27018'; suite('MDBExtensionController Test Suite', function () { this.timeout(10000); - const sandbox = sinon.createSandbox(); - let fakeShowInformationMessage: sinon.SinonStub; - - beforeEach(() => { - // Here we stub the showInformationMessage process because it is too much - // for the render process and leads to crashes while testing. - fakeShowInformationMessage = sinon.stub( - vscode.window, - 'showInformationMessage' - ); - }); + suite('with mock text document', () => { + suite('when not connected', () => { + const sandbox = sinon.createSandbox(); + let fakeVscodeErrorMessage: SinonSpy; - afterEach(() => { - sandbox.restore(); - sinon.restore(); - }); + beforeEach(() => { + sinon.stub(vscode.window, 'showInformationMessage'); + sinon.stub(vscode.workspace, 'openTextDocument'); + sinon.stub(vscode.window, 'showTextDocument'); + fakeVscodeErrorMessage = sinon.fake(); + sinon.replace( + vscode.window, + 'showErrorMessage', + fakeVscodeErrorMessage + ); + }); - test('mdb.viewCollectionDocuments command should call onViewCollectionDocuments on the editor controller with the collection namespace', async () => { - const mockOpenTextDocument = sinon.fake.resolves('magna carta'); - sinon.replace(vscode.workspace, 'openTextDocument', mockOpenTextDocument); - - const mockShowTextDocument = sinon.fake(); - sinon.replace(vscode.window, 'showTextDocument', mockShowTextDocument); - - const textCollectionTree = new CollectionTreeItem( - { - name: 'testColName', - type: CollectionTypes.collection, - }, - 'testDbName', - {}, - false, - false, - null - ); - - await vscode.commands.executeCommand( - 'mdb.viewCollectionDocuments', - textCollectionTree - ); - assert.strictEqual( - mockOpenTextDocument.firstCall.args[0].path.indexOf( - 'Results: testDbName.testColName' - ), - 0 - ); - assert(mockOpenTextDocument.firstCall.args[0].path.includes('.json')); - assert.strictEqual( - mockOpenTextDocument.firstCall.args[0].scheme, - VIEW_COLLECTION_SCHEME - ); - assert( - mockOpenTextDocument.firstCall.args[0].query.includes( - 'namespace=testDbName.testColName' - ) - ); - - assert.strictEqual(mockShowTextDocument.firstCall.args[0], 'magna carta'); - }); + afterEach(() => { + sandbox.restore(); + sinon.restore(); + }); - test('mdb.viewCollectionDocuments command should also work with the documents list', async () => { - const mockOpenTextDocument = sinon.fake.resolves('magna carta'); - sinon.replace(vscode.workspace, 'openTextDocument', mockOpenTextDocument); - - const mockShowTextDocument = sinon.fake(); - sinon.replace(vscode.window, 'showTextDocument', mockShowTextDocument); - - const textCollectionTree = new CollectionTreeItem( - { - name: 'testColName', - type: CollectionTypes.collection, - }, - 'testDbName', - {}, - false, - false, - null - ); - - await vscode.commands.executeCommand( - 'mdb.viewCollectionDocuments', - textCollectionTree - ); - assert.strictEqual( - mockOpenTextDocument.firstCall.args[0].path.indexOf( - 'Results: testDbName.testColName' - ), - 0 - ); - assert(mockOpenTextDocument.firstCall.args[0].path.includes('.json')); - assert.strictEqual( - mockOpenTextDocument.firstCall.args[0].scheme, - VIEW_COLLECTION_SCHEME - ); - assert( - mockOpenTextDocument.firstCall.args[0].query.includes( - 'namespace=testDbName.testColName' - ) - ); - - assert.strictEqual(mockShowTextDocument.firstCall.args[0], 'magna carta'); - }); + test('mdb.addDatabase command fails when not connected to the connection', async () => { + const mockTreeItem = new ConnectionTreeItem( + 'tasty_sandwhich', + vscode.TreeItemCollapsibleState.None, + false, + mdbTestExtension.testExtensionController._connectionController, + false, + {} + ); + const addDatabaseSucceeded = await vscode.commands.executeCommand( + 'mdb.addDatabase', + mockTreeItem + ); + assert( + addDatabaseSucceeded === false, + 'Expected the command handler to return a false succeeded response' + ); - test('mdb.addConnection command should call openWebview on the webview controller', async () => { - const mockOpenWebview = sinon.fake(); - sinon.replace( - mdbTestExtension.testExtensionController._webviewController, - 'openWebview', - mockOpenWebview - ); + const expectedMessage = + 'Please connect to this connection before adding a database.'; + assert( + fakeVscodeErrorMessage.firstCall.args[0] === expectedMessage, + `Expected an error message "${expectedMessage}" to be shown when attempting to add a database to a not connected connection found "${fakeVscodeErrorMessage.firstCall.args[0]}"` + ); + }); + }); - await vscode.commands.executeCommand('mdb.addConnection'); - assert.strictEqual(mockOpenWebview.calledOnce, true); - }); + suite('when connected', () => { + const sandbox = sinon.createSandbox(); + let fakeShowInformationMessage: sinon.SinonStub; + let mockOpenTextDocument: SinonSpy; + let mockActiveConnectionId: SinonSpy; + let fakeVscodeErrorMessage: SinonSpy; - test('mdb.addConnectionWithURI command should call connectWithURI on the connection controller', async () => { - const mockConnectWithUri = sinon.fake(); - sinon.replace( - mdbTestExtension.testExtensionController._connectionController, - 'connectWithURI', - mockConnectWithUri - ); + beforeEach(() => { + sinon.stub(vscode.window, 'showTextDocument'); + fakeShowInformationMessage = sinon.stub( + vscode.window, + 'showInformationMessage' + ); + mockOpenTextDocument = sinon.stub(vscode.workspace, 'openTextDocument'); + mockActiveConnectionId = sinon.fake.returns('tasty_sandwhich'); + sinon.replace( + mdbTestExtension.testExtensionController._connectionController, + 'getActiveConnectionId', + mockActiveConnectionId + ); + fakeVscodeErrorMessage = sinon.fake(); + sinon.replace( + vscode.window, + 'showErrorMessage', + fakeVscodeErrorMessage + ); + }); - await vscode.commands.executeCommand('mdb.addConnectionWithURI'); - assert.strictEqual(mockConnectWithUri.calledOnce, true); - }); + afterEach(() => { + sandbox.restore(); + sinon.restore(); + }); - test('mdb.refreshConnection command should reset the cache on a connection tree item', async () => { - const mockTreeItem = new ConnectionTreeItem( - 'test', - vscode.TreeItemCollapsibleState.None, - false, - mdbTestExtension.testExtensionController._connectionController, - false, - {} - ); - - mockTreeItem.cacheIsUpToDate = true; - - const mockExplorerControllerRefresh = sinon.fake(); - sinon.replace( - mdbTestExtension.testExtensionController._explorerController, - 'refresh', - mockExplorerControllerRefresh - ); - - await vscode.commands.executeCommand('mdb.refreshConnection', mockTreeItem); - assert.strictEqual( - mockTreeItem.cacheIsUpToDate, - false, - 'Expected cache on tree item to be set to not up to date.' - ); - assert.strictEqual( - mockExplorerControllerRefresh.called, - true, - 'Expected explorer controller refresh to be called.' - ); - }); + test('mdb.viewCollectionDocuments command should call onViewCollectionDocuments on the editor controller with the collection namespace', async () => { + const textCollectionTree = new CollectionTreeItem( + { + name: 'testColName', + type: CollectionTypes.collection, + }, + 'testDbName', + {}, + false, + false, + null + ); + await vscode.commands.executeCommand( + 'mdb.viewCollectionDocuments', + textCollectionTree + ); + assert.strictEqual( + mockOpenTextDocument.firstCall.args[0].path.indexOf( + 'Results: testDbName.testColName' + ), + 0 + ); + assert(mockOpenTextDocument.firstCall.args[0].path.includes('.json')); + assert.strictEqual( + mockOpenTextDocument.firstCall.args[0].scheme, + VIEW_COLLECTION_SCHEME + ); + assert( + mockOpenTextDocument.firstCall.args[0].query.includes( + 'namespace=testDbName.testColName' + ) + ); + }); - test('mdb.treeItemRemoveConnection command should call removeMongoDBConnection on the connection controller with the tree item connection id', async () => { - const mockTreeItem = new ConnectionTreeItem( - 'craving_for_pancakes_with_maple_syrup', - vscode.TreeItemCollapsibleState.None, - false, - mdbTestExtension.testExtensionController._connectionController, - false, - {} - ); - - const mockRemoveMongoDBConnection = sinon.fake(); - sinon.replace( - mdbTestExtension.testExtensionController._connectionController, - 'removeMongoDBConnection', - mockRemoveMongoDBConnection - ); - - await vscode.commands.executeCommand( - 'mdb.treeItemRemoveConnection', - mockTreeItem - ); - assert.strictEqual(mockRemoveMongoDBConnection.calledOnce, true); - assert.strictEqual( - mockRemoveMongoDBConnection.firstCall.args[0], - 'craving_for_pancakes_with_maple_syrup' - ); - }); + test('mdb.viewCollectionDocuments command should also work with the documents list', async () => { + const textCollectionTree = new CollectionTreeItem( + { + name: 'testColName', + type: CollectionTypes.collection, + }, + 'testDbName', + {}, + false, + false, + null + ); + await vscode.commands.executeCommand( + 'mdb.viewCollectionDocuments', + textCollectionTree + ); + assert.strictEqual( + mockOpenTextDocument.firstCall.args[0].path.indexOf( + 'Results: testDbName.testColName' + ), + 0 + ); + assert(mockOpenTextDocument.firstCall.args[0].path.includes('.json')); + assert.strictEqual( + mockOpenTextDocument.firstCall.args[0].scheme, + VIEW_COLLECTION_SCHEME + ); + assert( + mockOpenTextDocument.firstCall.args[0].query.includes( + 'namespace=testDbName.testColName' + ) + ); + }); - test('mdb.copyConnectionString command should try to copy the driver url to the vscode env clipboard', async () => { - const mockTreeItem = new ConnectionTreeItem( - 'craving_for_pancakes_with_maple_syrup', - vscode.TreeItemCollapsibleState.None, - false, - mdbTestExtension.testExtensionController._connectionController, - false, - {} - ); - - const mockCopyToClipboard = sinon.fake(); - sinon.replaceGetter(vscode.env, 'clipboard', () => ({ - writeText: mockCopyToClipboard, - readText: sinon.fake(), - })); - - const mockStubUri = sinon.fake.returns('weStubThisUri'); - sinon.replace( - mdbTestExtension.testExtensionController._connectionController, - 'copyConnectionStringByConnectionId', - mockStubUri - ); - - await vscode.commands.executeCommand( - 'mdb.copyConnectionString', - mockTreeItem - ); - assert.strictEqual(mockCopyToClipboard.calledOnce, true); - assert.strictEqual(mockCopyToClipboard.firstCall.args[0], 'weStubThisUri'); - }); + test('mdb.addConnection command should call openWebview on the webview controller', async () => { + const mockOpenWebview = sinon.fake(); + sinon.replace( + mdbTestExtension.testExtensionController._webviewController, + 'openWebview', + mockOpenWebview + ); + await vscode.commands.executeCommand('mdb.addConnection'); + assert.strictEqual(mockOpenWebview.calledOnce, true); + }); - test('mdb.copyDatabaseName command should try to copy the database name to the vscode env clipboard', async () => { - const mockTreeItem = new DatabaseTreeItem( - 'isClubMateTheBestDrinkEver', - {}, - false, - false, - {} - ); - - const mockCopyToClipboard = sinon.fake(); - sinon.replaceGetter(vscode.env, 'clipboard', () => ({ - writeText: mockCopyToClipboard, - readText: sinon.fake(), - })); - - await vscode.commands.executeCommand('mdb.copyDatabaseName', mockTreeItem); - assert.strictEqual(mockCopyToClipboard.calledOnce, true); - assert.strictEqual( - mockCopyToClipboard.firstCall.args[0], - 'isClubMateTheBestDrinkEver' - ); - }); + test('mdb.addConnectionWithURI command should call connectWithURI on the connection controller', async () => { + const mockConnectWithUri = sinon.fake(); + sinon.replace( + mdbTestExtension.testExtensionController._connectionController, + 'connectWithURI', + mockConnectWithUri + ); + await vscode.commands.executeCommand('mdb.addConnectionWithURI'); + assert.strictEqual(mockConnectWithUri.calledOnce, true); + }); - test('mdb.copyCollectionName command should try to copy the collection name to the vscode env clipboard', async () => { - const mockTreeItem = new CollectionTreeItem( - { - name: 'waterBuffalo', - type: CollectionTypes.collection, - }, - 'airZebra', - {}, - false, - false, - null - ); - - const mockCopyToClipboard = sinon.fake(); - sinon.replaceGetter(vscode.env, 'clipboard', () => ({ - writeText: mockCopyToClipboard, - readText: sinon.fake(), - })); - - await vscode.commands.executeCommand( - 'mdb.copyCollectionName', - mockTreeItem - ); - assert( - mockCopyToClipboard.called, - 'Expected "writeText" to be called on "vscode.env.clipboard".' - ); - assert( - mockCopyToClipboard.firstCall.args[0] === 'waterBuffalo', - `Expected the clipboard to be sent the uri string "waterBuffalo", found ${mockCopyToClipboard.firstCall.args[0]}.` - ); - }); + test('mdb.refreshConnection command should reset the cache on a connection tree item', async () => { + const mockTreeItem = new ConnectionTreeItem( + 'test', + vscode.TreeItemCollapsibleState.None, + false, + mdbTestExtension.testExtensionController._connectionController, + false, + {} + ); + mockTreeItem.cacheIsUpToDate = true; - test('mdb.copySchemaFieldName command should try to copy the field name to the vscode env clipboard', async () => { - const mockTreeItem = new FieldTreeItem( - { - name: 'dolphins are sentient', - probability: 1, - type: 'String', - types: [], - }, - false, - {} - ); - - const mockCopyToClipboard = sinon.fake(); - sinon.replaceGetter(vscode.env, 'clipboard', () => ({ - writeText: mockCopyToClipboard, - readText: sinon.fake(), - })); - - const commandResult = await vscode.commands.executeCommand( - 'mdb.copySchemaFieldName', - mockTreeItem - ); - - assert(commandResult); - assert( - mockCopyToClipboard.called, - 'Expected "writeText" to be called on "vscode.env.clipboard".' - ); - assert( - mockCopyToClipboard.firstCall.args[0] === 'dolphins are sentient', - `Expected the clipboard to be sent the schema field name "dolphins are sentient", found ${mockCopyToClipboard.firstCall.args[0]}.` - ); - }); + const mockExplorerControllerRefresh = sinon.fake(); + sinon.replace( + mdbTestExtension.testExtensionController._explorerController, + 'refresh', + mockExplorerControllerRefresh + ); + await vscode.commands.executeCommand( + 'mdb.refreshConnection', + mockTreeItem + ); + assert.strictEqual( + mockTreeItem.cacheIsUpToDate, + false, + 'Expected cache on tree item to be set to not up to date.' + ); + assert.strictEqual( + mockExplorerControllerRefresh.called, + true, + 'Expected explorer controller refresh to be called.' + ); + }); - test('mdb.refreshDatabase command should reset the cache on the database tree item', async () => { - const mockTreeItem = new DatabaseTreeItem( - 'pinkLemonade', - {}, - false, - false, - {} - ); - - mockTreeItem.cacheIsUpToDate = true; - - const mockExplorerControllerRefresh = sinon.fake(); - sinon.replace( - mdbTestExtension.testExtensionController._explorerController, - 'refresh', - mockExplorerControllerRefresh - ); - - await vscode.commands.executeCommand('mdb.refreshDatabase', mockTreeItem); - assert.strictEqual( - mockTreeItem.cacheIsUpToDate, - false, - 'Expected cache on tree item to be set to not up to date.' - ); - assert( - mockExplorerControllerRefresh.called === true, - 'Expected explorer controller refresh to be called.' - ); - }); + test('mdb.treeItemRemoveConnection command should call removeMongoDBConnection on the connection controller with the tree item connection id', async () => { + const mockTreeItem = new ConnectionTreeItem( + 'craving_for_pancakes_with_maple_syrup', + vscode.TreeItemCollapsibleState.None, + false, + mdbTestExtension.testExtensionController._connectionController, + false, + {} + ); + const mockRemoveMongoDBConnection = sinon.fake(); + sinon.replace( + mdbTestExtension.testExtensionController._connectionController, + 'removeMongoDBConnection', + mockRemoveMongoDBConnection + ); + await vscode.commands.executeCommand( + 'mdb.treeItemRemoveConnection', + mockTreeItem + ); + assert.strictEqual(mockRemoveMongoDBConnection.calledOnce, true); + assert.strictEqual( + mockRemoveMongoDBConnection.firstCall.args[0], + 'craving_for_pancakes_with_maple_syrup' + ); + }); - test('mdb.refreshCollection command should reset the expanded state of its children and call to refresh the explorer controller', async () => { - const mockTreeItem = new CollectionTreeItem( - { - name: 'iSawACatThatLookedLikeALionToday', - type: CollectionTypes.collection, - }, - 'airZebra', - {}, - false, - false, - null - ); - - mockTreeItem.isExpanded = true; - - // Set expanded. - mockTreeItem.getSchemaChild().isExpanded = true; - mockTreeItem.getDocumentListChild().isExpanded = true; - - const mockExplorerControllerRefresh = sinon.fake(); - sinon.replace( - mdbTestExtension.testExtensionController._explorerController, - 'refresh', - mockExplorerControllerRefresh - ); - - await vscode.commands.executeCommand('mdb.refreshCollection', mockTreeItem); - assert( - mockTreeItem.getSchemaChild().isExpanded === false, - 'Expected collection tree item child to be reset to not expanded.' - ); - assert( - mockExplorerControllerRefresh.called === true, - 'Expected explorer controller refresh to be called.' - ); - }); + test('mdb.copyConnectionString command should try to copy the driver url to the vscode env clipboard', async () => { + const mockTreeItem = new ConnectionTreeItem( + 'craving_for_pancakes_with_maple_syrup', + vscode.TreeItemCollapsibleState.None, + false, + mdbTestExtension.testExtensionController._connectionController, + false, + {} + ); + const mockCopyToClipboard = sinon.fake(); + sinon.replaceGetter(vscode.env, 'clipboard', () => ({ + writeText: mockCopyToClipboard, + readText: sinon.fake(), + })); + const mockStubUri = sinon.fake.returns('weStubThisUri'); + sinon.replace( + mdbTestExtension.testExtensionController._connectionController, + 'copyConnectionStringByConnectionId', + mockStubUri + ); + await vscode.commands.executeCommand( + 'mdb.copyConnectionString', + mockTreeItem + ); + assert.strictEqual(mockCopyToClipboard.calledOnce, true); + assert.strictEqual( + mockCopyToClipboard.firstCall.args[0], + 'weStubThisUri' + ); + }); - test('mdb.refreshDocumentList command should update the document count and call to refresh the explorer controller', async () => { - let count = 9000; - const mockTreeItem = new CollectionTreeItem( - { - name: 'iSawACatThatLookedLikeALionToday', - type: CollectionTypes.collection, - }, - 'airZebra', - { estimatedCount: () => Promise.resolve(count) }, - false, - false, - null - ); - - await mockTreeItem.onDidExpand(); - - const collectionChildren = await mockTreeItem.getChildren(); - const docListTreeItem = collectionChildren[0]; - - assert(docListTreeItem.description === '9K'); - - count = 10000; - - docListTreeItem.isExpanded = true; - - const mockExplorerControllerRefresh = sinon.fake(); - sinon.replace( - mdbTestExtension.testExtensionController._explorerController, - 'refresh', - mockExplorerControllerRefresh - ); - - await vscode.commands.executeCommand( - 'mdb.refreshDocumentList', - docListTreeItem - ); - - assert( - docListTreeItem.cacheIsUpToDate === false, - 'Expected document list cache to be out of date.' - ); - assert( - mockTreeItem.documentCount === 10000, - `Expected document count to be 10000, found ${mockTreeItem.documentCount}.` - ); - assert( - mockExplorerControllerRefresh.called === true, - 'Expected explorer controller refresh to be called.' - ); - }); + test('mdb.copyDatabaseName command should try to copy the database name to the vscode env clipboard', async () => { + const mockTreeItem = new DatabaseTreeItem( + 'isClubMateTheBestDrinkEver', + {}, + false, + false, + {} + ); + const mockCopyToClipboard = sinon.fake(); + sinon.replaceGetter(vscode.env, 'clipboard', () => ({ + writeText: mockCopyToClipboard, + readText: sinon.fake(), + })); + await vscode.commands.executeCommand( + 'mdb.copyDatabaseName', + mockTreeItem + ); + assert.strictEqual(mockCopyToClipboard.calledOnce, true); + assert.strictEqual( + mockCopyToClipboard.firstCall.args[0], + 'isClubMateTheBestDrinkEver' + ); + }); - test('mdb.refreshSchema command should reset its cache and call to refresh the explorer controller', async () => { - const mockTreeItem = new SchemaTreeItem( - 'zebraWearwolf', - 'giraffeVampire', - {} as DataService, - false, - false, - false, - false, - {} - ); - - // Set cached. - mockTreeItem.cacheIsUpToDate = true; - - const mockExplorerControllerRefresh = sinon.fake(); - sinon.replace( - mdbTestExtension.testExtensionController._explorerController, - 'refresh', - mockExplorerControllerRefresh - ); - - await vscode.commands.executeCommand('mdb.refreshSchema', mockTreeItem); - assert( - !mockTreeItem.cacheIsUpToDate, - 'Expected schema field cache to be not up to date.' - ); - assert( - mockExplorerControllerRefresh.called === true, - 'Expected explorer controller refresh to be called.' - ); - }); + test('mdb.copyCollectionName command should try to copy the collection name to the vscode env clipboard', async () => { + const mockTreeItem = new CollectionTreeItem( + { + name: 'waterBuffalo', + type: CollectionTypes.collection, + }, + 'airZebra', + {}, + false, + false, + null + ); + const mockCopyToClipboard = sinon.fake(); + sinon.replaceGetter(vscode.env, 'clipboard', () => ({ + writeText: mockCopyToClipboard, + readText: sinon.fake(), + })); + await vscode.commands.executeCommand( + 'mdb.copyCollectionName', + mockTreeItem + ); + assert( + mockCopyToClipboard.called, + 'Expected "writeText" to be called on "vscode.env.clipboard".' + ); + assert( + mockCopyToClipboard.firstCall.args[0] === 'waterBuffalo', + `Expected the clipboard to be sent the uri string "waterBuffalo", found ${mockCopyToClipboard.firstCall.args[0]}.` + ); + }); - test('mdb.refreshIndexes command should reset its cache and call to refresh the explorer controller', async () => { - const mockTreeItem = new IndexListTreeItem( - 'zebraWearwolf', - 'giraffeVampire', - {} as DataService, - false, - false, - [] - ); - - // Set cached. - mockTreeItem.cacheIsUpToDate = true; - - const mockExplorerControllerRefresh = sinon.fake(); - sinon.replace( - mdbTestExtension.testExtensionController._explorerController, - 'refresh', - mockExplorerControllerRefresh - ); - - await vscode.commands.executeCommand('mdb.refreshIndexes', mockTreeItem); - assert( - !mockTreeItem.cacheIsUpToDate, - 'Expected schema field cache to be not up to date.' - ); - assert( - mockExplorerControllerRefresh.called === true, - 'Expected explorer controller refresh to be called.' - ); - }); + test('mdb.copySchemaFieldName command should try to copy the field name to the vscode env clipboard', async () => { + const mockTreeItem = new FieldTreeItem( + { + name: 'dolphins are sentient', + probability: 1, + type: 'String', + types: [], + }, + false, + {} + ); + const mockCopyToClipboard = sinon.fake(); + sinon.replaceGetter(vscode.env, 'clipboard', () => ({ + writeText: mockCopyToClipboard, + readText: sinon.fake(), + })); + const commandResult = await vscode.commands.executeCommand( + 'mdb.copySchemaFieldName', + mockTreeItem + ); + assert(commandResult); + assert( + mockCopyToClipboard.called, + 'Expected "writeText" to be called on "vscode.env.clipboard".' + ); + assert( + mockCopyToClipboard.firstCall.args[0] === 'dolphins are sentient', + `Expected the clipboard to be sent the schema field name "dolphins are sentient", found ${mockCopyToClipboard.firstCall.args[0]}.` + ); + }); - test('mdb.addDatabase command fails when not connected to the connection', async () => { - const mockTreeItem = new ConnectionTreeItem( - 'tasty_sandwhich', - vscode.TreeItemCollapsibleState.None, - false, - mdbTestExtension.testExtensionController._connectionController, - false, - {} - ); - - const fakeVscodeErrorMessage = sinon.fake(); - sinon.replace(vscode.window, 'showErrorMessage', fakeVscodeErrorMessage); - - const addDatabaseSucceeded = await vscode.commands.executeCommand( - 'mdb.addDatabase', - mockTreeItem - ); - assert( - addDatabaseSucceeded === false, - 'Expected the command handler to return a false succeeded response' - ); - const expectedMessage = - 'Please connect to this connection before adding a database.'; - assert( - fakeVscodeErrorMessage.firstCall.args[0] === expectedMessage, - `Expected an error message "${expectedMessage}" to be shown when attempting to add a database to a not connected connection found "${fakeVscodeErrorMessage.firstCall.args[0]}"` - ); - }); + test('mdb.refreshDatabase command should reset the cache on the database tree item', async () => { + const mockTreeItem = new DatabaseTreeItem( + 'pinkLemonade', + {}, + false, + false, + {} + ); + mockTreeItem.cacheIsUpToDate = true; - test('mdb.addDatabase should create a MongoDB playground with create collection template', async () => { - const mockTreeItem = new ConnectionTreeItem( - 'tasty_sandwhich', - vscode.TreeItemCollapsibleState.None, - false, - mdbTestExtension.testExtensionController._connectionController, - false, - {} - ); - - const mockActiveConnectionId = sinon.fake.returns('tasty_sandwhich'); - sinon.replace( - mdbTestExtension.testExtensionController._connectionController, - 'getActiveConnectionId', - mockActiveConnectionId - ); - - await vscode.commands.executeCommand('mdb.addDatabase', mockTreeItem); - - const activeTextEditor = - mdbTestExtension.testExtensionController._playgroundController - ._activeTextEditor; - assert.strictEqual(activeTextEditor?.document.languageId, 'javascript'); - assert(activeTextEditor?.document.uri.scheme === 'untitled'); - - const content = activeTextEditor.document.getText(); - assert(content.includes('// Create a new database.')); - assert(content.includes('NEW_DATABASE_NAME')); - assert(content.includes('NEW_COLLECTION_NAME')); - - await vscode.commands.executeCommand('workbench.action.closeActiveEditor'); - }); + const mockExplorerControllerRefresh = sinon.fake(); + sinon.replace( + mdbTestExtension.testExtensionController._explorerController, + 'refresh', + mockExplorerControllerRefresh + ); + await vscode.commands.executeCommand( + 'mdb.refreshDatabase', + mockTreeItem + ); + assert.strictEqual( + mockTreeItem.cacheIsUpToDate, + false, + 'Expected cache on tree item to be set to not up to date.' + ); + assert( + mockExplorerControllerRefresh.called === true, + 'Expected explorer controller refresh to be called.' + ); + }); - test('mdb.addDatabase command fails when disconnecting', async () => { - const mockTreeItem = new ConnectionTreeItem( - 'tasty_sandwhich', - vscode.TreeItemCollapsibleState.None, - false, - mdbTestExtension.testExtensionController._connectionController, - false, - {} - ); - - const mockInputBoxResolves: any = sinon.stub(); - mockInputBoxResolves.onCall(0).resolves('theDbName'); - mockInputBoxResolves.onCall(1).resolves('theCollectionName'); - sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); - - const mockIsDisconnecting = sinon.fake.returns(true); - sinon.replace( - mdbTestExtension.testExtensionController._connectionController, - 'isDisconnecting', - mockIsDisconnecting - ); - - const fakeVscodeErrorMessage = sinon.fake(); - sinon.replace(vscode.window, 'showErrorMessage', fakeVscodeErrorMessage); - - const mockActiveConnectionId = sinon.fake.returns('tasty_sandwhich'); - sinon.replace( - mdbTestExtension.testExtensionController._connectionController, - 'getActiveConnectionId', - mockActiveConnectionId - ); - - const addDatabaseSucceeded = await vscode.commands.executeCommand( - 'mdb.addDatabase', - mockTreeItem - ); - assert( - addDatabaseSucceeded === false, - 'Expected the add database command handler to return a false succeeded response' - ); - const expectedMessage = 'Unable to add database: currently disconnecting.'; - assert( - fakeVscodeErrorMessage.firstCall.args[0] === expectedMessage, - `Expected the error message "${expectedMessage}" to be shown when attempting to add a database while disconnecting, found "${fakeVscodeErrorMessage.firstCall.args[0]}"` - ); - }); + test('mdb.refreshCollection command should reset the expanded state of its children and call to refresh the explorer controller', async () => { + const mockTreeItem = new CollectionTreeItem( + { + name: 'iSawACatThatLookedLikeALionToday', + type: CollectionTypes.collection, + }, + 'airZebra', + {}, + false, + false, + null + ); + mockTreeItem.isExpanded = true; - test('mdb.addDatabase command fails when connecting', async () => { - const mockTreeItem = new ConnectionTreeItem( - 'tasty_sandwhich', - vscode.TreeItemCollapsibleState.None, - false, - mdbTestExtension.testExtensionController._connectionController, - false, - {} - ); - - const mockInputBoxResolves: any = sinon.stub(); - mockInputBoxResolves.onCall(0).resolves('theDbName'); - mockInputBoxResolves.onCall(1).resolves('theCollectionName'); - sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); - - const mockIsConnecting = sinon.fake.returns(true); - sinon.replace( - mdbTestExtension.testExtensionController._connectionController, - 'isConnecting', - mockIsConnecting - ); - - const fakeVscodeErrorMessage = sinon.fake(); - sinon.replace(vscode.window, 'showErrorMessage', fakeVscodeErrorMessage); - const mockActiveConnectionId = sinon.fake.returns('tasty_sandwhich'); - sinon.replace( - mdbTestExtension.testExtensionController._connectionController, - 'getActiveConnectionId', - mockActiveConnectionId - ); - - const addDatabaseSucceeded = await vscode.commands.executeCommand( - 'mdb.addDatabase', - mockTreeItem - ); - assert( - addDatabaseSucceeded === false, - 'Expected the add database command handler to return a false succeeded response' - ); - const expectedMessage = 'Unable to add database: currently connecting.'; - assert( - fakeVscodeErrorMessage.firstCall.args[0] === expectedMessage, - `Expected the error message "${expectedMessage}" to be shown when attempting to add a database while disconnecting, found "${fakeVscodeErrorMessage.firstCall.args[0]}"` - ); - }); + // Set expanded. + mockTreeItem.getSchemaChild().isExpanded = true; + mockTreeItem.getDocumentListChild().isExpanded = true; - test('mdb.addCollection should create a MongoDB playground with create collection template', async () => { - const mockTreeItem = new DatabaseTreeItem( - 'iceCreamDB', - {}, - false, - false, - {} - ); - - const mockActiveConnectionId = sinon.fake.returns('tasty_sandwhich'); - sinon.replace( - mdbTestExtension.testExtensionController._connectionController, - 'getActiveConnectionId', - mockActiveConnectionId - ); - - await vscode.commands.executeCommand('mdb.addCollection', mockTreeItem); - - const activeTextEditor = - mdbTestExtension.testExtensionController._playgroundController - ._activeTextEditor; - assert.strictEqual(activeTextEditor?.document.languageId, 'javascript'); - assert(activeTextEditor?.document.uri.scheme === 'untitled'); - - const content = activeTextEditor.document.getText(); - assert(content.includes('// The current database to use.')); - assert(content.includes('iceCreamDB')); - assert(content.includes('NEW_COLLECTION_NAME')); - assert(!content.includes('time-series')); - - await vscode.commands.executeCommand('workbench.action.closeActiveEditor'); - }); + const mockExplorerControllerRefresh = sinon.fake(); + sinon.replace( + mdbTestExtension.testExtensionController._explorerController, + 'refresh', + mockExplorerControllerRefresh + ); + await vscode.commands.executeCommand( + 'mdb.refreshCollection', + mockTreeItem + ); + assert( + mockTreeItem.getSchemaChild().isExpanded === false, + 'Expected collection tree item child to be reset to not expanded.' + ); + assert( + mockExplorerControllerRefresh.called === true, + 'Expected explorer controller refresh to be called.' + ); + }); - test('mdb.addCollection command fails when disconnecting', async () => { - const mockTreeItem = new DatabaseTreeItem( - 'iceCreamDB', - {}, - false, - false, - {} - ); - - const mockInputBoxResolves: any = sinon.stub(); - mockInputBoxResolves.onCall(0).resolves('mintChocolateChips'); - sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); - - const mockIsDisconnecting = sinon.fake.returns(true); - sinon.replace( - mdbTestExtension.testExtensionController._connectionController, - 'isDisconnecting', - mockIsDisconnecting - ); - - const fakeVscodeErrorMessage = sinon.fake(); - sinon.replace(vscode.window, 'showErrorMessage', fakeVscodeErrorMessage); - - const addCollectionSucceeded = await vscode.commands.executeCommand( - 'mdb.addCollection', - mockTreeItem - ); - assert( - addCollectionSucceeded === false, - 'Expected the add collection command handler to return a false succeeded response' - ); - const expectedMessage = - 'Unable to add collection: currently disconnecting.'; - assert( - fakeVscodeErrorMessage.firstCall.args[0] === expectedMessage, - `Expected "${expectedMessage}" when adding a database to a not connected connection, recieved "${fakeVscodeErrorMessage.firstCall.args[0]}"` - ); - }); + test('mdb.refreshDocumentList command should update the document count and call to refresh the explorer controller', async () => { + let count = 9000; + const mockTreeItem = new CollectionTreeItem( + { + name: 'iSawACatThatLookedLikeALionToday', + type: CollectionTypes.collection, + }, + 'airZebra', + { estimatedCount: () => Promise.resolve(count) }, + false, + false, + null + ); + await mockTreeItem.onDidExpand(); - // https://code.visualstudio.com/api/references/contribution-points#Sorting-of-groups - - test('mdb.dropCollection calls data service to drop the collection after inputting the collection name', async () => { - let calledNamespace = ''; - const testCollectionTreeItem = new CollectionTreeItem( - { name: 'testColName', type: CollectionTypes.collection }, - 'testDbName', - { - dropCollection: (namespace, callback): void => { - calledNamespace = namespace; - callback(null, true); - }, - }, - false, - false, - null - ); - - const mockInputBoxResolves: any = sinon.stub(); - mockInputBoxResolves.onCall(0).resolves('testColName'); - sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); - - const successfullyDropped = await vscode.commands.executeCommand( - 'mdb.dropCollection', - testCollectionTreeItem - ); - assert(successfullyDropped); - assert(calledNamespace === 'testDbName.testColName'); - }); + const collectionChildren = await mockTreeItem.getChildren(); + const docListTreeItem = collectionChildren[0]; + assert(docListTreeItem.description === '9K'); + count = 10000; + docListTreeItem.isExpanded = true; - test('mdb.dropCollection fails when a collection doesnt exist', async () => { - const testConnectionController = - mdbTestExtension.testExtensionController._connectionController; - - await testConnectionController.addNewConnectionStringAndConnect( - testDatabaseURI - ); - const testCollectionTreeItem = new CollectionTreeItem( - { name: 'doesntExistColName', type: CollectionTypes.collection }, - 'doesntExistDBName', - testConnectionController.getActiveDataService(), - false, - false, - null - ); - - const mockInputBoxResolves: any = sinon.stub(); - mockInputBoxResolves.onCall(0).resolves('doesntExistColName'); - sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); - - const fakeVscodeErrorMessage = sinon.fake(); - sinon.replace(vscode.window, 'showErrorMessage', fakeVscodeErrorMessage); - - const successfullyDropped = await vscode.commands.executeCommand( - 'mdb.dropCollection', - testCollectionTreeItem - ); - assert( - successfullyDropped === false, - 'Expected the drop collection command handler to return a false succeeded response' - ); - const expectedMessage = 'Drop collection failed: ns not found'; - assert( - fakeVscodeErrorMessage.firstCall.args[0] === expectedMessage, - `Expected "${expectedMessage}" when dropping a collection that doesn't exist, recieved "${fakeVscodeErrorMessage.firstCall.args[0]}"` - ); - - await testConnectionController.disconnect(); - testConnectionController.clearAllConnections(); - }); + const mockExplorerControllerRefresh = sinon.fake(); + sinon.replace( + mdbTestExtension.testExtensionController._explorerController, + 'refresh', + mockExplorerControllerRefresh + ); - test('mdb.dropCollection fails when the input doesnt match the collection name', async () => { - const testCollectionTreeItem = new CollectionTreeItem( - { name: 'orange', type: CollectionTypes.collection }, - 'fruitsThatAreTasty', - {}, - false, - false, - null - ); - - const mockInputBoxResolves: any = sinon.stub(); - mockInputBoxResolves.onCall(0).resolves('apple'); - sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); - - const successfullyDropped = await vscode.commands.executeCommand( - 'mdb.dropCollection', - testCollectionTreeItem - ); - assert( - successfullyDropped === false, - 'Expected the drop collection command handler to return a false succeeded response' - ); - }); + await vscode.commands.executeCommand( + 'mdb.refreshDocumentList', + docListTreeItem + ); + assert( + docListTreeItem.cacheIsUpToDate === false, + 'Expected document list cache to be out of date.' + ); + assert( + mockTreeItem.documentCount === 10000, + `Expected document count to be 10000, found ${mockTreeItem.documentCount}.` + ); + assert( + mockExplorerControllerRefresh.called === true, + 'Expected explorer controller refresh to be called.' + ); + }); - test('mdb.dropCollection fails when the collection name input is empty', async () => { - const testCollectionTreeItem = new CollectionTreeItem( - { name: 'orange', type: CollectionTypes.view }, - 'fruitsThatAreTasty', - {}, - false, - false, - null - ); - - const mockInputBoxResolves: any = sinon.stub(); - mockInputBoxResolves.onCall(0).resolves(/* Return undefined. */); - sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); - - const successfullyDropped = await vscode.commands.executeCommand( - 'mdb.dropCollection', - testCollectionTreeItem - ); - assert( - successfullyDropped === false, - 'Expected the drop collection command handler to return a false succeeded response' - ); - }); + test('mdb.refreshSchema command should reset its cache and call to refresh the explorer controller', async () => { + const mockTreeItem = new SchemaTreeItem( + 'zebraWearwolf', + 'giraffeVampire', + {} as DataService, + false, + false, + false, + false, + {} + ); - test('mdb.dropDatabase calls dataservice to drop the database after inputting the database name', async () => { - let calledDatabaseName = ''; - const testDatabaseTreeItem = new DatabaseTreeItem( - 'iMissTangerineAltoids', - { - dropDatabase: (dbName, callback): void => { - calledDatabaseName = dbName; - callback(null, true); - }, - }, - false, - false, - {} - ); - - const mockInputBoxResolves: any = sinon.stub(); - mockInputBoxResolves.onCall(0).resolves('iMissTangerineAltoids'); - sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); - - const successfullyDropped = await vscode.commands.executeCommand( - 'mdb.dropDatabase', - testDatabaseTreeItem - ); - assert.strictEqual(successfullyDropped, true); - assert.strictEqual(calledDatabaseName, 'iMissTangerineAltoids'); - }); + // Set cached. + mockTreeItem.cacheIsUpToDate = true; - test('mdb.dropDatabase succeeds even when a database doesnt exist (mdb behavior)', async () => { - const testConnectionController = - mdbTestExtension.testExtensionController._connectionController; - - await testConnectionController.addNewConnectionStringAndConnect( - testDatabaseURI - ); - const testDatabaseTreeItem = new DatabaseTreeItem( - 'narnia____a', - testConnectionController.getActiveDataService(), - false, - false, - {} - ); - - const mockInputBoxResolves: any = sinon.stub(); - mockInputBoxResolves.onCall(0).resolves('narnia____a'); - sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); - - const fakeVscodeErrorMessage = sinon.fake(); - sinon.replace(vscode.window, 'showErrorMessage', fakeVscodeErrorMessage); - - const successfullyDropped = await vscode.commands.executeCommand( - 'mdb.dropDatabase', - testDatabaseTreeItem - ); - assert( - successfullyDropped, - 'Expected the drop database command handler to return a successful boolean response' - ); - assert( - fakeVscodeErrorMessage.called === false, - 'Expected no error messages' - ); - }); + const mockExplorerControllerRefresh = sinon.fake(); + sinon.replace( + mdbTestExtension.testExtensionController._explorerController, + 'refresh', + mockExplorerControllerRefresh + ); + await vscode.commands.executeCommand('mdb.refreshSchema', mockTreeItem); + assert( + !mockTreeItem.cacheIsUpToDate, + 'Expected schema field cache to be not up to date.' + ); + assert( + mockExplorerControllerRefresh.called === true, + 'Expected explorer controller refresh to be called.' + ); + }); - test('mdb.dropDatabase fails when the input doesnt match the database name', async () => { - const testDatabaseTreeItem = new DatabaseTreeItem( - 'cinnamonToastCrunch', - {}, - false, - false, - {} - ); - - const mockInputBoxResolves: any = sinon.stub(); - mockInputBoxResolves.onCall(0).resolves('apple'); - sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); - - const successfullyDropped = await vscode.commands.executeCommand( - 'mdb.dropDatabase', - testDatabaseTreeItem - ); - assert( - successfullyDropped === false, - 'Expected the drop database command handler to return a false succeeded response' - ); - }); + test('mdb.refreshIndexes command should reset its cache and call to refresh the explorer controller', async () => { + const mockTreeItem = new IndexListTreeItem( + 'zebraWearwolf', + 'giraffeVampire', + {} as DataService, + false, + false, + [] + ); - test('mdb.dropDatabase fails when the database name input is empty', async () => { - const testDatabaseTreeItem = new DatabaseTreeItem( - 'blueBerryPancakesAndTheSmellOfBacon', - {}, - false, - false, - {} - ); - - const mockInputBoxResolves: any = sinon.stub(); - mockInputBoxResolves.onCall(0).resolves(/* Return undefined. */); - sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); - - const successfullyDropped = await vscode.commands.executeCommand( - 'mdb.dropDatabase', - testDatabaseTreeItem - ); - assert( - successfullyDropped === false, - 'Expected the drop database command handler to return a false succeeded response' - ); - }); + // Set cached. + mockTreeItem.cacheIsUpToDate = true; - test('mdb.renameConnection fails when the name input is empty', async () => { - mdbTestExtension.testExtensionController._connectionController._connections.blueBerryPancakesAndTheSmellOfBacon = - { - id: 'blueBerryPancakesAndTheSmellOfBacon', - connectionOptions: { connectionString: 'mongodb://localhost' }, - name: 'NAAAME', - storageLocation: StorageLocation.NONE, - }; - - const mockTreeItem = new ConnectionTreeItem( - 'blueBerryPancakesAndTheSmellOfBacon', - vscode.TreeItemCollapsibleState.None, - false, - mdbTestExtension.testExtensionController._connectionController, - false, - {} - ); - - const mockInputBoxResolves: any = sinon.stub(); - mockInputBoxResolves.onCall(0).resolves(/* Return undefined. */); - sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); - - const successfullyRenamed = await vscode.commands.executeCommand( - 'mdb.renameConnection', - mockTreeItem - ); - assert( - successfullyRenamed === false, - 'Expected the rename connection command handler to return a false succeeded response' - ); - assert( - mdbTestExtension.testExtensionController._connectionController - ._connections.blueBerryPancakesAndTheSmellOfBacon.name === 'NAAAME', - 'Expected connection not to be ranamed.' - ); - mdbTestExtension.testExtensionController._connectionController.clearAllConnections(); - }); + const mockExplorerControllerRefresh = sinon.fake(); + sinon.replace( + mdbTestExtension.testExtensionController._explorerController, + 'refresh', + mockExplorerControllerRefresh + ); + await vscode.commands.executeCommand( + 'mdb.refreshIndexes', + mockTreeItem + ); + assert( + !mockTreeItem.cacheIsUpToDate, + 'Expected schema field cache to be not up to date.' + ); + assert( + mockExplorerControllerRefresh.called === true, + 'Expected explorer controller refresh to be called.' + ); + }); - test('mdb.renameConnection updates the name of a connection', async () => { - mdbTestExtension.testExtensionController._connectionController._connections.blueBerryPancakesAndTheSmellOfBacon = - { - id: 'blueBerryPancakesAndTheSmellOfBacon', - name: 'NAAAME', - connectionOptions: { connectionString: 'mongodb://localhost' }, - storageLocation: StorageLocation.NONE, - }; - - const mockTreeItem = new ConnectionTreeItem( - 'blueBerryPancakesAndTheSmellOfBacon', - vscode.TreeItemCollapsibleState.None, - false, - mdbTestExtension.testExtensionController._connectionController, - false, - {} - ); - - const mockInputBoxResolves: any = sinon.stub(); - mockInputBoxResolves.onCall(0).resolves('orange juice'); - sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); - - const successfullyRenamed = await vscode.commands.executeCommand( - 'mdb.renameConnection', - mockTreeItem - ); - assert.strictEqual(successfullyRenamed, true); - assert.strictEqual( - mdbTestExtension.testExtensionController._connectionController - ._connections.blueBerryPancakesAndTheSmellOfBacon.name, - 'orange juice' - ); - mdbTestExtension.testExtensionController._connectionController.clearAllConnections(); - }); + test('mdb.addDatabase command fails when disconnecting', async () => { + const mockTreeItem = new ConnectionTreeItem( + 'tasty_sandwhich', + vscode.TreeItemCollapsibleState.None, + false, + mdbTestExtension.testExtensionController._connectionController, + false, + {} + ); + const mockInputBoxResolves: any = sinon.stub(); + mockInputBoxResolves.onCall(0).resolves('theDbName'); + mockInputBoxResolves.onCall(1).resolves('theCollectionName'); + sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); - test('documents can be opened from the sidebar and saved to MongoDB', async () => { - const mockDocument = { - _id: 'pancakes', - name: '', - time: { - $time: '12345', - }, - }; - - const mockOpenTextDocument = sinon.fake.resolves('magna carta'); - sinon.replace(vscode.workspace, 'openTextDocument', mockOpenTextDocument); - - const mockShowTextDocument = sinon.fake(); - sinon.replace(vscode.window, 'showTextDocument', mockShowTextDocument); - - const mockGet = sinon.fake.returns('pancakes'); - sinon.replace( - mdbTestExtension.testExtensionController._editorsController - ._documentIdStore, - 'get', - mockGet - ); - - const activeTextEditor = mockTextEditor; - activeTextEditor.document.uri = vscode.Uri.parse( - [ - 'VIEW_DOCUMENT_SCHEME:/', - 'waffle.house:pancakes.json?', - 'namespace=waffle.house&', - 'connectionId=tasty_sandwhich&', - 'documentId=93333a0d-83f6-4e6f-a575-af7ea6187a4a&', - 'source=treeview', - ].join('') - ); - activeTextEditor.document.getText = () => JSON.stringify(mockDocument); - sandbox.replaceGetter( - vscode.window, - 'activeTextEditor', - () => activeTextEditor - ); - - const mockActiveConnectionId = sinon.fake.returns('tasty_sandwhich'); - sinon.replace( - mdbTestExtension.testExtensionController._connectionController, - 'getActiveConnectionId', - mockActiveConnectionId - ); - - const mockGetActiveDataService = sinon.fake.returns({ - find: () => { - return Promise.resolve([mockDocument]); - }, - findOneAndReplace: ( - namespace: string, - filter: object, - replacement: object, - options: object, - callback: (error: Error | null, result: object) => void - ) => { - mockDocument.name = 'something sweet'; - - return callback(null, mockDocument); - }, - }); - sinon.replace( - mdbTestExtension.testExtensionController._connectionController, - 'getActiveDataService', - mockGetActiveDataService - ); - - const documentItem = new DocumentTreeItem( - mockDocument, - 'waffle.house', - 0, - {} as DataService, - () => Promise.resolve() - ); - - await vscode.commands.executeCommand( - 'mdb.openMongoDBDocumentFromTree', - documentItem - ); - - assert(mockOpenTextDocument.firstCall.args[0].path.includes('.json')); - assert.strictEqual( - mockOpenTextDocument.firstCall.args[0].scheme, - 'VIEW_DOCUMENT_SCHEME' - ); - assert( - mockOpenTextDocument.firstCall.args[0].query.includes('documentId=') - ); - assert( - mockOpenTextDocument.firstCall.args[0].query.includes('connectionId=') - ); - assert( - mockOpenTextDocument.firstCall.args[0].query.includes('source=treeview') - ); - assert( - mockOpenTextDocument.firstCall.args[0].query.includes( - 'namespace=waffle.house' - ) - ); - assert.strictEqual(mockShowTextDocument.firstCall.args[0], 'magna carta'); - - await vscode.commands.executeCommand('mdb.saveMongoDBDocument'); - - assert(mockDocument.name === 'something sweet'); - assert(mockDocument.time.$time === '12345'); - - const expectedMessage = - "The document was saved successfully to 'waffle.house'"; - - assert.strictEqual( - fakeShowInformationMessage.firstCall.args[0], - expectedMessage - ); - }); + const mockIsDisconnecting = sinon.fake.returns(true); + sinon.replace( + mdbTestExtension.testExtensionController._connectionController, + 'isDisconnecting', + mockIsDisconnecting + ); - test('document opened from a tree has treeview source', async () => { - const mockDocument = { - _id: 'pancakes', - name: '', - time: { - $time: '12345', - }, - }; - const documentItem = new DocumentTreeItem( - mockDocument, - 'waffle.house', - 0, - {} as DataService, - () => Promise.resolve() - ); - - const mockFetchDocument = sinon.fake.resolves(null); - sinon.replace( - mdbTestExtension.testExtensionController._editorsController - ._mongoDBDocumentService, - 'fetchDocument', - mockFetchDocument - ); - - await vscode.commands.executeCommand( - 'mdb.openMongoDBDocumentFromTree', - documentItem - ); - - assert.strictEqual(mockFetchDocument.firstCall.args[0].source, 'treeview'); - }); + const addDatabaseSucceeded = await vscode.commands.executeCommand( + 'mdb.addDatabase', + mockTreeItem + ); + assert( + addDatabaseSucceeded === false, + 'Expected the add database command handler to return a false succeeded response' + ); - test('document opened from playground results has treeview source', async () => { - const documentItem = { - source: 'playground', - line: 1, - documentId: '93333a0d-83f6-4e6f-a575-af7ea6187a4a', - namespace: 'db.coll', - connectionId: null, - }; - - const mockFetchDocument = sinon.fake.resolves(null); - sinon.replace( - mdbTestExtension.testExtensionController._editorsController - ._mongoDBDocumentService, - 'fetchDocument', - mockFetchDocument - ); - - await vscode.commands.executeCommand( - 'mdb.openMongoDBDocumentFromCodeLens', - documentItem - ); - - assert.strictEqual( - mockFetchDocument.firstCall.args[0].source, - 'playground' - ); - }); + const expectedMessage = + 'Unable to add database: currently disconnecting.'; + assert( + fakeVscodeErrorMessage.firstCall.args[0] === expectedMessage, + `Expected the error message "${expectedMessage}" to be shown when attempting to add a database while disconnecting, found "${fakeVscodeErrorMessage.firstCall.args[0]}"` + ); + }); - test('fetchDocument recieves treeview source if document opened from a tree', async () => { - const mockDocument = { - _id: 'pancakes', - name: '', - time: { - $time: '12345', - }, - }; - - const mockShowTextDocument = sinon.fake(); - sinon.replace(vscode.window, 'showTextDocument', mockShowTextDocument); - - const mockGet = sinon.fake.returns('pancakes'); - sinon.replace( - mdbTestExtension.testExtensionController._editorsController - ._documentIdStore, - 'get', - mockGet - ); - - sandbox.replaceGetter( - vscode.window, - 'activeTextEditor', - () => - ({ - document: { - uri: { - scheme: 'VIEW_DOCUMENT_SCHEME', - query: [ - 'namespace=waffle.house', - 'connectionId=tasty_sandwhich', - 'documentId=93333a0d-83f6-4e6f-a575-af7ea6187a4a', - 'source=treeview', - ].join('&'), - }, - getText: () => JSON.stringify(mockDocument), - save: () => {}, - }, - } as unknown as typeof vscode.window.activeTextEditor) - ); - - const mockReplaceDocument = sinon.fake.resolves(null); - sinon.replace( - mdbTestExtension.testExtensionController._editorsController - ._mongoDBDocumentService, - 'replaceDocument', - mockReplaceDocument - ); - - await vscode.commands.executeCommand('mdb.saveMongoDBDocument'); - - assert.strictEqual( - mockReplaceDocument.firstCall.args[0].source, - 'treeview' - ); - }); + test('mdb.addDatabase command fails when connecting', async () => { + const mockTreeItem = new ConnectionTreeItem( + 'tasty_sandwhich', + vscode.TreeItemCollapsibleState.None, + false, + mdbTestExtension.testExtensionController._connectionController, + false, + {} + ); + const mockInputBoxResolves: any = sinon.stub(); + mockInputBoxResolves.onCall(0).resolves('theDbName'); + mockInputBoxResolves.onCall(1).resolves('theCollectionName'); + sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); + + const mockIsConnecting = sinon.fake.returns(true); + sinon.replace( + mdbTestExtension.testExtensionController._connectionController, + 'isConnecting', + mockIsConnecting + ); + + const addDatabaseSucceeded = await vscode.commands.executeCommand( + 'mdb.addDatabase', + mockTreeItem + ); + assert( + addDatabaseSucceeded === false, + 'Expected the add database command handler to return a false succeeded response' + ); - test('fetchDocument recieves playground source if document opened from playground results', async () => { - const mockDocument = { - _id: 'pancakes', - name: '', - time: { - $time: '12345', - }, - }; - - const mockShowTextDocument = sinon.fake(); - sinon.replace(vscode.window, 'showTextDocument', mockShowTextDocument); - - const mockGet = sinon.fake.returns('pancakes'); - sinon.replace( - mdbTestExtension.testExtensionController._editorsController - ._documentIdStore, - 'get', - mockGet - ); - - sandbox.replaceGetter( - vscode.window, - 'activeTextEditor', - () => - ({ - document: { - uri: { - scheme: 'VIEW_DOCUMENT_SCHEME', - query: [ - 'namespace=waffle.house', - 'connectionId=tasty_sandwhich', - 'documentId=93333a0d-83f6-4e6f-a575-af7ea6187a4a', - 'source=playground', - ].join('&'), + const expectedMessage = 'Unable to add database: currently connecting.'; + assert( + fakeVscodeErrorMessage.firstCall.args[0] === expectedMessage, + `Expected the error message "${expectedMessage}" to be shown when attempting to add a database while disconnecting, found "${fakeVscodeErrorMessage.firstCall.args[0]}"` + ); + }); + + test('mdb.addCollection command fails when disconnecting', async () => { + const mockTreeItem = new DatabaseTreeItem( + 'iceCreamDB', + {}, + false, + false, + {} + ); + const mockInputBoxResolves: any = sinon.stub(); + mockInputBoxResolves.onCall(0).resolves('mintChocolateChips'); + sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); + + const mockIsDisconnecting = sinon.fake.returns(true); + sinon.replace( + mdbTestExtension.testExtensionController._connectionController, + 'isDisconnecting', + mockIsDisconnecting + ); + + const addCollectionSucceeded = await vscode.commands.executeCommand( + 'mdb.addCollection', + mockTreeItem + ); + assert( + addCollectionSucceeded === false, + 'Expected the add collection command handler to return a false succeeded response' + ); + const expectedMessage = + 'Unable to add collection: currently disconnecting.'; + assert( + fakeVscodeErrorMessage.firstCall.args[0] === expectedMessage, + `Expected "${expectedMessage}" when adding a database to a not connected connection, recieved "${fakeVscodeErrorMessage.firstCall.args[0]}"` + ); + }); + + // https://code.visualstudio.com/api/references/contribution-points#Sorting-of-groups + test('mdb.dropCollection calls data service to drop the collection after inputting the collection name', async () => { + let calledNamespace = ''; + const testCollectionTreeItem = new CollectionTreeItem( + { name: 'testColName', type: CollectionTypes.collection }, + 'testDbName', + { + dropCollection: (namespace, callback): void => { + calledNamespace = namespace; + callback(null, true); }, - getText: () => JSON.stringify(mockDocument), - save: () => {}, }, - } as unknown as typeof vscode.window.activeTextEditor) - ); - - const mockReplaceDocument = sinon.fake.resolves(null); - sinon.replace( - mdbTestExtension.testExtensionController._editorsController - ._mongoDBDocumentService, - 'replaceDocument', - mockReplaceDocument - ); - - await vscode.commands.executeCommand('mdb.saveMongoDBDocument'); - - assert.strictEqual( - mockReplaceDocument.firstCall.args[0].source, - 'playground' - ); - }); + false, + false, + null + ); - test('mdb.searchForDocuments should create a MongoDB playground with search template', async () => { - await vscode.commands.executeCommand('mdb.searchForDocuments', { - databaseName: 'dbbbbbName', - collectionName: 'colllllllllName', - }); + const mockInputBoxResolves: any = sinon.stub(); + mockInputBoxResolves.onCall(0).resolves('testColName'); + sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); - const activeTextEditor = - mdbTestExtension.testExtensionController._playgroundController - ._activeTextEditor; - assert.strictEqual(activeTextEditor?.document.languageId, 'javascript'); - assert(activeTextEditor?.document.uri.scheme === 'untitled'); + const successfullyDropped = await vscode.commands.executeCommand( + 'mdb.dropCollection', + testCollectionTreeItem + ); + assert(successfullyDropped); + assert(calledNamespace === 'testDbName.testColName'); + }); - const content = activeTextEditor.document.getText(); - assert(content.includes('Search for documents in the current collection.')); - assert(content.includes('dbbbbbName')); - assert(content.includes('colllllllllName')); + test('mdb.dropCollection fails when a collection doesnt exist', async () => { + const testConnectionController = + mdbTestExtension.testExtensionController._connectionController; + await testConnectionController.addNewConnectionStringAndConnect( + testDatabaseURI + ); - await vscode.commands.executeCommand('workbench.action.closeActiveEditor'); - }); + const testCollectionTreeItem = new CollectionTreeItem( + { name: 'doesntExistColName', type: CollectionTypes.collection }, + 'doesntExistDBName', + testConnectionController.getActiveDataService(), + false, + false, + null + ); + const mockInputBoxResolves: any = sinon.stub(); + mockInputBoxResolves.onCall(0).resolves('doesntExistColName'); + sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); - test('mdb.createIndexFromTreeView should create a MongoDB playground with index template', async () => { - await vscode.commands.executeCommand('mdb.createIndexFromTreeView', { - databaseName: 'dbbbbbName', - collectionName: 'colllllllllName', - }); + const successfullyDropped = await vscode.commands.executeCommand( + 'mdb.dropCollection', + testCollectionTreeItem + ); + assert( + successfullyDropped === false, + 'Expected the drop collection command handler to return a false succeeded response' + ); - const activeTextEditor = - mdbTestExtension.testExtensionController._playgroundController - ._activeTextEditor; - assert.strictEqual(activeTextEditor?.document.languageId, 'javascript'); - assert(activeTextEditor?.document.uri.scheme === 'untitled'); + const expectedMessage = 'Drop collection failed: ns not found'; + assert( + fakeVscodeErrorMessage.firstCall.args[0] === expectedMessage, + `Expected "${expectedMessage}" when dropping a collection that doesn't exist, recieved "${fakeVscodeErrorMessage.firstCall.args[0]}"` + ); + await testConnectionController.disconnect(); + testConnectionController.clearAllConnections(); + }); - const content = activeTextEditor.document.getText(); - assert(content.includes('Create a new index in the collection.')); - assert(content.includes('dbbbbbName')); - assert(content.includes('colllllllllName')); + test('mdb.dropCollection fails when the input doesnt match the collection name', async () => { + const testCollectionTreeItem = new CollectionTreeItem( + { name: 'orange', type: CollectionTypes.collection }, + 'fruitsThatAreTasty', + {}, + false, + false, + null + ); + const mockInputBoxResolves: any = sinon.stub(); + mockInputBoxResolves.onCall(0).resolves('apple'); + sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); - await vscode.commands.executeCommand('workbench.action.closeActiveEditor'); - }); + const successfullyDropped = await vscode.commands.executeCommand( + 'mdb.dropCollection', + testCollectionTreeItem + ); + assert( + successfullyDropped === false, + 'Expected the drop collection command handler to return a false succeeded response' + ); + }); - test('mdb.createPlayground should create a MongoDB playground with default template', async () => { - const mockGetConfiguration = sinon.fake.returns({ - get: () => true, - }); - sinon.replace(vscode.workspace, 'getConfiguration', mockGetConfiguration); + test('mdb.dropCollection fails when the collection name input is empty', async () => { + const testCollectionTreeItem = new CollectionTreeItem( + { name: 'orange', type: CollectionTypes.view }, + 'fruitsThatAreTasty', + {}, + false, + false, + null + ); + const mockInputBoxResolves: any = sinon.stub(); + mockInputBoxResolves.onCall(0).resolves(/* Return undefined. */); + sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); - await vscode.commands.executeCommand('mdb.createPlayground'); + const successfullyDropped = await vscode.commands.executeCommand( + 'mdb.dropCollection', + testCollectionTreeItem + ); + assert( + successfullyDropped === false, + 'Expected the drop collection command handler to return a false succeeded response' + ); + }); - const activeTextEditor = - mdbTestExtension.testExtensionController._playgroundController - ._activeTextEditor; - assert.strictEqual(activeTextEditor?.document.languageId, 'javascript'); - assert(activeTextEditor?.document.uri.scheme === 'untitled'); + test('mdb.dropDatabase calls dataservice to drop the database after inputting the database name', async () => { + let calledDatabaseName = ''; + const testDatabaseTreeItem = new DatabaseTreeItem( + 'iMissTangerineAltoids', + { + dropDatabase: (dbName, callback): void => { + calledDatabaseName = dbName; + callback(null, true); + }, + }, + false, + false, + {} + ); - const content = activeTextEditor.document.getText(); - assert(content.includes('// MongoDB Playground')); + const mockInputBoxResolves: any = sinon.stub(); + mockInputBoxResolves.onCall(0).resolves('iMissTangerineAltoids'); + sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); - await vscode.commands.executeCommand('workbench.action.closeActiveEditor'); - }); + const successfullyDropped = await vscode.commands.executeCommand( + 'mdb.dropDatabase', + testDatabaseTreeItem + ); + assert.strictEqual(successfullyDropped, true); + assert.strictEqual(calledDatabaseName, 'iMissTangerineAltoids'); + }); - test('mdb.createPlayground command should create a MongoDB playground without template', async () => { - const mockGetConfiguration = sinon.fake.returns({ - get: () => false, - }); - sinon.replace(vscode.workspace, 'getConfiguration', mockGetConfiguration); + test('mdb.dropDatabase succeeds even when a database doesnt exist (mdb behavior)', async () => { + const testConnectionController = + mdbTestExtension.testExtensionController._connectionController; + await testConnectionController.addNewConnectionStringAndConnect( + testDatabaseURI + ); - await vscode.commands.executeCommand('mdb.createPlayground'); + const testDatabaseTreeItem = new DatabaseTreeItem( + 'narnia____a', + testConnectionController.getActiveDataService(), + false, + false, + {} + ); + const mockInputBoxResolves: any = sinon.stub(); + mockInputBoxResolves.onCall(0).resolves('narnia____a'); + sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); - const activeTextEditor = - mdbTestExtension.testExtensionController._playgroundController - ._activeTextEditor; - assert.strictEqual(activeTextEditor?.document.languageId, 'javascript'); - assert(activeTextEditor?.document.uri.scheme === 'untitled'); + const successfullyDropped = await vscode.commands.executeCommand( + 'mdb.dropDatabase', + testDatabaseTreeItem + ); + assert( + successfullyDropped, + 'Expected the drop database command handler to return a successful boolean response' + ); + assert( + fakeVscodeErrorMessage.called === false, + 'Expected no error messages' + ); + }); - const content = activeTextEditor.document.getText(); - assert.strictEqual(content, ''); + test('mdb.dropDatabase fails when the input doesnt match the database name', async () => { + const testDatabaseTreeItem = new DatabaseTreeItem( + 'cinnamonToastCrunch', + {}, + false, + false, + {} + ); + const mockInputBoxResolves: any = sinon.stub(); + mockInputBoxResolves.onCall(0).resolves('apple'); + sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); - await vscode.commands.executeCommand('workbench.action.closeActiveEditor'); - }); + const successfullyDropped = await vscode.commands.executeCommand( + 'mdb.dropDatabase', + testDatabaseTreeItem + ); + assert( + successfullyDropped === false, + 'Expected the drop database command handler to return a false succeeded response' + ); + }); - test('mdb.runSelectedPlaygroundBlocks command should call runSelectedPlaygroundBlocks on the playground controller', async () => { - const mockRunSelectedPlaygroundBlocks = sinon.fake(); - sinon.replace( - mdbTestExtension.testExtensionController._playgroundController, - 'runSelectedPlaygroundBlocks', - mockRunSelectedPlaygroundBlocks - ); - - await vscode.commands.executeCommand('mdb.runSelectedPlaygroundBlocks'); - assert( - mockRunSelectedPlaygroundBlocks.calledOnce, - 'Expected "runSelectedPlaygroundBlocks" to be called on the playground controller.' - ); - }); + test('mdb.dropDatabase fails when the database name input is empty', async () => { + const testDatabaseTreeItem = new DatabaseTreeItem( + 'blueBerryPancakesAndTheSmellOfBacon', + {}, + false, + false, + {} + ); + const mockInputBoxResolves: any = sinon.stub(); + mockInputBoxResolves.onCall(0).resolves(/* Return undefined. */); + sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); - test('mdb.runAllPlaygroundBlocks command should call runAllPlaygroundBlocks on the playground controller', async () => { - const mockRunAllPlaygroundBlocks = sinon.fake(); - sinon.replace( - mdbTestExtension.testExtensionController._playgroundController, - 'runAllPlaygroundBlocks', - mockRunAllPlaygroundBlocks - ); - - await vscode.commands.executeCommand('mdb.runAllPlaygroundBlocks'); - assert( - mockRunAllPlaygroundBlocks.calledOnce, - 'Expected "runAllPlaygroundBlocks" to be called on the playground controller.' - ); - }); + const successfullyDropped = await vscode.commands.executeCommand( + 'mdb.dropDatabase', + testDatabaseTreeItem + ); + assert( + successfullyDropped === false, + 'Expected the drop database command handler to return a false succeeded response' + ); + }); - test('mdb.changeActiveConnection command should call changeActiveConnection on the playground controller', async () => { - const mockChangeActiveConnection = sinon.fake(); - sinon.replace( - mdbTestExtension.testExtensionController._connectionController, - 'changeActiveConnection', - mockChangeActiveConnection - ); - - await vscode.commands.executeCommand('mdb.changeActiveConnection'); - assert( - mockChangeActiveConnection.calledOnce, - 'Expected "changeActiveConnection" to be called on the playground controller.' - ); - }); + test('mdb.renameConnection fails when the name input is empty', async () => { + mdbTestExtension.testExtensionController._connectionController._connections.blueBerryPancakesAndTheSmellOfBacon = + { + id: 'blueBerryPancakesAndTheSmellOfBacon', + connectionOptions: { connectionString: 'mongodb://localhost' }, + name: 'NAAAME', + storageLocation: StorageLocation.NONE, + }; + + const mockTreeItem = new ConnectionTreeItem( + 'blueBerryPancakesAndTheSmellOfBacon', + vscode.TreeItemCollapsibleState.None, + false, + mdbTestExtension.testExtensionController._connectionController, + false, + {} + ); - test('mdb.refreshPlaygrounds command should call refreshPlaygrounds on the playgrounds explorer controller', async () => { - const mockRefreshPlaygrounds = sinon.fake(); - sinon.replace( - mdbTestExtension.testExtensionController._playgroundsExplorer, - 'refresh', - mockRefreshPlaygrounds - ); - - await vscode.commands.executeCommand('mdb.refreshPlaygrounds'); - assert( - mockRefreshPlaygrounds.calledOnce, - 'Expected "refreshPlaygrounds" to be called on the playground controller.' - ); - }); + const mockInputBoxResolves: any = sinon.stub(); + mockInputBoxResolves.onCall(0).resolves(/* Return undefined. */); + sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); - test("mdb.copyDocumentContentsFromTreeView should copy a document's content to the clipboard", async () => { - const mockDocument = { - _id: 'pancakes', - time: { - $time: '12345', - }, - }; - - let namespaceUsed = ''; - - const findStub = sinon.stub(); - findStub.resolves([mockDocument]); - const mockDataService = { - find: (namespace: string) => { - namespaceUsed = namespace; - return Promise.resolve([mockDocument]); - }, - } as unknown as DataService; - - const documentTreeItem = new DocumentTreeItem( - mockDocument, - 'waffle.house', - 0, - mockDataService, - () => Promise.resolve() - ); - - const mockCopyToClipboard = sinon.fake(); - sinon.replaceGetter(vscode.env, 'clipboard', () => ({ - writeText: mockCopyToClipboard, - readText: sinon.fake(), - })); - - await vscode.commands.executeCommand( - 'mdb.copyDocumentContentsFromTreeView', - documentTreeItem - ); - assert.strictEqual(mockCopyToClipboard.called, true); - assert.strictEqual( - mockCopyToClipboard.firstCall.args[0], - `{ - "_id": "pancakes", - "time": { - "$time": "12345" - } -}` - ); - assert.strictEqual(namespaceUsed, 'waffle.house'); - }); + const successfullyRenamed = await vscode.commands.executeCommand( + 'mdb.renameConnection', + mockTreeItem + ); + assert( + successfullyRenamed === false, + 'Expected the rename connection command handler to return a false succeeded response' + ); + assert( + mdbTestExtension.testExtensionController._connectionController + ._connections.blueBerryPancakesAndTheSmellOfBacon.name === 'NAAAME', + 'Expected connection not to be ranamed.' + ); + mdbTestExtension.testExtensionController._connectionController.clearAllConnections(); + }); - test("mdb.cloneDocumentFromTreeView event should open a playground with a document's content", async () => { - const mockDocument = { - _id: 'pancakes', - time: new Date('3001-01-01T05:00:00.000Z'), - objectIdField: new ObjectId('57e193d7a9cc81b4027498b2'), - }; - - let namespaceUsed = ''; - - const mockDataService = { - find: (namespace: string) => { - namespaceUsed = namespace; - return Promise.resolve([mockDocument]); - }, - } as unknown as DataService; - - const documentTreeItem = new DocumentTreeItem( - mockDocument, - 'waffle.house', - 0, - mockDataService, - () => Promise.resolve() - ); - - const mockCreatePlaygroundForCloneDocument = sinon.fake(); - sinon.replace( - mdbTestExtension.testExtensionController._playgroundController, - 'createPlaygroundForCloneDocument', - mockCreatePlaygroundForCloneDocument - ); - - await vscode.commands.executeCommand( - 'mdb.cloneDocumentFromTreeView', - documentTreeItem - ); - assert.strictEqual(mockCreatePlaygroundForCloneDocument.calledOnce, true); - assert.strictEqual( - mockCreatePlaygroundForCloneDocument.firstCall.args[0], - `{ - _id: 'pancakes', - time: ISODate('3001-01-01T05:00:00.000Z'), - objectIdField: ObjectId('57e193d7a9cc81b4027498b2') -}` - ); - assert.strictEqual( - mockCreatePlaygroundForCloneDocument.firstCall.args[1], - 'waffle' - ); - assert.strictEqual( - mockCreatePlaygroundForCloneDocument.firstCall.args[2], - 'house' - ); - assert.strictEqual(namespaceUsed, 'waffle.house'); - }); + test('mdb.renameConnection updates the name of a connection', async () => { + mdbTestExtension.testExtensionController._connectionController._connections.blueBerryPancakesAndTheSmellOfBacon = + { + id: 'blueBerryPancakesAndTheSmellOfBacon', + name: 'NAAAME', + connectionOptions: { connectionString: 'mongodb://localhost' }, + storageLocation: StorageLocation.NONE, + }; + + const mockTreeItem = new ConnectionTreeItem( + 'blueBerryPancakesAndTheSmellOfBacon', + vscode.TreeItemCollapsibleState.None, + false, + mdbTestExtension.testExtensionController._connectionController, + false, + {} + ); + const mockInputBoxResolves: any = sinon.stub(); + mockInputBoxResolves.onCall(0).resolves('orange juice'); + sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); - test('mdb.insertDocumentFromTreeView event should open a playground with an insert document template', async () => { - const collectionTreeItem = new CollectionTreeItem( - { - name: 'pineapple', - type: CollectionTypes.collection, - }, - 'plants', - {}, - false, - false, - null - ); - - const mockCreatePlaygroundForInsertDocument = sinon.fake(); - sinon.replace( - mdbTestExtension.testExtensionController._playgroundController, - 'createPlaygroundForInsertDocument', - mockCreatePlaygroundForInsertDocument - ); - - await vscode.commands.executeCommand( - 'mdb.insertDocumentFromTreeView', - collectionTreeItem - ); - assert.strictEqual(mockCreatePlaygroundForInsertDocument.calledOnce, true); - assert.strictEqual( - mockCreatePlaygroundForInsertDocument.firstCall.args[0], - 'plants' - ); - assert.strictEqual( - mockCreatePlaygroundForInsertDocument.firstCall.args[1], - 'pineapple' - ); - }); + const successfullyRenamed = await vscode.commands.executeCommand( + 'mdb.renameConnection', + mockTreeItem + ); + assert.strictEqual(successfullyRenamed, true); + assert.strictEqual( + mdbTestExtension.testExtensionController._connectionController + ._connections.blueBerryPancakesAndTheSmellOfBacon.name, + 'orange juice' + ); + mdbTestExtension.testExtensionController._connectionController.clearAllConnections(); + }); - test('mdb.deleteDocumentFromTreeView should not delete a document when the confirmation is cancelled', async () => { - const mockDocument = { - _id: 'pancakes', - time: { - $time: '12345', - }, - }; - - let calledDelete = false; - - const mockDataService = { - deleteOne: ( - namespace: string, - _id: any, - options: object, - callback: ( - error: Error | undefined, - result: { deletedCount: number } - ) => void - ) => { - calledDelete = true; - callback(undefined, { - deletedCount: 1, - }); - }, - } as Pick as unknown as DataService; - - const documentTreeItem = new DocumentTreeItem( - mockDocument, - 'waffle.house', - 0, - mockDataService, - () => Promise.resolve() - ); - - const result = await vscode.commands.executeCommand( - 'mdb.deleteDocumentFromTreeView', - documentTreeItem - ); - - assert.strictEqual(result, false); - assert.strictEqual(calledDelete, false); - }); + test('mdb.openMongoDBDocumentFromTree openes a document from the sidebar and saves it to MongoDB', async () => { + const mockDocument = { + _id: 'pancakes', + name: '', + time: { + $time: '12345', + }, + }; + const mockGet = sinon.fake.returns('pancakes'); + sinon.replace( + mdbTestExtension.testExtensionController._editorsController + ._documentIdStore, + 'get', + mockGet + ); - test('mdb.deleteDocumentFromTreeView deletes a document after confirmation', async () => { - fakeShowInformationMessage.resolves('Yes'); - - const mockDocument = { - _id: 'pancakes', - time: { - $time: '12345', - }, - }; - - let namespaceUsed = ''; - let _idUsed; - - const mockDataService = { - deleteOne: ( - namespace: string, - query: any, - options: object, - callback: ( - error: Error | undefined, - result: { deletedCount: number } - ) => void - ) => { - _idUsed = query; - namespaceUsed = namespace; - callback(undefined, { - deletedCount: 1, + const activeTextEditor = mockTextEditor; + activeTextEditor.document.uri = vscode.Uri.parse( + [ + 'VIEW_DOCUMENT_SCHEME:/', + 'waffle.house:pancakes.json?', + 'namespace=waffle.house&', + 'connectionId=tasty_sandwhich&', + 'documentId=93333a0d-83f6-4e6f-a575-af7ea6187a4a&', + 'source=treeview', + ].join('') + ); + activeTextEditor.document.getText = () => JSON.stringify(mockDocument); + sandbox.replaceGetter( + vscode.window, + 'activeTextEditor', + () => activeTextEditor + ); + + const mockGetActiveDataService = sinon.fake.returns({ + find: () => { + return Promise.resolve([mockDocument]); + }, + findOneAndReplace: ( + namespace: string, + filter: object, + replacement: object, + options: object, + callback: (error: Error | null, result: object) => void + ) => { + mockDocument.name = 'something sweet'; + + return callback(null, mockDocument); + }, }); - }, - } as Pick as unknown as DataService; - - const documentTreeItem = new DocumentTreeItem( - mockDocument, - 'waffle.house', - 0, - mockDataService, - () => Promise.resolve() - ); - - const result = await vscode.commands.executeCommand( - 'mdb.deleteDocumentFromTreeView', - documentTreeItem - ); - assert.deepStrictEqual(_idUsed, { - _id: 'pancakes', - }); - assert.strictEqual(namespaceUsed, 'waffle.house'); - assert.strictEqual(result, true); - }); + sinon.replace( + mdbTestExtension.testExtensionController._connectionController, + 'getActiveDataService', + mockGetActiveDataService + ); - suite( - 'when a user hasnt been shown the initial overview page yet and they have no connections saved', - () => { - let mockVSCodeExecuteCommand: SinonSpy; - let mockStorageControllerUpdate: SinonSpy; + const documentItem = new DocumentTreeItem( + mockDocument, + 'waffle.house', + 0, + {} as DataService, + () => Promise.resolve() + ); + await vscode.commands.executeCommand( + 'mdb.openMongoDBDocumentFromTree', + documentItem + ); + assert(mockOpenTextDocument.firstCall.args[0].path.includes('.json')); + assert.strictEqual( + mockOpenTextDocument.firstCall.args[0].scheme, + 'VIEW_DOCUMENT_SCHEME' + ); + assert( + mockOpenTextDocument.firstCall.args[0].query.includes('documentId=') + ); + assert( + mockOpenTextDocument.firstCall.args[0].query.includes('connectionId=') + ); + assert( + mockOpenTextDocument.firstCall.args[0].query.includes( + 'source=treeview' + ) + ); + assert( + mockOpenTextDocument.firstCall.args[0].query.includes( + 'namespace=waffle.house' + ) + ); + await vscode.commands.executeCommand('mdb.saveMongoDBDocument'); + assert(mockDocument.name === 'something sweet'); + assert(mockDocument.time.$time === '12345'); - beforeEach(() => { - mockVSCodeExecuteCommand = sinon.fake.resolves(undefined); + const expectedMessage = + "The document was saved successfully to 'waffle.house'"; + + assert.strictEqual( + fakeShowInformationMessage.firstCall.args[0], + expectedMessage + ); + }); + + test('mdb.openMongoDBDocumentFromTree openes a document from a tree with a treeview source', async () => { + const mockDocument = { + _id: 'pancakes', + name: '', + time: { + $time: '12345', + }, + }; + const documentItem = new DocumentTreeItem( + mockDocument, + 'waffle.house', + 0, + {} as DataService, + () => Promise.resolve() + ); + const mockFetchDocument = sinon.fake.resolves(null); + sinon.replace( + mdbTestExtension.testExtensionController._editorsController + ._mongoDBDocumentService, + 'fetchDocument', + mockFetchDocument + ); + await vscode.commands.executeCommand( + 'mdb.openMongoDBDocumentFromTree', + documentItem + ); + assert.strictEqual( + mockFetchDocument.firstCall.args[0].source, + 'treeview' + ); + }); + + test('mdb.openMongoDBDocumentFromCodeLens openes a document from a playground results with a playground source', async () => { + const documentItem = { + source: 'playground', + line: 1, + documentId: '93333a0d-83f6-4e6f-a575-af7ea6187a4a', + namespace: 'db.coll', + connectionId: null, + }; + const mockFetchDocument = sinon.fake.resolves(null); sinon.replace( - vscode.commands, - 'executeCommand', - mockVSCodeExecuteCommand + mdbTestExtension.testExtensionController._editorsController + ._mongoDBDocumentService, + 'fetchDocument', + mockFetchDocument ); + await vscode.commands.executeCommand( + 'mdb.openMongoDBDocumentFromCodeLens', + documentItem + ); + assert.strictEqual( + mockFetchDocument.firstCall.args[0].source, + 'playground' + ); + }); + + test('mdb.saveMongoDBDocument replaces a document with a treeview source', async () => { + const mockDocument = { + _id: 'pancakes', + name: '', + time: { + $time: '12345', + }, + }; + const mockGet = sinon.fake.returns('pancakes'); sinon.replace( - mdbTestExtension.testExtensionController._storageController, + mdbTestExtension.testExtensionController._editorsController + ._documentIdStore, 'get', - sinon.fake.returns(false) + mockGet + ); + sandbox.replaceGetter( + vscode.window, + 'activeTextEditor', + () => + ({ + document: { + uri: { + scheme: 'VIEW_DOCUMENT_SCHEME', + query: [ + 'namespace=waffle.house', + 'connectionId=tasty_sandwhich', + 'documentId=93333a0d-83f6-4e6f-a575-af7ea6187a4a', + 'source=treeview', + ].join('&'), + }, + getText: () => JSON.stringify(mockDocument), + save: () => {}, + }, + } as unknown as typeof vscode.window.activeTextEditor) ); + + const mockReplaceDocument = sinon.fake.resolves(null); sinon.replace( - mdbTestExtension.testExtensionController._storageController, - 'hasSavedConnections', - sinon.fake.returns(false) + mdbTestExtension.testExtensionController._editorsController + ._mongoDBDocumentService, + 'replaceDocument', + mockReplaceDocument ); + await vscode.commands.executeCommand('mdb.saveMongoDBDocument'); + assert.strictEqual( + mockReplaceDocument.firstCall.args[0].source, + 'treeview' + ); + }); - mockStorageControllerUpdate = sinon.fake.resolves(undefined); + test('mdb.saveMongoDBDocuments replaces a document with a playground source', async () => { + const mockDocument = { + _id: 'pancakes', + name: '', + time: { + $time: '12345', + }, + }; + const mockGet = sinon.fake.returns('pancakes'); sinon.replace( - mdbTestExtension.testExtensionController._storageController, - 'update', - mockStorageControllerUpdate + mdbTestExtension.testExtensionController._editorsController + ._documentIdStore, + 'get', + mockGet + ); + sandbox.replaceGetter( + vscode.window, + 'activeTextEditor', + () => + ({ + document: { + uri: { + scheme: 'VIEW_DOCUMENT_SCHEME', + query: [ + 'namespace=waffle.house', + 'connectionId=tasty_sandwhich', + 'documentId=93333a0d-83f6-4e6f-a575-af7ea6187a4a', + 'source=playground', + ].join('&'), + }, + getText: () => JSON.stringify(mockDocument), + save: () => {}, + }, + } as unknown as typeof vscode.window.activeTextEditor) ); - void mdbTestExtension.testExtensionController.showOverviewPageIfRecentlyInstalled(); + const mockReplaceDocument = sinon.fake.resolves(null); + sinon.replace( + mdbTestExtension.testExtensionController._editorsController + ._mongoDBDocumentService, + 'replaceDocument', + mockReplaceDocument + ); + await vscode.commands.executeCommand('mdb.saveMongoDBDocument'); + assert.strictEqual( + mockReplaceDocument.firstCall.args[0].source, + 'playground' + ); }); - afterEach(() => { - sinon.restore(); + test('mdb.runSelectedPlaygroundBlocks runs selected playgroundB blocks once', async () => { + const mockRunSelectedPlaygroundBlocks = sinon.fake(); + sinon.replace( + mdbTestExtension.testExtensionController._playgroundController, + 'runSelectedPlaygroundBlocks', + mockRunSelectedPlaygroundBlocks + ); + await vscode.commands.executeCommand('mdb.runSelectedPlaygroundBlocks'); + assert( + mockRunSelectedPlaygroundBlocks.calledOnce, + 'Expected "runSelectedPlaygroundBlocks" to be called on the playground controller.' + ); }); - test('they are shown the overview page', () => { - assert(mockVSCodeExecuteCommand.called); - assert( - mockVSCodeExecuteCommand.firstCall.args[0] === 'mdb.openOverviewPage' + test('mdb.runAllPlaygroundBlocks runs all playgroundB blocks once', async () => { + const mockRunAllPlaygroundBlocks = sinon.fake(); + sinon.replace( + mdbTestExtension.testExtensionController._playgroundController, + 'runAllPlaygroundBlocks', + mockRunAllPlaygroundBlocks ); + await vscode.commands.executeCommand('mdb.runAllPlaygroundBlocks'); assert( - mockVSCodeExecuteCommand.firstCall.args[0] === - EXTENSION_COMMANDS.MDB_OPEN_OVERVIEW_PAGE + mockRunAllPlaygroundBlocks.calledOnce, + 'Expected "runAllPlaygroundBlocks" to be called on the playground controller.' ); }); - test("it sets that they've been shown the overview page", () => { - assert(mockStorageControllerUpdate.called); + test('mdb.changeActiveConnection changes the active connection once', async () => { + const mockChangeActiveConnection = sinon.fake(); + sinon.replace( + mdbTestExtension.testExtensionController._connectionController, + 'changeActiveConnection', + mockChangeActiveConnection + ); + await vscode.commands.executeCommand('mdb.changeActiveConnection'); assert( - mockStorageControllerUpdate.firstCall.args[0] === - StorageVariables.GLOBAL_HAS_BEEN_SHOWN_INITIAL_VIEW + mockChangeActiveConnection.calledOnce, + 'Expected "changeActiveConnection" to be called on the playground controller.' + ); + }); + + test('mdb.refreshPlaygrounds refreshes the playgrounds explorer once', async () => { + const mockRefreshPlaygrounds = sinon.fake(); + sinon.replace( + mdbTestExtension.testExtensionController._playgroundsExplorer, + 'refresh', + mockRefreshPlaygrounds ); + await vscode.commands.executeCommand('mdb.refreshPlaygrounds'); assert( - mockStorageControllerUpdate.firstCall.args[0] === - 'GLOBAL_HAS_BEEN_SHOWN_INITIAL_VIEW' + mockRefreshPlaygrounds.calledOnce, + 'Expected "refreshPlaygrounds" to be called on the playground controller.' ); - assert(mockStorageControllerUpdate.firstCall.args[1] === true); }); - } - ); - suite( - 'when a user hasnt been shown the initial overview page yet and they have connections saved', - () => { - let mockVSCodeExecuteCommand: SinonSpy; - let mockStorageControllerUpdate: SinonSpy; + test("mdb.copyDocumentContentsFromTreeView should copy a document's content to the clipboard", async () => { + const mockDocument = { + _id: 'pancakes', + time: { + $time: '12345', + }, + }; + let namespaceUsed = ''; - beforeEach(() => { - mockVSCodeExecuteCommand = sinon.fake.resolves(undefined); - sinon.replace( - vscode.commands, - 'executeCommand', - mockVSCodeExecuteCommand + const findStub = sinon.stub(); + findStub.resolves([mockDocument]); + + const mockDataService = { + find: (namespace: string) => { + namespaceUsed = namespace; + return Promise.resolve([mockDocument]); + }, + } as Pick as unknown as DataService; + const documentTreeItem = new DocumentTreeItem( + mockDocument, + 'waffle.house', + 0, + mockDataService, + () => Promise.resolve() ); - sinon.replace( - mdbTestExtension.testExtensionController._storageController, - 'get', - sinon.fake.returns(undefined) + const mockCopyToClipboard = sinon.fake(); + sinon.replaceGetter(vscode.env, 'clipboard', () => ({ + writeText: mockCopyToClipboard, + readText: sinon.fake(), + })); + await vscode.commands.executeCommand( + 'mdb.copyDocumentContentsFromTreeView', + documentTreeItem ); + assert.strictEqual(mockCopyToClipboard.called, true); + assert.strictEqual( + mockCopyToClipboard.firstCall.args[0], + `{ + "_id": "pancakes", + "time": { + "$time": "12345" + } +}` + ); + assert.strictEqual(namespaceUsed, 'waffle.house'); + }); + test("mdb.cloneDocumentFromTreeView opens a playground with a document's content", async () => { + const mockDocument = { + _id: 'pancakes', + time: new Date('3001-01-01T05:00:00.000Z'), + objectIdField: new ObjectId('57e193d7a9cc81b4027498b2'), + }; + let namespaceUsed = ''; + const mockDataService = { + find: (namespace: string) => { + namespaceUsed = namespace; + return Promise.resolve([mockDocument]); + }, + } as unknown as DataService; + const documentTreeItem = new DocumentTreeItem( + mockDocument, + 'waffle.house', + 0, + mockDataService, + () => Promise.resolve() + ); + const mockCreatePlaygroundForCloneDocument = sinon.fake(); sinon.replace( - mdbTestExtension.testExtensionController._storageController, - 'hasSavedConnections', - sinon.fake.returns(true) + mdbTestExtension.testExtensionController._playgroundController, + 'createPlaygroundForCloneDocument', + mockCreatePlaygroundForCloneDocument + ); + await vscode.commands.executeCommand( + 'mdb.cloneDocumentFromTreeView', + documentTreeItem + ); + assert.strictEqual( + mockCreatePlaygroundForCloneDocument.calledOnce, + true + ); + assert.strictEqual( + mockCreatePlaygroundForCloneDocument.firstCall.args[0], + `{ + _id: 'pancakes', + time: ISODate('3001-01-01T05:00:00.000Z'), + objectIdField: ObjectId('57e193d7a9cc81b4027498b2') +}` + ); + assert.strictEqual( + mockCreatePlaygroundForCloneDocument.firstCall.args[1], + 'waffle' + ); + assert.strictEqual( + mockCreatePlaygroundForCloneDocument.firstCall.args[2], + 'house' ); + assert.strictEqual(namespaceUsed, 'waffle.house'); + }); - mockStorageControllerUpdate = sinon.fake.resolves(undefined); + test('mdb.insertDocumentFromTreeView opens a playground with an insert document template', async () => { + const collectionTreeItem = new CollectionTreeItem( + { + name: 'pineapple', + type: CollectionTypes.collection, + }, + 'plants', + {}, + false, + false, + null + ); + const mockCreatePlaygroundForInsertDocument = sinon.fake(); sinon.replace( - mdbTestExtension.testExtensionController._storageController, - 'update', - mockStorageControllerUpdate + mdbTestExtension.testExtensionController._playgroundController, + 'createPlaygroundForInsertDocument', + mockCreatePlaygroundForInsertDocument + ); + await vscode.commands.executeCommand( + 'mdb.insertDocumentFromTreeView', + collectionTreeItem + ); + assert.strictEqual( + mockCreatePlaygroundForInsertDocument.calledOnce, + true + ); + assert.strictEqual( + mockCreatePlaygroundForInsertDocument.firstCall.args[0], + 'plants' + ); + assert.strictEqual( + mockCreatePlaygroundForInsertDocument.firstCall.args[1], + 'pineapple' ); - - void mdbTestExtension.testExtensionController.showOverviewPageIfRecentlyInstalled(); }); - test('they are not shown the overview page', () => { - assert(!mockVSCodeExecuteCommand.called); + test('mdb.deleteDocumentFromTreeView deletes a document when the confirmation is cancelled', async () => { + const mockDocument = { + _id: 'pancakes', + time: { + $time: '12345', + }, + }; + let calledDelete = false; + const mockDataService = { + deleteOne: ( + namespace: string, + _id: any, + options: object, + callback: ( + error: Error | undefined, + result: { deletedCount: number } + ) => void + ) => { + calledDelete = true; + callback(undefined, { + deletedCount: 1, + }); + }, + } as Pick as unknown as DataService; + const documentTreeItem = new DocumentTreeItem( + mockDocument, + 'waffle.house', + 0, + mockDataService, + () => Promise.resolve() + ); + const result = await vscode.commands.executeCommand( + 'mdb.deleteDocumentFromTreeView', + documentTreeItem + ); + assert.strictEqual(result, false); + assert.strictEqual(calledDelete, false); }); - test("it sets that they've been shown the overview page", () => { - assert(mockStorageControllerUpdate.called); - assert( - mockStorageControllerUpdate.firstCall.args[0] === - StorageVariables.GLOBAL_HAS_BEEN_SHOWN_INITIAL_VIEW + test('mdb.deleteDocumentFromTreeView deletes a document after confirmation', async () => { + fakeShowInformationMessage.resolves('Yes'); + + const mockDocument = { + _id: 'pancakes', + time: { + $time: '12345', + }, + }; + let namespaceUsed = ''; + let _idUsed; + const mockDataService = { + deleteOne: ( + namespace: string, + query: any, + options: object, + callback: ( + error: Error | undefined, + result: { deletedCount: number } + ) => void + ) => { + _idUsed = query; + namespaceUsed = namespace; + callback(undefined, { + deletedCount: 1, + }); + }, + } as Pick as unknown as DataService; + const documentTreeItem = new DocumentTreeItem( + mockDocument, + 'waffle.house', + 0, + mockDataService, + () => Promise.resolve() ); - assert( - mockStorageControllerUpdate.firstCall.args[0] === - 'GLOBAL_HAS_BEEN_SHOWN_INITIAL_VIEW' + const result = await vscode.commands.executeCommand( + 'mdb.deleteDocumentFromTreeView', + documentTreeItem ); - assert(mockStorageControllerUpdate.firstCall.args[1] === true); + assert.deepStrictEqual(_idUsed, { + _id: 'pancakes', + }); + assert.strictEqual(namespaceUsed, 'waffle.house'); + assert.strictEqual(result, true); }); - } - ); - suite('when a user has been shown the initial overview page', () => { - let mockVSCodeExecuteCommand: SinonSpy; + suite( + 'when a user hasnt been shown the initial overview page yet and they have no connections saved', + () => { + let mockVSCodeExecuteCommand: SinonSpy; + let mockStorageControllerUpdate: SinonSpy; + + beforeEach(() => { + mockVSCodeExecuteCommand = sinon.fake.resolves(undefined); + sinon.replace( + vscode.commands, + 'executeCommand', + mockVSCodeExecuteCommand + ); + sinon.replace( + mdbTestExtension.testExtensionController._storageController, + 'get', + sinon.fake.returns(false) + ); + sinon.replace( + mdbTestExtension.testExtensionController._storageController, + 'hasSavedConnections', + sinon.fake.returns(false) + ); + + mockStorageControllerUpdate = sinon.fake.resolves(undefined); + sinon.replace( + mdbTestExtension.testExtensionController._storageController, + 'update', + mockStorageControllerUpdate + ); + + void mdbTestExtension.testExtensionController.showOverviewPageIfRecentlyInstalled(); + }); + + afterEach(() => { + sinon.restore(); + }); + + test('they are shown the overview page', () => { + assert(mockVSCodeExecuteCommand.called); + assert( + mockVSCodeExecuteCommand.firstCall.args[0] === + 'mdb.openOverviewPage' + ); + assert( + mockVSCodeExecuteCommand.firstCall.args[0] === + EXTENSION_COMMANDS.MDB_OPEN_OVERVIEW_PAGE + ); + }); + + test("it sets that they've been shown the overview page", () => { + assert(mockStorageControllerUpdate.called); + assert( + mockStorageControllerUpdate.firstCall.args[0] === + StorageVariables.GLOBAL_HAS_BEEN_SHOWN_INITIAL_VIEW + ); + assert( + mockStorageControllerUpdate.firstCall.args[0] === + 'GLOBAL_HAS_BEEN_SHOWN_INITIAL_VIEW' + ); + assert(mockStorageControllerUpdate.firstCall.args[1] === true); + }); + } + ); + + suite( + 'when a user hasnt been shown the initial overview page yet and they have connections saved', + () => { + let mockVSCodeExecuteCommand: SinonSpy; + let mockStorageControllerUpdate: SinonSpy; + + beforeEach(() => { + mockVSCodeExecuteCommand = sinon.fake.resolves(undefined); + sinon.replace( + vscode.commands, + 'executeCommand', + mockVSCodeExecuteCommand + ); + sinon.replace( + mdbTestExtension.testExtensionController._storageController, + 'get', + sinon.fake.returns(undefined) + ); + sinon.replace( + mdbTestExtension.testExtensionController._storageController, + 'hasSavedConnections', + sinon.fake.returns(true) + ); + mockStorageControllerUpdate = sinon.fake.resolves(undefined); + sinon.replace( + mdbTestExtension.testExtensionController._storageController, + 'update', + mockStorageControllerUpdate + ); + + void mdbTestExtension.testExtensionController.showOverviewPageIfRecentlyInstalled(); + }); + + test('they are not shown the overview page', () => { + assert(!mockVSCodeExecuteCommand.called); + }); + + test("it sets that they've been shown the overview page", () => { + assert(mockStorageControllerUpdate.called); + assert( + mockStorageControllerUpdate.firstCall.args[0] === + StorageVariables.GLOBAL_HAS_BEEN_SHOWN_INITIAL_VIEW + ); + assert( + mockStorageControllerUpdate.firstCall.args[0] === + 'GLOBAL_HAS_BEEN_SHOWN_INITIAL_VIEW' + ); + assert(mockStorageControllerUpdate.firstCall.args[1] === true); + }); + } + ); + + suite('when a user has been shown the initial overview page', () => { + let mockVSCodeExecuteCommand: SinonSpy; + + beforeEach(() => { + sinon.replace( + mdbTestExtension.testExtensionController._storageController, + 'get', + sinon.fake.returns(true) + ); + mockVSCodeExecuteCommand = sinon.fake.resolves(undefined); + sinon.replace( + vscode.commands, + 'executeCommand', + mockVSCodeExecuteCommand + ); + + void mdbTestExtension.testExtensionController.showOverviewPageIfRecentlyInstalled(); + }); + + test('they are not shown the overview page', () => { + assert(!mockVSCodeExecuteCommand.called); + }); + }); + }); + }); + suite('with real text document', () => { beforeEach(() => { + sinon.stub(vscode.window, 'showInformationMessage'); + sinon.stub(vscode.window, 'showErrorMessage'); + const mockActiveConnectionId = sinon.fake.returns('tasty_sandwhich'); sinon.replace( - mdbTestExtension.testExtensionController._storageController, - 'get', - sinon.fake.returns(true) + mdbTestExtension.testExtensionController._connectionController, + 'getActiveConnectionId', + mockActiveConnectionId ); + }); - mockVSCodeExecuteCommand = sinon.fake.resolves(undefined); - sinon.replace( - vscode.commands, - 'executeCommand', - mockVSCodeExecuteCommand + afterEach(async () => { + await vscode.commands.executeCommand( + 'workbench.action.closeActiveEditor' + ); + sinon.restore(); + }); + + test('mdb.addDatabase should create a MongoDB playground with create collection template', async () => { + const mockTreeItem = new ConnectionTreeItem( + 'tasty_sandwhich', + vscode.TreeItemCollapsibleState.None, + false, + mdbTestExtension.testExtensionController._connectionController, + false, + {} + ); + await vscode.commands.executeCommand('mdb.addDatabase', mockTreeItem); + + const activeTextEditor = + mdbTestExtension.testExtensionController._playgroundController + ._activeTextEditor; + assert.strictEqual(activeTextEditor?.document.languageId, 'javascript'); + assert(activeTextEditor?.document.uri.scheme === 'untitled'); + + const content = activeTextEditor.document.getText(); + assert(content.includes('// Create a new database.')); + assert(content.includes('NEW_DATABASE_NAME')); + assert(content.includes('NEW_COLLECTION_NAME')); + }); + + test('mdb.addCollection should create a MongoDB playground with create collection template', async () => { + const mockTreeItem = new DatabaseTreeItem( + 'iceCreamDB', + {}, + false, + false, + {} ); + await vscode.commands.executeCommand('mdb.addCollection', mockTreeItem); + + const activeTextEditor = + mdbTestExtension.testExtensionController._playgroundController + ._activeTextEditor; + assert.strictEqual(activeTextEditor?.document.languageId, 'javascript'); + assert(activeTextEditor?.document.uri.scheme === 'untitled'); + + const content = activeTextEditor.document.getText(); + assert(content.includes('// The current database to use.')); + assert(content.includes('iceCreamDB')); + assert(content.includes('NEW_COLLECTION_NAME')); + assert(!content.includes('time-series')); + }); - void mdbTestExtension.testExtensionController.showOverviewPageIfRecentlyInstalled(); + test('mdb.searchForDocuments should create a MongoDB playground with search template', async () => { + await vscode.commands.executeCommand('mdb.searchForDocuments', { + databaseName: 'dbbbbbName', + collectionName: 'colllllllllName', + }); + + const activeTextEditor = + mdbTestExtension.testExtensionController._playgroundController + ._activeTextEditor; + assert.strictEqual(activeTextEditor?.document.languageId, 'javascript'); + assert(activeTextEditor?.document.uri.scheme === 'untitled'); + + const content = activeTextEditor.document.getText(); + assert( + content.includes('Search for documents in the current collection.') + ); + assert(content.includes('dbbbbbName')); + assert(content.includes('colllllllllName')); }); - test('they are not shown the overview page', () => { - assert(!mockVSCodeExecuteCommand.called); + test('mdb.createIndexFromTreeView should create a MongoDB playground with index template', async () => { + await vscode.commands.executeCommand('mdb.createIndexFromTreeView', { + databaseName: 'dbbbbbName', + collectionName: 'colllllllllName', + }); + + const activeTextEditor = + mdbTestExtension.testExtensionController._playgroundController + ._activeTextEditor; + assert.strictEqual(activeTextEditor?.document.languageId, 'javascript'); + assert(activeTextEditor?.document.uri.scheme === 'untitled'); + + const content = activeTextEditor.document.getText(); + assert(content.includes('Create a new index in the collection.')); + assert(content.includes('dbbbbbName')); + assert(content.includes('colllllllllName')); + }); + + test('mdb.createPlayground should create a MongoDB playground with default template', async () => { + const mockGetConfiguration = sinon.fake.returns({ + get: () => true, + }); + sinon.replace(vscode.workspace, 'getConfiguration', mockGetConfiguration); + await vscode.commands.executeCommand('mdb.createPlayground'); + + const activeTextEditor = + mdbTestExtension.testExtensionController._playgroundController + ._activeTextEditor; + assert.strictEqual(activeTextEditor?.document.languageId, 'javascript'); + assert(activeTextEditor?.document.uri.scheme === 'untitled'); + + const content = activeTextEditor.document.getText(); + assert(content.includes('// MongoDB Playground')); + }); + + test('mdb.createPlayground command should create a MongoDB playground without template', async () => { + const mockGetConfiguration = sinon.fake.returns({ + get: () => false, + }); + sinon.replace(vscode.workspace, 'getConfiguration', mockGetConfiguration); + await vscode.commands.executeCommand('mdb.createPlayground'); + + const activeTextEditor = + mdbTestExtension.testExtensionController._playgroundController + ._activeTextEditor; + assert.strictEqual(activeTextEditor?.document.languageId, 'javascript'); + assert(activeTextEditor?.document.uri.scheme === 'untitled'); + + const content = activeTextEditor.document.getText(); + assert.strictEqual(content, ''); }); }); }); diff --git a/src/test/suite/telemetry/connectionTelemetry.test.ts b/src/test/suite/telemetry/connectionTelemetry.test.ts index 219e08da9..5af6a48f3 100644 --- a/src/test/suite/telemetry/connectionTelemetry.test.ts +++ b/src/test/suite/telemetry/connectionTelemetry.test.ts @@ -12,8 +12,8 @@ import * as connectionTelemetry from '../../../telemetry/connectionTelemetry'; const TEST_DATABASE_URI = 'mongodb://localhost:27018'; suite('ConnectionTelemetry Controller Test Suite', function () { - this.timeout(20000); - suite('with mock data service', () => { + suite('with mock data service', function () { + this.timeout(8000); let mockDataService: DataService; before(() => { @@ -114,7 +114,8 @@ suite('ConnectionTelemetry Controller Test Suite', function () { }); }); - suite('with live connection', () => { + suite('with live connection', function () { + this.timeout(20000); let dataServ; beforeEach(async () => { diff --git a/src/utils/playground.ts b/src/utils/playground.ts index 5f84f4439..576584965 100644 --- a/src/utils/playground.ts +++ b/src/utils/playground.ts @@ -58,7 +58,7 @@ const getStat = async (filePath: string): Promise => { }; const stat = (filePath: string): Promise => { - return fs.promises.stat(filePath); + return fs.promises.lstat(filePath); }; export const isPlayground = (fileUri?: vscode.Uri) => { From 23f3e855fb63fcf00ad533bef1f6a88f0ff5ce40 Mon Sep 17 00:00:00 2001 From: Alena Khineika Date: Tue, 28 Feb 2023 22:34:57 +0100 Subject: [PATCH 30/36] test: assert.strictEqual --- src/test/suite/mdbExtensionController.test.ts | 66 ++++++++++--------- 1 file changed, 36 insertions(+), 30 deletions(-) diff --git a/src/test/suite/mdbExtensionController.test.ts b/src/test/suite/mdbExtensionController.test.ts index c35f5e218..0631fd575 100644 --- a/src/test/suite/mdbExtensionController.test.ts +++ b/src/test/suite/mdbExtensionController.test.ts @@ -463,7 +463,7 @@ suite('MDBExtensionController Test Suite', function () { const collectionChildren = await mockTreeItem.getChildren(); const docListTreeItem = collectionChildren[0]; - assert(docListTreeItem.description === '9K'); + assert.strictEqual(docListTreeItem.description, '9K'); count = 10000; docListTreeItem.isExpanded = true; @@ -693,7 +693,7 @@ suite('MDBExtensionController Test Suite', function () { testCollectionTreeItem ); assert(successfullyDropped); - assert(calledNamespace === 'testDbName.testColName'); + assert.strictEqual(calledNamespace, 'testDbName.testColName'); }); test('mdb.dropCollection fails when a collection doesnt exist', async () => { @@ -1043,8 +1043,8 @@ suite('MDBExtensionController Test Suite', function () { ) ); await vscode.commands.executeCommand('mdb.saveMongoDBDocument'); - assert(mockDocument.name === 'something sweet'); - assert(mockDocument.time.$time === '12345'); + assert.strictEqual(mockDocument.name, 'something sweet'); + assert.strictEqual(mockDocument.time.$time, '12345'); const expectedMessage = "The document was saved successfully to 'waffle.house'"; @@ -1529,27 +1529,30 @@ suite('MDBExtensionController Test Suite', function () { test('they are shown the overview page', () => { assert(mockVSCodeExecuteCommand.called); - assert( - mockVSCodeExecuteCommand.firstCall.args[0] === - 'mdb.openOverviewPage' + assert.strictEqual( + mockVSCodeExecuteCommand.firstCall.args[0], + 'mdb.openOverviewPage' ); - assert( - mockVSCodeExecuteCommand.firstCall.args[0] === - EXTENSION_COMMANDS.MDB_OPEN_OVERVIEW_PAGE + assert.strictEqual( + mockVSCodeExecuteCommand.firstCall.args[0], + EXTENSION_COMMANDS.MDB_OPEN_OVERVIEW_PAGE ); }); test("it sets that they've been shown the overview page", () => { assert(mockStorageControllerUpdate.called); - assert( - mockStorageControllerUpdate.firstCall.args[0] === - StorageVariables.GLOBAL_HAS_BEEN_SHOWN_INITIAL_VIEW + assert.strictEqual( + mockStorageControllerUpdate.firstCall.args[0], + StorageVariables.GLOBAL_HAS_BEEN_SHOWN_INITIAL_VIEW ); - assert( - mockStorageControllerUpdate.firstCall.args[0] === - 'GLOBAL_HAS_BEEN_SHOWN_INITIAL_VIEW' + assert.strictEqual( + mockStorageControllerUpdate.firstCall.args[0], + 'GLOBAL_HAS_BEEN_SHOWN_INITIAL_VIEW' + ); + assert.strictEqual( + mockStorageControllerUpdate.firstCall.args[1], + true ); - assert(mockStorageControllerUpdate.firstCall.args[1] === true); }); } ); @@ -1593,15 +1596,18 @@ suite('MDBExtensionController Test Suite', function () { test("it sets that they've been shown the overview page", () => { assert(mockStorageControllerUpdate.called); - assert( - mockStorageControllerUpdate.firstCall.args[0] === - StorageVariables.GLOBAL_HAS_BEEN_SHOWN_INITIAL_VIEW + assert.strictEqual( + mockStorageControllerUpdate.firstCall.args[0], + StorageVariables.GLOBAL_HAS_BEEN_SHOWN_INITIAL_VIEW + ); + assert.strictEqual( + mockStorageControllerUpdate.firstCall.args[0], + 'GLOBAL_HAS_BEEN_SHOWN_INITIAL_VIEW' ); - assert( - mockStorageControllerUpdate.firstCall.args[0] === - 'GLOBAL_HAS_BEEN_SHOWN_INITIAL_VIEW' + assert.strictEqual( + mockStorageControllerUpdate.firstCall.args[1], + true ); - assert(mockStorageControllerUpdate.firstCall.args[1] === true); }); } ); @@ -1666,7 +1672,7 @@ suite('MDBExtensionController Test Suite', function () { mdbTestExtension.testExtensionController._playgroundController ._activeTextEditor; assert.strictEqual(activeTextEditor?.document.languageId, 'javascript'); - assert(activeTextEditor?.document.uri.scheme === 'untitled'); + assert.strictEqual(activeTextEditor?.document.uri.scheme, 'untitled'); const content = activeTextEditor.document.getText(); assert(content.includes('// Create a new database.')); @@ -1688,7 +1694,7 @@ suite('MDBExtensionController Test Suite', function () { mdbTestExtension.testExtensionController._playgroundController ._activeTextEditor; assert.strictEqual(activeTextEditor?.document.languageId, 'javascript'); - assert(activeTextEditor?.document.uri.scheme === 'untitled'); + assert.strictEqual(activeTextEditor?.document.uri.scheme, 'untitled'); const content = activeTextEditor.document.getText(); assert(content.includes('// The current database to use.')); @@ -1707,7 +1713,7 @@ suite('MDBExtensionController Test Suite', function () { mdbTestExtension.testExtensionController._playgroundController ._activeTextEditor; assert.strictEqual(activeTextEditor?.document.languageId, 'javascript'); - assert(activeTextEditor?.document.uri.scheme === 'untitled'); + assert.strictEqual(activeTextEditor?.document.uri.scheme, 'untitled'); const content = activeTextEditor.document.getText(); assert( @@ -1727,7 +1733,7 @@ suite('MDBExtensionController Test Suite', function () { mdbTestExtension.testExtensionController._playgroundController ._activeTextEditor; assert.strictEqual(activeTextEditor?.document.languageId, 'javascript'); - assert(activeTextEditor?.document.uri.scheme === 'untitled'); + assert.strictEqual(activeTextEditor?.document.uri.scheme, 'untitled'); const content = activeTextEditor.document.getText(); assert(content.includes('Create a new index in the collection.')); @@ -1746,7 +1752,7 @@ suite('MDBExtensionController Test Suite', function () { mdbTestExtension.testExtensionController._playgroundController ._activeTextEditor; assert.strictEqual(activeTextEditor?.document.languageId, 'javascript'); - assert(activeTextEditor?.document.uri.scheme === 'untitled'); + assert.strictEqual(activeTextEditor?.document.uri.scheme, 'untitled'); const content = activeTextEditor.document.getText(); assert(content.includes('// MongoDB Playground')); @@ -1763,7 +1769,7 @@ suite('MDBExtensionController Test Suite', function () { mdbTestExtension.testExtensionController._playgroundController ._activeTextEditor; assert.strictEqual(activeTextEditor?.document.languageId, 'javascript'); - assert(activeTextEditor?.document.uri.scheme === 'untitled'); + assert.strictEqual(activeTextEditor?.document.uri.scheme, 'untitled'); const content = activeTextEditor.document.getText(); assert.strictEqual(content, ''); From f8b73262249f2ac59f14da3e1e4fdc1d278d50ef Mon Sep 17 00:00:00 2001 From: Alena Khineika Date: Wed, 1 Mar 2023 00:24:10 +0100 Subject: [PATCH 31/36] test: mock text flaky text document --- src/test/suite/mdbExtensionController.test.ts | 3138 ++++++++--------- 1 file changed, 1535 insertions(+), 1603 deletions(-) diff --git a/src/test/suite/mdbExtensionController.test.ts b/src/test/suite/mdbExtensionController.test.ts index 0631fd575..9c8e20533 100644 --- a/src/test/suite/mdbExtensionController.test.ts +++ b/src/test/suite/mdbExtensionController.test.ts @@ -29,1603 +29,1633 @@ const testDatabaseURI = 'mongodb://localhost:27018'; suite('MDBExtensionController Test Suite', function () { this.timeout(10000); - suite('with mock text document', () => { - suite('when not connected', () => { - const sandbox = sinon.createSandbox(); - let fakeVscodeErrorMessage: SinonSpy; + suite('when not connected', () => { + const sandbox = sinon.createSandbox(); + let fakeVscodeErrorMessage: SinonSpy; - beforeEach(() => { - sinon.stub(vscode.window, 'showInformationMessage'); - sinon.stub(vscode.workspace, 'openTextDocument'); - sinon.stub(vscode.window, 'showTextDocument'); - fakeVscodeErrorMessage = sinon.fake(); - sinon.replace( - vscode.window, - 'showErrorMessage', - fakeVscodeErrorMessage - ); - }); + beforeEach(() => { + sinon.stub(vscode.window, 'showInformationMessage'); + sinon.stub(vscode.workspace, 'openTextDocument'); + sinon.stub(vscode.window, 'showTextDocument'); + fakeVscodeErrorMessage = sinon.fake(); + sinon.replace(vscode.window, 'showErrorMessage', fakeVscodeErrorMessage); + }); - afterEach(() => { - sandbox.restore(); - sinon.restore(); - }); + afterEach(() => { + sandbox.restore(); + sinon.restore(); + }); - test('mdb.addDatabase command fails when not connected to the connection', async () => { - const mockTreeItem = new ConnectionTreeItem( - 'tasty_sandwhich', - vscode.TreeItemCollapsibleState.None, - false, - mdbTestExtension.testExtensionController._connectionController, - false, - {} - ); - const addDatabaseSucceeded = await vscode.commands.executeCommand( - 'mdb.addDatabase', - mockTreeItem - ); - assert( - addDatabaseSucceeded === false, - 'Expected the command handler to return a false succeeded response' - ); + test('mdb.addDatabase command fails when not connected to the connection', async () => { + const mockTreeItem = new ConnectionTreeItem( + 'tasty_sandwhich', + vscode.TreeItemCollapsibleState.None, + false, + mdbTestExtension.testExtensionController._connectionController, + false, + {} + ); + const addDatabaseSucceeded = await vscode.commands.executeCommand( + 'mdb.addDatabase', + mockTreeItem + ); + assert( + addDatabaseSucceeded === false, + 'Expected the command handler to return a false succeeded response' + ); - const expectedMessage = - 'Please connect to this connection before adding a database.'; - assert( - fakeVscodeErrorMessage.firstCall.args[0] === expectedMessage, - `Expected an error message "${expectedMessage}" to be shown when attempting to add a database to a not connected connection found "${fakeVscodeErrorMessage.firstCall.args[0]}"` - ); - }); + const expectedMessage = + 'Please connect to this connection before adding a database.'; + assert( + fakeVscodeErrorMessage.firstCall.args[0] === expectedMessage, + `Expected an error message "${expectedMessage}" to be shown when attempting to add a database to a not connected connection found "${fakeVscodeErrorMessage.firstCall.args[0]}"` + ); }); + }); - suite('when connected', () => { - const sandbox = sinon.createSandbox(); - let fakeShowInformationMessage: sinon.SinonStub; - let mockOpenTextDocument: SinonSpy; - let mockActiveConnectionId: SinonSpy; - let fakeVscodeErrorMessage: SinonSpy; + suite('when connected', () => { + const sandbox = sinon.createSandbox(); + let fakeShowInformationMessage: sinon.SinonStub; + let mockOpenTextDocument: SinonSpy; + let mockActiveConnectionId: SinonSpy; + let fakeVscodeErrorMessage: SinonSpy; + let fakeCreatePlaygroundFileWithContent: SinonSpy; + let fakeShowTextDocument: SinonSpy; - beforeEach(() => { - sinon.stub(vscode.window, 'showTextDocument'); - fakeShowInformationMessage = sinon.stub( - vscode.window, - 'showInformationMessage' - ); - mockOpenTextDocument = sinon.stub(vscode.workspace, 'openTextDocument'); - mockActiveConnectionId = sinon.fake.returns('tasty_sandwhich'); - sinon.replace( - mdbTestExtension.testExtensionController._connectionController, - 'getActiveConnectionId', - mockActiveConnectionId - ); - fakeVscodeErrorMessage = sinon.fake(); - sinon.replace( - vscode.window, - 'showErrorMessage', - fakeVscodeErrorMessage - ); - }); + beforeEach(() => { + fakeShowInformationMessage = sinon.stub( + vscode.window, + 'showInformationMessage' + ); + mockOpenTextDocument = sinon.stub(vscode.workspace, 'openTextDocument'); + mockActiveConnectionId = sinon.fake.returns('tasty_sandwhich'); + sinon.replace( + mdbTestExtension.testExtensionController._connectionController, + 'getActiveConnectionId', + mockActiveConnectionId + ); + fakeCreatePlaygroundFileWithContent = sinon.fake(); + sinon.replace( + mdbTestExtension.testExtensionController._playgroundController, + '_createPlaygroundFileWithContent', + fakeCreatePlaygroundFileWithContent + ); + fakeVscodeErrorMessage = sinon.fake(); + sinon.replace(vscode.window, 'showErrorMessage', fakeVscodeErrorMessage); + fakeShowTextDocument = sinon.fake(); + sinon.replace(vscode.window, 'showTextDocument', fakeShowTextDocument); + }); - afterEach(() => { - sandbox.restore(); - sinon.restore(); - }); + afterEach(() => { + sandbox.restore(); + sinon.restore(); + }); - test('mdb.viewCollectionDocuments command should call onViewCollectionDocuments on the editor controller with the collection namespace', async () => { - const textCollectionTree = new CollectionTreeItem( - { - name: 'testColName', - type: CollectionTypes.collection, - }, - 'testDbName', - {}, - false, - false, - null - ); - await vscode.commands.executeCommand( - 'mdb.viewCollectionDocuments', - textCollectionTree - ); - assert.strictEqual( - mockOpenTextDocument.firstCall.args[0].path.indexOf( - 'Results: testDbName.testColName' - ), - 0 - ); - assert(mockOpenTextDocument.firstCall.args[0].path.includes('.json')); - assert.strictEqual( - mockOpenTextDocument.firstCall.args[0].scheme, - VIEW_COLLECTION_SCHEME - ); - assert( - mockOpenTextDocument.firstCall.args[0].query.includes( - 'namespace=testDbName.testColName' - ) - ); - }); + test('mdb.viewCollectionDocuments command should call onViewCollectionDocuments on the editor controller with the collection namespace', async () => { + const textCollectionTree = new CollectionTreeItem( + { + name: 'testColName', + type: CollectionTypes.collection, + }, + 'testDbName', + {}, + false, + false, + null + ); + await vscode.commands.executeCommand( + 'mdb.viewCollectionDocuments', + textCollectionTree + ); + assert.strictEqual( + mockOpenTextDocument.firstCall.args[0].path.indexOf( + 'Results: testDbName.testColName' + ), + 0 + ); + assert(mockOpenTextDocument.firstCall.args[0].path.includes('.json')); + assert.strictEqual( + mockOpenTextDocument.firstCall.args[0].scheme, + VIEW_COLLECTION_SCHEME + ); + assert( + mockOpenTextDocument.firstCall.args[0].query.includes( + 'namespace=testDbName.testColName' + ) + ); + }); - test('mdb.viewCollectionDocuments command should also work with the documents list', async () => { - const textCollectionTree = new CollectionTreeItem( - { - name: 'testColName', - type: CollectionTypes.collection, - }, - 'testDbName', - {}, - false, - false, - null - ); - await vscode.commands.executeCommand( - 'mdb.viewCollectionDocuments', - textCollectionTree - ); - assert.strictEqual( - mockOpenTextDocument.firstCall.args[0].path.indexOf( - 'Results: testDbName.testColName' - ), - 0 - ); - assert(mockOpenTextDocument.firstCall.args[0].path.includes('.json')); - assert.strictEqual( - mockOpenTextDocument.firstCall.args[0].scheme, - VIEW_COLLECTION_SCHEME - ); - assert( - mockOpenTextDocument.firstCall.args[0].query.includes( - 'namespace=testDbName.testColName' - ) - ); - }); + test('mdb.viewCollectionDocuments command should also work with the documents list', async () => { + const textCollectionTree = new CollectionTreeItem( + { + name: 'testColName', + type: CollectionTypes.collection, + }, + 'testDbName', + {}, + false, + false, + null + ); + await vscode.commands.executeCommand( + 'mdb.viewCollectionDocuments', + textCollectionTree + ); + assert.strictEqual( + mockOpenTextDocument.firstCall.args[0].path.indexOf( + 'Results: testDbName.testColName' + ), + 0 + ); + assert(mockOpenTextDocument.firstCall.args[0].path.includes('.json')); + assert.strictEqual( + mockOpenTextDocument.firstCall.args[0].scheme, + VIEW_COLLECTION_SCHEME + ); + assert( + mockOpenTextDocument.firstCall.args[0].query.includes( + 'namespace=testDbName.testColName' + ) + ); + }); - test('mdb.addConnection command should call openWebview on the webview controller', async () => { - const mockOpenWebview = sinon.fake(); - sinon.replace( - mdbTestExtension.testExtensionController._webviewController, - 'openWebview', - mockOpenWebview - ); - await vscode.commands.executeCommand('mdb.addConnection'); - assert.strictEqual(mockOpenWebview.calledOnce, true); - }); + test('mdb.addConnection command should call openWebview on the webview controller', async () => { + const mockOpenWebview = sinon.fake(); + sinon.replace( + mdbTestExtension.testExtensionController._webviewController, + 'openWebview', + mockOpenWebview + ); + await vscode.commands.executeCommand('mdb.addConnection'); + assert.strictEqual(mockOpenWebview.calledOnce, true); + }); - test('mdb.addConnectionWithURI command should call connectWithURI on the connection controller', async () => { - const mockConnectWithUri = sinon.fake(); - sinon.replace( - mdbTestExtension.testExtensionController._connectionController, - 'connectWithURI', - mockConnectWithUri - ); - await vscode.commands.executeCommand('mdb.addConnectionWithURI'); - assert.strictEqual(mockConnectWithUri.calledOnce, true); - }); + test('mdb.addConnectionWithURI command should call connectWithURI on the connection controller', async () => { + const mockConnectWithUri = sinon.fake(); + sinon.replace( + mdbTestExtension.testExtensionController._connectionController, + 'connectWithURI', + mockConnectWithUri + ); + await vscode.commands.executeCommand('mdb.addConnectionWithURI'); + assert.strictEqual(mockConnectWithUri.calledOnce, true); + }); - test('mdb.refreshConnection command should reset the cache on a connection tree item', async () => { - const mockTreeItem = new ConnectionTreeItem( - 'test', - vscode.TreeItemCollapsibleState.None, - false, - mdbTestExtension.testExtensionController._connectionController, - false, - {} - ); - mockTreeItem.cacheIsUpToDate = true; + test('mdb.refreshConnection command should reset the cache on a connection tree item', async () => { + const mockTreeItem = new ConnectionTreeItem( + 'test', + vscode.TreeItemCollapsibleState.None, + false, + mdbTestExtension.testExtensionController._connectionController, + false, + {} + ); + mockTreeItem.cacheIsUpToDate = true; - const mockExplorerControllerRefresh = sinon.fake(); - sinon.replace( - mdbTestExtension.testExtensionController._explorerController, - 'refresh', - mockExplorerControllerRefresh - ); - await vscode.commands.executeCommand( - 'mdb.refreshConnection', - mockTreeItem - ); - assert.strictEqual( - mockTreeItem.cacheIsUpToDate, - false, - 'Expected cache on tree item to be set to not up to date.' - ); - assert.strictEqual( - mockExplorerControllerRefresh.called, - true, - 'Expected explorer controller refresh to be called.' - ); - }); + const mockExplorerControllerRefresh = sinon.fake(); + sinon.replace( + mdbTestExtension.testExtensionController._explorerController, + 'refresh', + mockExplorerControllerRefresh + ); + await vscode.commands.executeCommand( + 'mdb.refreshConnection', + mockTreeItem + ); + assert.strictEqual( + mockTreeItem.cacheIsUpToDate, + false, + 'Expected cache on tree item to be set to not up to date.' + ); + assert.strictEqual( + mockExplorerControllerRefresh.called, + true, + 'Expected explorer controller refresh to be called.' + ); + }); - test('mdb.treeItemRemoveConnection command should call removeMongoDBConnection on the connection controller with the tree item connection id', async () => { - const mockTreeItem = new ConnectionTreeItem( - 'craving_for_pancakes_with_maple_syrup', - vscode.TreeItemCollapsibleState.None, - false, - mdbTestExtension.testExtensionController._connectionController, - false, - {} - ); - const mockRemoveMongoDBConnection = sinon.fake(); - sinon.replace( - mdbTestExtension.testExtensionController._connectionController, - 'removeMongoDBConnection', - mockRemoveMongoDBConnection - ); - await vscode.commands.executeCommand( - 'mdb.treeItemRemoveConnection', - mockTreeItem - ); - assert.strictEqual(mockRemoveMongoDBConnection.calledOnce, true); - assert.strictEqual( - mockRemoveMongoDBConnection.firstCall.args[0], - 'craving_for_pancakes_with_maple_syrup' - ); - }); + test('mdb.treeItemRemoveConnection command should call removeMongoDBConnection on the connection controller with the tree item connection id', async () => { + const mockTreeItem = new ConnectionTreeItem( + 'craving_for_pancakes_with_maple_syrup', + vscode.TreeItemCollapsibleState.None, + false, + mdbTestExtension.testExtensionController._connectionController, + false, + {} + ); + const mockRemoveMongoDBConnection = sinon.fake(); + sinon.replace( + mdbTestExtension.testExtensionController._connectionController, + 'removeMongoDBConnection', + mockRemoveMongoDBConnection + ); + await vscode.commands.executeCommand( + 'mdb.treeItemRemoveConnection', + mockTreeItem + ); + assert.strictEqual(mockRemoveMongoDBConnection.calledOnce, true); + assert.strictEqual( + mockRemoveMongoDBConnection.firstCall.args[0], + 'craving_for_pancakes_with_maple_syrup' + ); + }); - test('mdb.copyConnectionString command should try to copy the driver url to the vscode env clipboard', async () => { - const mockTreeItem = new ConnectionTreeItem( - 'craving_for_pancakes_with_maple_syrup', - vscode.TreeItemCollapsibleState.None, - false, - mdbTestExtension.testExtensionController._connectionController, - false, - {} - ); - const mockCopyToClipboard = sinon.fake(); - sinon.replaceGetter(vscode.env, 'clipboard', () => ({ - writeText: mockCopyToClipboard, - readText: sinon.fake(), - })); - const mockStubUri = sinon.fake.returns('weStubThisUri'); - sinon.replace( - mdbTestExtension.testExtensionController._connectionController, - 'copyConnectionStringByConnectionId', - mockStubUri - ); - await vscode.commands.executeCommand( - 'mdb.copyConnectionString', - mockTreeItem - ); - assert.strictEqual(mockCopyToClipboard.calledOnce, true); - assert.strictEqual( - mockCopyToClipboard.firstCall.args[0], - 'weStubThisUri' - ); - }); + test('mdb.copyConnectionString command should try to copy the driver url to the vscode env clipboard', async () => { + const mockTreeItem = new ConnectionTreeItem( + 'craving_for_pancakes_with_maple_syrup', + vscode.TreeItemCollapsibleState.None, + false, + mdbTestExtension.testExtensionController._connectionController, + false, + {} + ); + const mockCopyToClipboard = sinon.fake(); + sinon.replaceGetter(vscode.env, 'clipboard', () => ({ + writeText: mockCopyToClipboard, + readText: sinon.fake(), + })); + const mockStubUri = sinon.fake.returns('weStubThisUri'); + sinon.replace( + mdbTestExtension.testExtensionController._connectionController, + 'copyConnectionStringByConnectionId', + mockStubUri + ); + await vscode.commands.executeCommand( + 'mdb.copyConnectionString', + mockTreeItem + ); + assert.strictEqual(mockCopyToClipboard.calledOnce, true); + assert.strictEqual( + mockCopyToClipboard.firstCall.args[0], + 'weStubThisUri' + ); + }); - test('mdb.copyDatabaseName command should try to copy the database name to the vscode env clipboard', async () => { - const mockTreeItem = new DatabaseTreeItem( - 'isClubMateTheBestDrinkEver', - {}, - false, - false, - {} - ); - const mockCopyToClipboard = sinon.fake(); - sinon.replaceGetter(vscode.env, 'clipboard', () => ({ - writeText: mockCopyToClipboard, - readText: sinon.fake(), - })); - await vscode.commands.executeCommand( - 'mdb.copyDatabaseName', - mockTreeItem - ); - assert.strictEqual(mockCopyToClipboard.calledOnce, true); - assert.strictEqual( - mockCopyToClipboard.firstCall.args[0], - 'isClubMateTheBestDrinkEver' - ); - }); + test('mdb.copyDatabaseName command should try to copy the database name to the vscode env clipboard', async () => { + const mockTreeItem = new DatabaseTreeItem( + 'isClubMateTheBestDrinkEver', + {}, + false, + false, + {} + ); + const mockCopyToClipboard = sinon.fake(); + sinon.replaceGetter(vscode.env, 'clipboard', () => ({ + writeText: mockCopyToClipboard, + readText: sinon.fake(), + })); + await vscode.commands.executeCommand( + 'mdb.copyDatabaseName', + mockTreeItem + ); + assert.strictEqual(mockCopyToClipboard.calledOnce, true); + assert.strictEqual( + mockCopyToClipboard.firstCall.args[0], + 'isClubMateTheBestDrinkEver' + ); + }); - test('mdb.copyCollectionName command should try to copy the collection name to the vscode env clipboard', async () => { - const mockTreeItem = new CollectionTreeItem( - { - name: 'waterBuffalo', - type: CollectionTypes.collection, - }, - 'airZebra', - {}, - false, - false, - null - ); - const mockCopyToClipboard = sinon.fake(); - sinon.replaceGetter(vscode.env, 'clipboard', () => ({ - writeText: mockCopyToClipboard, - readText: sinon.fake(), - })); - await vscode.commands.executeCommand( - 'mdb.copyCollectionName', - mockTreeItem - ); - assert( - mockCopyToClipboard.called, - 'Expected "writeText" to be called on "vscode.env.clipboard".' - ); - assert( - mockCopyToClipboard.firstCall.args[0] === 'waterBuffalo', - `Expected the clipboard to be sent the uri string "waterBuffalo", found ${mockCopyToClipboard.firstCall.args[0]}.` - ); - }); + test('mdb.copyCollectionName command should try to copy the collection name to the vscode env clipboard', async () => { + const mockTreeItem = new CollectionTreeItem( + { + name: 'waterBuffalo', + type: CollectionTypes.collection, + }, + 'airZebra', + {}, + false, + false, + null + ); + const mockCopyToClipboard = sinon.fake(); + sinon.replaceGetter(vscode.env, 'clipboard', () => ({ + writeText: mockCopyToClipboard, + readText: sinon.fake(), + })); + await vscode.commands.executeCommand( + 'mdb.copyCollectionName', + mockTreeItem + ); + assert( + mockCopyToClipboard.called, + 'Expected "writeText" to be called on "vscode.env.clipboard".' + ); + assert( + mockCopyToClipboard.firstCall.args[0] === 'waterBuffalo', + `Expected the clipboard to be sent the uri string "waterBuffalo", found ${mockCopyToClipboard.firstCall.args[0]}.` + ); + }); - test('mdb.copySchemaFieldName command should try to copy the field name to the vscode env clipboard', async () => { - const mockTreeItem = new FieldTreeItem( - { - name: 'dolphins are sentient', - probability: 1, - type: 'String', - types: [], - }, - false, - {} - ); - const mockCopyToClipboard = sinon.fake(); - sinon.replaceGetter(vscode.env, 'clipboard', () => ({ - writeText: mockCopyToClipboard, - readText: sinon.fake(), - })); - const commandResult = await vscode.commands.executeCommand( - 'mdb.copySchemaFieldName', - mockTreeItem - ); - assert(commandResult); - assert( - mockCopyToClipboard.called, - 'Expected "writeText" to be called on "vscode.env.clipboard".' - ); - assert( - mockCopyToClipboard.firstCall.args[0] === 'dolphins are sentient', - `Expected the clipboard to be sent the schema field name "dolphins are sentient", found ${mockCopyToClipboard.firstCall.args[0]}.` - ); - }); + test('mdb.copySchemaFieldName command should try to copy the field name to the vscode env clipboard', async () => { + const mockTreeItem = new FieldTreeItem( + { + name: 'dolphins are sentient', + probability: 1, + type: 'String', + types: [], + }, + false, + {} + ); + const mockCopyToClipboard = sinon.fake(); + sinon.replaceGetter(vscode.env, 'clipboard', () => ({ + writeText: mockCopyToClipboard, + readText: sinon.fake(), + })); + const commandResult = await vscode.commands.executeCommand( + 'mdb.copySchemaFieldName', + mockTreeItem + ); + assert(commandResult); + assert( + mockCopyToClipboard.called, + 'Expected "writeText" to be called on "vscode.env.clipboard".' + ); + assert( + mockCopyToClipboard.firstCall.args[0] === 'dolphins are sentient', + `Expected the clipboard to be sent the schema field name "dolphins are sentient", found ${mockCopyToClipboard.firstCall.args[0]}.` + ); + }); - test('mdb.refreshDatabase command should reset the cache on the database tree item', async () => { - const mockTreeItem = new DatabaseTreeItem( - 'pinkLemonade', - {}, - false, - false, - {} - ); - mockTreeItem.cacheIsUpToDate = true; + test('mdb.refreshDatabase command should reset the cache on the database tree item', async () => { + const mockTreeItem = new DatabaseTreeItem( + 'pinkLemonade', + {}, + false, + false, + {} + ); + mockTreeItem.cacheIsUpToDate = true; - const mockExplorerControllerRefresh = sinon.fake(); - sinon.replace( - mdbTestExtension.testExtensionController._explorerController, - 'refresh', - mockExplorerControllerRefresh - ); - await vscode.commands.executeCommand( - 'mdb.refreshDatabase', - mockTreeItem - ); - assert.strictEqual( - mockTreeItem.cacheIsUpToDate, - false, - 'Expected cache on tree item to be set to not up to date.' - ); - assert( - mockExplorerControllerRefresh.called === true, - 'Expected explorer controller refresh to be called.' - ); - }); + const mockExplorerControllerRefresh = sinon.fake(); + sinon.replace( + mdbTestExtension.testExtensionController._explorerController, + 'refresh', + mockExplorerControllerRefresh + ); + await vscode.commands.executeCommand('mdb.refreshDatabase', mockTreeItem); + assert.strictEqual( + mockTreeItem.cacheIsUpToDate, + false, + 'Expected cache on tree item to be set to not up to date.' + ); + assert( + mockExplorerControllerRefresh.called === true, + 'Expected explorer controller refresh to be called.' + ); + }); - test('mdb.refreshCollection command should reset the expanded state of its children and call to refresh the explorer controller', async () => { - const mockTreeItem = new CollectionTreeItem( - { - name: 'iSawACatThatLookedLikeALionToday', - type: CollectionTypes.collection, - }, - 'airZebra', - {}, - false, - false, - null - ); - mockTreeItem.isExpanded = true; + test('mdb.refreshCollection command should reset the expanded state of its children and call to refresh the explorer controller', async () => { + const mockTreeItem = new CollectionTreeItem( + { + name: 'iSawACatThatLookedLikeALionToday', + type: CollectionTypes.collection, + }, + 'airZebra', + {}, + false, + false, + null + ); + mockTreeItem.isExpanded = true; - // Set expanded. - mockTreeItem.getSchemaChild().isExpanded = true; - mockTreeItem.getDocumentListChild().isExpanded = true; + // Set expanded. + mockTreeItem.getSchemaChild().isExpanded = true; + mockTreeItem.getDocumentListChild().isExpanded = true; - const mockExplorerControllerRefresh = sinon.fake(); - sinon.replace( - mdbTestExtension.testExtensionController._explorerController, - 'refresh', - mockExplorerControllerRefresh - ); - await vscode.commands.executeCommand( - 'mdb.refreshCollection', - mockTreeItem - ); - assert( - mockTreeItem.getSchemaChild().isExpanded === false, - 'Expected collection tree item child to be reset to not expanded.' - ); - assert( - mockExplorerControllerRefresh.called === true, - 'Expected explorer controller refresh to be called.' - ); - }); + const mockExplorerControllerRefresh = sinon.fake(); + sinon.replace( + mdbTestExtension.testExtensionController._explorerController, + 'refresh', + mockExplorerControllerRefresh + ); + await vscode.commands.executeCommand( + 'mdb.refreshCollection', + mockTreeItem + ); + assert( + mockTreeItem.getSchemaChild().isExpanded === false, + 'Expected collection tree item child to be reset to not expanded.' + ); + assert( + mockExplorerControllerRefresh.called === true, + 'Expected explorer controller refresh to be called.' + ); + }); - test('mdb.refreshDocumentList command should update the document count and call to refresh the explorer controller', async () => { - let count = 9000; - const mockTreeItem = new CollectionTreeItem( - { - name: 'iSawACatThatLookedLikeALionToday', - type: CollectionTypes.collection, - }, - 'airZebra', - { estimatedCount: () => Promise.resolve(count) }, - false, - false, - null - ); - await mockTreeItem.onDidExpand(); + test('mdb.refreshDocumentList command should update the document count and call to refresh the explorer controller', async () => { + let count = 9000; + const mockTreeItem = new CollectionTreeItem( + { + name: 'iSawACatThatLookedLikeALionToday', + type: CollectionTypes.collection, + }, + 'airZebra', + { estimatedCount: () => Promise.resolve(count) }, + false, + false, + null + ); + await mockTreeItem.onDidExpand(); - const collectionChildren = await mockTreeItem.getChildren(); - const docListTreeItem = collectionChildren[0]; - assert.strictEqual(docListTreeItem.description, '9K'); - count = 10000; - docListTreeItem.isExpanded = true; + const collectionChildren = await mockTreeItem.getChildren(); + const docListTreeItem = collectionChildren[0]; + assert.strictEqual(docListTreeItem.description, '9K'); + count = 10000; + docListTreeItem.isExpanded = true; - const mockExplorerControllerRefresh = sinon.fake(); - sinon.replace( - mdbTestExtension.testExtensionController._explorerController, - 'refresh', - mockExplorerControllerRefresh - ); + const mockExplorerControllerRefresh = sinon.fake(); + sinon.replace( + mdbTestExtension.testExtensionController._explorerController, + 'refresh', + mockExplorerControllerRefresh + ); - await vscode.commands.executeCommand( - 'mdb.refreshDocumentList', - docListTreeItem - ); - assert( - docListTreeItem.cacheIsUpToDate === false, - 'Expected document list cache to be out of date.' - ); - assert( - mockTreeItem.documentCount === 10000, - `Expected document count to be 10000, found ${mockTreeItem.documentCount}.` - ); - assert( - mockExplorerControllerRefresh.called === true, - 'Expected explorer controller refresh to be called.' - ); - }); + await vscode.commands.executeCommand( + 'mdb.refreshDocumentList', + docListTreeItem + ); + assert( + docListTreeItem.cacheIsUpToDate === false, + 'Expected document list cache to be out of date.' + ); + assert( + mockTreeItem.documentCount === 10000, + `Expected document count to be 10000, found ${mockTreeItem.documentCount}.` + ); + assert( + mockExplorerControllerRefresh.called === true, + 'Expected explorer controller refresh to be called.' + ); + }); - test('mdb.refreshSchema command should reset its cache and call to refresh the explorer controller', async () => { - const mockTreeItem = new SchemaTreeItem( - 'zebraWearwolf', - 'giraffeVampire', - {} as DataService, - false, - false, - false, - false, - {} - ); + test('mdb.refreshSchema command should reset its cache and call to refresh the explorer controller', async () => { + const mockTreeItem = new SchemaTreeItem( + 'zebraWearwolf', + 'giraffeVampire', + {} as DataService, + false, + false, + false, + false, + {} + ); - // Set cached. - mockTreeItem.cacheIsUpToDate = true; + // Set cached. + mockTreeItem.cacheIsUpToDate = true; - const mockExplorerControllerRefresh = sinon.fake(); - sinon.replace( - mdbTestExtension.testExtensionController._explorerController, - 'refresh', - mockExplorerControllerRefresh - ); - await vscode.commands.executeCommand('mdb.refreshSchema', mockTreeItem); - assert( - !mockTreeItem.cacheIsUpToDate, - 'Expected schema field cache to be not up to date.' - ); - assert( - mockExplorerControllerRefresh.called === true, - 'Expected explorer controller refresh to be called.' - ); - }); + const mockExplorerControllerRefresh = sinon.fake(); + sinon.replace( + mdbTestExtension.testExtensionController._explorerController, + 'refresh', + mockExplorerControllerRefresh + ); + await vscode.commands.executeCommand('mdb.refreshSchema', mockTreeItem); + assert( + !mockTreeItem.cacheIsUpToDate, + 'Expected schema field cache to be not up to date.' + ); + assert( + mockExplorerControllerRefresh.called === true, + 'Expected explorer controller refresh to be called.' + ); + }); - test('mdb.refreshIndexes command should reset its cache and call to refresh the explorer controller', async () => { - const mockTreeItem = new IndexListTreeItem( - 'zebraWearwolf', - 'giraffeVampire', - {} as DataService, - false, - false, - [] - ); + test('mdb.refreshIndexes command should reset its cache and call to refresh the explorer controller', async () => { + const mockTreeItem = new IndexListTreeItem( + 'zebraWearwolf', + 'giraffeVampire', + {} as DataService, + false, + false, + [] + ); - // Set cached. - mockTreeItem.cacheIsUpToDate = true; + // Set cached. + mockTreeItem.cacheIsUpToDate = true; - const mockExplorerControllerRefresh = sinon.fake(); - sinon.replace( - mdbTestExtension.testExtensionController._explorerController, - 'refresh', - mockExplorerControllerRefresh - ); - await vscode.commands.executeCommand( - 'mdb.refreshIndexes', - mockTreeItem - ); - assert( - !mockTreeItem.cacheIsUpToDate, - 'Expected schema field cache to be not up to date.' - ); - assert( - mockExplorerControllerRefresh.called === true, - 'Expected explorer controller refresh to be called.' - ); - }); + const mockExplorerControllerRefresh = sinon.fake(); + sinon.replace( + mdbTestExtension.testExtensionController._explorerController, + 'refresh', + mockExplorerControllerRefresh + ); + await vscode.commands.executeCommand('mdb.refreshIndexes', mockTreeItem); + assert( + !mockTreeItem.cacheIsUpToDate, + 'Expected schema field cache to be not up to date.' + ); + assert( + mockExplorerControllerRefresh.called === true, + 'Expected explorer controller refresh to be called.' + ); + }); - test('mdb.addDatabase command fails when disconnecting', async () => { - const mockTreeItem = new ConnectionTreeItem( - 'tasty_sandwhich', - vscode.TreeItemCollapsibleState.None, - false, - mdbTestExtension.testExtensionController._connectionController, - false, - {} - ); - const mockInputBoxResolves: any = sinon.stub(); - mockInputBoxResolves.onCall(0).resolves('theDbName'); - mockInputBoxResolves.onCall(1).resolves('theCollectionName'); - sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); + test('mdb.addDatabase should create a MongoDB playground with create collection template', async () => { + const mockTreeItem = new ConnectionTreeItem( + 'tasty_sandwhich', + vscode.TreeItemCollapsibleState.None, + false, + mdbTestExtension.testExtensionController._connectionController, + false, + {} + ); + await vscode.commands.executeCommand('mdb.addDatabase', mockTreeItem); - const mockIsDisconnecting = sinon.fake.returns(true); - sinon.replace( - mdbTestExtension.testExtensionController._connectionController, - 'isDisconnecting', - mockIsDisconnecting - ); + const content = fakeCreatePlaygroundFileWithContent.firstCall.args[0]; + assert(content.includes('// Create a new database.')); + assert(content.includes('NEW_DATABASE_NAME')); + assert(content.includes('NEW_COLLECTION_NAME')); + }); - const addDatabaseSucceeded = await vscode.commands.executeCommand( - 'mdb.addDatabase', - mockTreeItem - ); - assert( - addDatabaseSucceeded === false, - 'Expected the add database command handler to return a false succeeded response' - ); + test('mdb.addCollection should create a MongoDB playground with create collection template', async () => { + const mockTreeItem = new DatabaseTreeItem( + 'iceCreamDB', + {}, + false, + false, + {} + ); + await vscode.commands.executeCommand('mdb.addCollection', mockTreeItem); - const expectedMessage = - 'Unable to add database: currently disconnecting.'; - assert( - fakeVscodeErrorMessage.firstCall.args[0] === expectedMessage, - `Expected the error message "${expectedMessage}" to be shown when attempting to add a database while disconnecting, found "${fakeVscodeErrorMessage.firstCall.args[0]}"` - ); + const content = fakeCreatePlaygroundFileWithContent.firstCall.args[0]; + assert(content.includes('// The current database to use.')); + assert(content.includes('iceCreamDB')); + assert(content.includes('NEW_COLLECTION_NAME')); + assert(!content.includes('time-series')); + }); + + test('mdb.searchForDocuments should create a MongoDB playground with search template', async () => { + await vscode.commands.executeCommand('mdb.searchForDocuments', { + databaseName: 'dbbbbbName', + collectionName: 'colllllllllName', }); - test('mdb.addDatabase command fails when connecting', async () => { - const mockTreeItem = new ConnectionTreeItem( - 'tasty_sandwhich', - vscode.TreeItemCollapsibleState.None, - false, - mdbTestExtension.testExtensionController._connectionController, - false, - {} - ); - const mockInputBoxResolves: any = sinon.stub(); - mockInputBoxResolves.onCall(0).resolves('theDbName'); - mockInputBoxResolves.onCall(1).resolves('theCollectionName'); - sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); + const content = fakeCreatePlaygroundFileWithContent.firstCall.args[0]; + assert( + content.includes('Search for documents in the current collection.') + ); + assert(content.includes('dbbbbbName')); + assert(content.includes('colllllllllName')); + }); - const mockIsConnecting = sinon.fake.returns(true); - sinon.replace( - mdbTestExtension.testExtensionController._connectionController, - 'isConnecting', - mockIsConnecting - ); + test('mdb.createIndexFromTreeView should create a MongoDB playground with index template', async () => { + await vscode.commands.executeCommand('mdb.createIndexFromTreeView', { + databaseName: 'dbbbbbName', + collectionName: 'colllllllllName', + }); - const addDatabaseSucceeded = await vscode.commands.executeCommand( - 'mdb.addDatabase', - mockTreeItem - ); - assert( - addDatabaseSucceeded === false, - 'Expected the add database command handler to return a false succeeded response' - ); + const content = fakeCreatePlaygroundFileWithContent.firstCall.args[0]; + assert(content.includes('Create a new index in the collection.')); + assert(content.includes('dbbbbbName')); + assert(content.includes('colllllllllName')); + }); - const expectedMessage = 'Unable to add database: currently connecting.'; - assert( - fakeVscodeErrorMessage.firstCall.args[0] === expectedMessage, - `Expected the error message "${expectedMessage}" to be shown when attempting to add a database while disconnecting, found "${fakeVscodeErrorMessage.firstCall.args[0]}"` - ); + test('mdb.createPlayground should create a MongoDB playground with default template', async () => { + const mockGetConfiguration = sinon.fake.returns({ + get: () => true, }); + sinon.replace(vscode.workspace, 'getConfiguration', mockGetConfiguration); + await vscode.commands.executeCommand('mdb.createPlayground'); - test('mdb.addCollection command fails when disconnecting', async () => { - const mockTreeItem = new DatabaseTreeItem( - 'iceCreamDB', - {}, - false, - false, - {} - ); - const mockInputBoxResolves: any = sinon.stub(); - mockInputBoxResolves.onCall(0).resolves('mintChocolateChips'); - sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); - - const mockIsDisconnecting = sinon.fake.returns(true); - sinon.replace( - mdbTestExtension.testExtensionController._connectionController, - 'isDisconnecting', - mockIsDisconnecting - ); + const content = fakeCreatePlaygroundFileWithContent.firstCall.args[0]; + assert(content.includes('// MongoDB Playground')); + }); - const addCollectionSucceeded = await vscode.commands.executeCommand( - 'mdb.addCollection', - mockTreeItem - ); - assert( - addCollectionSucceeded === false, - 'Expected the add collection command handler to return a false succeeded response' - ); - const expectedMessage = - 'Unable to add collection: currently disconnecting.'; - assert( - fakeVscodeErrorMessage.firstCall.args[0] === expectedMessage, - `Expected "${expectedMessage}" when adding a database to a not connected connection, recieved "${fakeVscodeErrorMessage.firstCall.args[0]}"` - ); + test('mdb.createPlayground command should create a MongoDB playground without template', async () => { + const mockGetConfiguration = sinon.fake.returns({ + get: () => false, }); + sinon.replace(vscode.workspace, 'getConfiguration', mockGetConfiguration); + await vscode.commands.executeCommand('mdb.createPlayground'); + + const content = fakeCreatePlaygroundFileWithContent.firstCall.args[0]; + assert.strictEqual(content, ''); + }); + + test('mdb.addDatabase command fails when disconnecting', async () => { + const mockTreeItem = new ConnectionTreeItem( + 'tasty_sandwhich', + vscode.TreeItemCollapsibleState.None, + false, + mdbTestExtension.testExtensionController._connectionController, + false, + {} + ); + const mockInputBoxResolves: any = sinon.stub(); + mockInputBoxResolves.onCall(0).resolves('theDbName'); + mockInputBoxResolves.onCall(1).resolves('theCollectionName'); + sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); + + const mockIsDisconnecting = sinon.fake.returns(true); + sinon.replace( + mdbTestExtension.testExtensionController._connectionController, + 'isDisconnecting', + mockIsDisconnecting + ); + + const addDatabaseSucceeded = await vscode.commands.executeCommand( + 'mdb.addDatabase', + mockTreeItem + ); + assert( + addDatabaseSucceeded === false, + 'Expected the add database command handler to return a false succeeded response' + ); + + const expectedMessage = + 'Unable to add database: currently disconnecting.'; + assert( + fakeVscodeErrorMessage.firstCall.args[0] === expectedMessage, + `Expected the error message "${expectedMessage}" to be shown when attempting to add a database while disconnecting, found "${fakeVscodeErrorMessage.firstCall.args[0]}"` + ); + }); + + test('mdb.addDatabase command fails when connecting', async () => { + const mockTreeItem = new ConnectionTreeItem( + 'tasty_sandwhich', + vscode.TreeItemCollapsibleState.None, + false, + mdbTestExtension.testExtensionController._connectionController, + false, + {} + ); + const mockInputBoxResolves: any = sinon.stub(); + mockInputBoxResolves.onCall(0).resolves('theDbName'); + mockInputBoxResolves.onCall(1).resolves('theCollectionName'); + sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); + + const mockIsConnecting = sinon.fake.returns(true); + sinon.replace( + mdbTestExtension.testExtensionController._connectionController, + 'isConnecting', + mockIsConnecting + ); + + const addDatabaseSucceeded = await vscode.commands.executeCommand( + 'mdb.addDatabase', + mockTreeItem + ); + assert( + addDatabaseSucceeded === false, + 'Expected the add database command handler to return a false succeeded response' + ); + + const expectedMessage = 'Unable to add database: currently connecting.'; + assert( + fakeVscodeErrorMessage.firstCall.args[0] === expectedMessage, + `Expected the error message "${expectedMessage}" to be shown when attempting to add a database while disconnecting, found "${fakeVscodeErrorMessage.firstCall.args[0]}"` + ); + }); + + test('mdb.addCollection command fails when disconnecting', async () => { + const mockTreeItem = new DatabaseTreeItem( + 'iceCreamDB', + {}, + false, + false, + {} + ); + const mockInputBoxResolves: any = sinon.stub(); + mockInputBoxResolves.onCall(0).resolves('mintChocolateChips'); + sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); + + const mockIsDisconnecting = sinon.fake.returns(true); + sinon.replace( + mdbTestExtension.testExtensionController._connectionController, + 'isDisconnecting', + mockIsDisconnecting + ); - // https://code.visualstudio.com/api/references/contribution-points#Sorting-of-groups - test('mdb.dropCollection calls data service to drop the collection after inputting the collection name', async () => { - let calledNamespace = ''; - const testCollectionTreeItem = new CollectionTreeItem( - { name: 'testColName', type: CollectionTypes.collection }, - 'testDbName', - { - dropCollection: (namespace, callback): void => { - calledNamespace = namespace; - callback(null, true); - }, + const addCollectionSucceeded = await vscode.commands.executeCommand( + 'mdb.addCollection', + mockTreeItem + ); + assert( + addCollectionSucceeded === false, + 'Expected the add collection command handler to return a false succeeded response' + ); + const expectedMessage = + 'Unable to add collection: currently disconnecting.'; + assert( + fakeVscodeErrorMessage.firstCall.args[0] === expectedMessage, + `Expected "${expectedMessage}" when adding a database to a not connected connection, recieved "${fakeVscodeErrorMessage.firstCall.args[0]}"` + ); + }); + + // https://code.visualstudio.com/api/references/contribution-points#Sorting-of-groups + test('mdb.dropCollection calls data service to drop the collection after inputting the collection name', async () => { + let calledNamespace = ''; + const testCollectionTreeItem = new CollectionTreeItem( + { name: 'testColName', type: CollectionTypes.collection }, + 'testDbName', + { + dropCollection: (namespace, callback): void => { + calledNamespace = namespace; + callback(null, true); }, - false, - false, - null - ); + }, + false, + false, + null + ); - const mockInputBoxResolves: any = sinon.stub(); - mockInputBoxResolves.onCall(0).resolves('testColName'); - sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); + const mockInputBoxResolves: any = sinon.stub(); + mockInputBoxResolves.onCall(0).resolves('testColName'); + sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); - const successfullyDropped = await vscode.commands.executeCommand( - 'mdb.dropCollection', - testCollectionTreeItem - ); - assert(successfullyDropped); - assert.strictEqual(calledNamespace, 'testDbName.testColName'); - }); + const successfullyDropped = await vscode.commands.executeCommand( + 'mdb.dropCollection', + testCollectionTreeItem + ); + assert(successfullyDropped); + assert.strictEqual(calledNamespace, 'testDbName.testColName'); + }); - test('mdb.dropCollection fails when a collection doesnt exist', async () => { - const testConnectionController = - mdbTestExtension.testExtensionController._connectionController; - await testConnectionController.addNewConnectionStringAndConnect( - testDatabaseURI - ); + test('mdb.dropCollection fails when a collection doesnt exist', async () => { + const testConnectionController = + mdbTestExtension.testExtensionController._connectionController; + await testConnectionController.addNewConnectionStringAndConnect( + testDatabaseURI + ); - const testCollectionTreeItem = new CollectionTreeItem( - { name: 'doesntExistColName', type: CollectionTypes.collection }, - 'doesntExistDBName', - testConnectionController.getActiveDataService(), - false, - false, - null - ); - const mockInputBoxResolves: any = sinon.stub(); - mockInputBoxResolves.onCall(0).resolves('doesntExistColName'); - sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); + const testCollectionTreeItem = new CollectionTreeItem( + { name: 'doesntExistColName', type: CollectionTypes.collection }, + 'doesntExistDBName', + testConnectionController.getActiveDataService(), + false, + false, + null + ); + const mockInputBoxResolves: any = sinon.stub(); + mockInputBoxResolves.onCall(0).resolves('doesntExistColName'); + sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); - const successfullyDropped = await vscode.commands.executeCommand( - 'mdb.dropCollection', - testCollectionTreeItem - ); - assert( - successfullyDropped === false, - 'Expected the drop collection command handler to return a false succeeded response' - ); + const successfullyDropped = await vscode.commands.executeCommand( + 'mdb.dropCollection', + testCollectionTreeItem + ); + assert( + successfullyDropped === false, + 'Expected the drop collection command handler to return a false succeeded response' + ); - const expectedMessage = 'Drop collection failed: ns not found'; - assert( - fakeVscodeErrorMessage.firstCall.args[0] === expectedMessage, - `Expected "${expectedMessage}" when dropping a collection that doesn't exist, recieved "${fakeVscodeErrorMessage.firstCall.args[0]}"` - ); - await testConnectionController.disconnect(); - testConnectionController.clearAllConnections(); - }); + const expectedMessage = 'Drop collection failed: ns not found'; + assert( + fakeVscodeErrorMessage.firstCall.args[0] === expectedMessage, + `Expected "${expectedMessage}" when dropping a collection that doesn't exist, recieved "${fakeVscodeErrorMessage.firstCall.args[0]}"` + ); + await testConnectionController.disconnect(); + testConnectionController.clearAllConnections(); + }); - test('mdb.dropCollection fails when the input doesnt match the collection name', async () => { - const testCollectionTreeItem = new CollectionTreeItem( - { name: 'orange', type: CollectionTypes.collection }, - 'fruitsThatAreTasty', - {}, - false, - false, - null - ); - const mockInputBoxResolves: any = sinon.stub(); - mockInputBoxResolves.onCall(0).resolves('apple'); - sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); + test('mdb.dropCollection fails when the input doesnt match the collection name', async () => { + const testCollectionTreeItem = new CollectionTreeItem( + { name: 'orange', type: CollectionTypes.collection }, + 'fruitsThatAreTasty', + {}, + false, + false, + null + ); + const mockInputBoxResolves: any = sinon.stub(); + mockInputBoxResolves.onCall(0).resolves('apple'); + sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); - const successfullyDropped = await vscode.commands.executeCommand( - 'mdb.dropCollection', - testCollectionTreeItem - ); - assert( - successfullyDropped === false, - 'Expected the drop collection command handler to return a false succeeded response' - ); - }); + const successfullyDropped = await vscode.commands.executeCommand( + 'mdb.dropCollection', + testCollectionTreeItem + ); + assert( + successfullyDropped === false, + 'Expected the drop collection command handler to return a false succeeded response' + ); + }); - test('mdb.dropCollection fails when the collection name input is empty', async () => { - const testCollectionTreeItem = new CollectionTreeItem( - { name: 'orange', type: CollectionTypes.view }, - 'fruitsThatAreTasty', - {}, - false, - false, - null - ); - const mockInputBoxResolves: any = sinon.stub(); - mockInputBoxResolves.onCall(0).resolves(/* Return undefined. */); - sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); + test('mdb.dropCollection fails when the collection name input is empty', async () => { + const testCollectionTreeItem = new CollectionTreeItem( + { name: 'orange', type: CollectionTypes.view }, + 'fruitsThatAreTasty', + {}, + false, + false, + null + ); + const mockInputBoxResolves: any = sinon.stub(); + mockInputBoxResolves.onCall(0).resolves(/* Return undefined. */); + sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); - const successfullyDropped = await vscode.commands.executeCommand( - 'mdb.dropCollection', - testCollectionTreeItem - ); - assert( - successfullyDropped === false, - 'Expected the drop collection command handler to return a false succeeded response' - ); - }); + const successfullyDropped = await vscode.commands.executeCommand( + 'mdb.dropCollection', + testCollectionTreeItem + ); + assert( + successfullyDropped === false, + 'Expected the drop collection command handler to return a false succeeded response' + ); + }); - test('mdb.dropDatabase calls dataservice to drop the database after inputting the database name', async () => { - let calledDatabaseName = ''; - const testDatabaseTreeItem = new DatabaseTreeItem( - 'iMissTangerineAltoids', - { - dropDatabase: (dbName, callback): void => { - calledDatabaseName = dbName; - callback(null, true); - }, + test('mdb.dropDatabase calls dataservice to drop the database after inputting the database name', async () => { + let calledDatabaseName = ''; + const testDatabaseTreeItem = new DatabaseTreeItem( + 'iMissTangerineAltoids', + { + dropDatabase: (dbName, callback): void => { + calledDatabaseName = dbName; + callback(null, true); }, - false, - false, - {} - ); - - const mockInputBoxResolves: any = sinon.stub(); - mockInputBoxResolves.onCall(0).resolves('iMissTangerineAltoids'); - sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); + }, + false, + false, + {} + ); - const successfullyDropped = await vscode.commands.executeCommand( - 'mdb.dropDatabase', - testDatabaseTreeItem - ); - assert.strictEqual(successfullyDropped, true); - assert.strictEqual(calledDatabaseName, 'iMissTangerineAltoids'); - }); + const mockInputBoxResolves: any = sinon.stub(); + mockInputBoxResolves.onCall(0).resolves('iMissTangerineAltoids'); + sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); - test('mdb.dropDatabase succeeds even when a database doesnt exist (mdb behavior)', async () => { - const testConnectionController = - mdbTestExtension.testExtensionController._connectionController; - await testConnectionController.addNewConnectionStringAndConnect( - testDatabaseURI - ); + const successfullyDropped = await vscode.commands.executeCommand( + 'mdb.dropDatabase', + testDatabaseTreeItem + ); + assert.strictEqual(successfullyDropped, true); + assert.strictEqual(calledDatabaseName, 'iMissTangerineAltoids'); + }); - const testDatabaseTreeItem = new DatabaseTreeItem( - 'narnia____a', - testConnectionController.getActiveDataService(), - false, - false, - {} - ); - const mockInputBoxResolves: any = sinon.stub(); - mockInputBoxResolves.onCall(0).resolves('narnia____a'); - sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); + test('mdb.dropDatabase succeeds even when a database doesnt exist (mdb behavior)', async () => { + const testConnectionController = + mdbTestExtension.testExtensionController._connectionController; + await testConnectionController.addNewConnectionStringAndConnect( + testDatabaseURI + ); - const successfullyDropped = await vscode.commands.executeCommand( - 'mdb.dropDatabase', - testDatabaseTreeItem - ); - assert( - successfullyDropped, - 'Expected the drop database command handler to return a successful boolean response' - ); - assert( - fakeVscodeErrorMessage.called === false, - 'Expected no error messages' - ); - }); + const testDatabaseTreeItem = new DatabaseTreeItem( + 'narnia____a', + testConnectionController.getActiveDataService(), + false, + false, + {} + ); + const mockInputBoxResolves: any = sinon.stub(); + mockInputBoxResolves.onCall(0).resolves('narnia____a'); + sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); - test('mdb.dropDatabase fails when the input doesnt match the database name', async () => { - const testDatabaseTreeItem = new DatabaseTreeItem( - 'cinnamonToastCrunch', - {}, - false, - false, - {} - ); - const mockInputBoxResolves: any = sinon.stub(); - mockInputBoxResolves.onCall(0).resolves('apple'); - sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); + const successfullyDropped = await vscode.commands.executeCommand( + 'mdb.dropDatabase', + testDatabaseTreeItem + ); + assert( + successfullyDropped, + 'Expected the drop database command handler to return a successful boolean response' + ); + assert( + fakeVscodeErrorMessage.called === false, + 'Expected no error messages' + ); + }); - const successfullyDropped = await vscode.commands.executeCommand( - 'mdb.dropDatabase', - testDatabaseTreeItem - ); - assert( - successfullyDropped === false, - 'Expected the drop database command handler to return a false succeeded response' - ); - }); + test('mdb.dropDatabase fails when the input doesnt match the database name', async () => { + const testDatabaseTreeItem = new DatabaseTreeItem( + 'cinnamonToastCrunch', + {}, + false, + false, + {} + ); + const mockInputBoxResolves: any = sinon.stub(); + mockInputBoxResolves.onCall(0).resolves('apple'); + sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); - test('mdb.dropDatabase fails when the database name input is empty', async () => { - const testDatabaseTreeItem = new DatabaseTreeItem( - 'blueBerryPancakesAndTheSmellOfBacon', - {}, - false, - false, - {} - ); - const mockInputBoxResolves: any = sinon.stub(); - mockInputBoxResolves.onCall(0).resolves(/* Return undefined. */); - sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); + const successfullyDropped = await vscode.commands.executeCommand( + 'mdb.dropDatabase', + testDatabaseTreeItem + ); + assert( + successfullyDropped === false, + 'Expected the drop database command handler to return a false succeeded response' + ); + }); - const successfullyDropped = await vscode.commands.executeCommand( - 'mdb.dropDatabase', - testDatabaseTreeItem - ); - assert( - successfullyDropped === false, - 'Expected the drop database command handler to return a false succeeded response' - ); - }); + test('mdb.dropDatabase fails when the database name input is empty', async () => { + const testDatabaseTreeItem = new DatabaseTreeItem( + 'blueBerryPancakesAndTheSmellOfBacon', + {}, + false, + false, + {} + ); + const mockInputBoxResolves: any = sinon.stub(); + mockInputBoxResolves.onCall(0).resolves(/* Return undefined. */); + sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); - test('mdb.renameConnection fails when the name input is empty', async () => { - mdbTestExtension.testExtensionController._connectionController._connections.blueBerryPancakesAndTheSmellOfBacon = - { - id: 'blueBerryPancakesAndTheSmellOfBacon', - connectionOptions: { connectionString: 'mongodb://localhost' }, - name: 'NAAAME', - storageLocation: StorageLocation.NONE, - }; - - const mockTreeItem = new ConnectionTreeItem( - 'blueBerryPancakesAndTheSmellOfBacon', - vscode.TreeItemCollapsibleState.None, - false, - mdbTestExtension.testExtensionController._connectionController, - false, - {} - ); + const successfullyDropped = await vscode.commands.executeCommand( + 'mdb.dropDatabase', + testDatabaseTreeItem + ); + assert( + successfullyDropped === false, + 'Expected the drop database command handler to return a false succeeded response' + ); + }); - const mockInputBoxResolves: any = sinon.stub(); - mockInputBoxResolves.onCall(0).resolves(/* Return undefined. */); - sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); + test('mdb.renameConnection fails when the name input is empty', async () => { + mdbTestExtension.testExtensionController._connectionController._connections.blueBerryPancakesAndTheSmellOfBacon = + { + id: 'blueBerryPancakesAndTheSmellOfBacon', + connectionOptions: { connectionString: 'mongodb://localhost' }, + name: 'NAAAME', + storageLocation: StorageLocation.NONE, + }; - const successfullyRenamed = await vscode.commands.executeCommand( - 'mdb.renameConnection', - mockTreeItem - ); - assert( - successfullyRenamed === false, - 'Expected the rename connection command handler to return a false succeeded response' - ); - assert( - mdbTestExtension.testExtensionController._connectionController - ._connections.blueBerryPancakesAndTheSmellOfBacon.name === 'NAAAME', - 'Expected connection not to be ranamed.' - ); - mdbTestExtension.testExtensionController._connectionController.clearAllConnections(); - }); + const mockTreeItem = new ConnectionTreeItem( + 'blueBerryPancakesAndTheSmellOfBacon', + vscode.TreeItemCollapsibleState.None, + false, + mdbTestExtension.testExtensionController._connectionController, + false, + {} + ); - test('mdb.renameConnection updates the name of a connection', async () => { - mdbTestExtension.testExtensionController._connectionController._connections.blueBerryPancakesAndTheSmellOfBacon = - { - id: 'blueBerryPancakesAndTheSmellOfBacon', - name: 'NAAAME', - connectionOptions: { connectionString: 'mongodb://localhost' }, - storageLocation: StorageLocation.NONE, - }; - - const mockTreeItem = new ConnectionTreeItem( - 'blueBerryPancakesAndTheSmellOfBacon', - vscode.TreeItemCollapsibleState.None, - false, - mdbTestExtension.testExtensionController._connectionController, - false, - {} - ); - const mockInputBoxResolves: any = sinon.stub(); - mockInputBoxResolves.onCall(0).resolves('orange juice'); - sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); + const mockInputBoxResolves: any = sinon.stub(); + mockInputBoxResolves.onCall(0).resolves(/* Return undefined. */); + sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); - const successfullyRenamed = await vscode.commands.executeCommand( - 'mdb.renameConnection', - mockTreeItem - ); - assert.strictEqual(successfullyRenamed, true); - assert.strictEqual( - mdbTestExtension.testExtensionController._connectionController - ._connections.blueBerryPancakesAndTheSmellOfBacon.name, - 'orange juice' - ); - mdbTestExtension.testExtensionController._connectionController.clearAllConnections(); - }); + const successfullyRenamed = await vscode.commands.executeCommand( + 'mdb.renameConnection', + mockTreeItem + ); + assert( + successfullyRenamed === false, + 'Expected the rename connection command handler to return a false succeeded response' + ); + assert( + mdbTestExtension.testExtensionController._connectionController + ._connections.blueBerryPancakesAndTheSmellOfBacon.name === 'NAAAME', + 'Expected connection not to be ranamed.' + ); + mdbTestExtension.testExtensionController._connectionController.clearAllConnections(); + }); - test('mdb.openMongoDBDocumentFromTree openes a document from the sidebar and saves it to MongoDB', async () => { - const mockDocument = { - _id: 'pancakes', - name: '', - time: { - $time: '12345', - }, + test('mdb.renameConnection updates the name of a connection', async () => { + mdbTestExtension.testExtensionController._connectionController._connections.blueBerryPancakesAndTheSmellOfBacon = + { + id: 'blueBerryPancakesAndTheSmellOfBacon', + name: 'NAAAME', + connectionOptions: { connectionString: 'mongodb://localhost' }, + storageLocation: StorageLocation.NONE, }; - const mockGet = sinon.fake.returns('pancakes'); - sinon.replace( - mdbTestExtension.testExtensionController._editorsController - ._documentIdStore, - 'get', - mockGet - ); - const activeTextEditor = mockTextEditor; - activeTextEditor.document.uri = vscode.Uri.parse( - [ - 'VIEW_DOCUMENT_SCHEME:/', - 'waffle.house:pancakes.json?', - 'namespace=waffle.house&', - 'connectionId=tasty_sandwhich&', - 'documentId=93333a0d-83f6-4e6f-a575-af7ea6187a4a&', - 'source=treeview', - ].join('') - ); - activeTextEditor.document.getText = () => JSON.stringify(mockDocument); - sandbox.replaceGetter( - vscode.window, - 'activeTextEditor', - () => activeTextEditor - ); + const mockTreeItem = new ConnectionTreeItem( + 'blueBerryPancakesAndTheSmellOfBacon', + vscode.TreeItemCollapsibleState.None, + false, + mdbTestExtension.testExtensionController._connectionController, + false, + {} + ); + const mockInputBoxResolves: any = sinon.stub(); + mockInputBoxResolves.onCall(0).resolves('orange juice'); + sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); - const mockGetActiveDataService = sinon.fake.returns({ - find: () => { - return Promise.resolve([mockDocument]); - }, - findOneAndReplace: ( - namespace: string, - filter: object, - replacement: object, - options: object, - callback: (error: Error | null, result: object) => void - ) => { - mockDocument.name = 'something sweet'; - - return callback(null, mockDocument); - }, - }); - sinon.replace( - mdbTestExtension.testExtensionController._connectionController, - 'getActiveDataService', - mockGetActiveDataService - ); + const successfullyRenamed = await vscode.commands.executeCommand( + 'mdb.renameConnection', + mockTreeItem + ); + assert.strictEqual(successfullyRenamed, true); + assert.strictEqual( + mdbTestExtension.testExtensionController._connectionController + ._connections.blueBerryPancakesAndTheSmellOfBacon.name, + 'orange juice' + ); + mdbTestExtension.testExtensionController._connectionController.clearAllConnections(); + }); - const documentItem = new DocumentTreeItem( - mockDocument, - 'waffle.house', - 0, - {} as DataService, - () => Promise.resolve() - ); - await vscode.commands.executeCommand( - 'mdb.openMongoDBDocumentFromTree', - documentItem - ); - assert(mockOpenTextDocument.firstCall.args[0].path.includes('.json')); - assert.strictEqual( - mockOpenTextDocument.firstCall.args[0].scheme, - 'VIEW_DOCUMENT_SCHEME' - ); - assert( - mockOpenTextDocument.firstCall.args[0].query.includes('documentId=') - ); - assert( - mockOpenTextDocument.firstCall.args[0].query.includes('connectionId=') - ); - assert( - mockOpenTextDocument.firstCall.args[0].query.includes( - 'source=treeview' - ) - ); - assert( - mockOpenTextDocument.firstCall.args[0].query.includes( - 'namespace=waffle.house' - ) - ); - await vscode.commands.executeCommand('mdb.saveMongoDBDocument'); - assert.strictEqual(mockDocument.name, 'something sweet'); - assert.strictEqual(mockDocument.time.$time, '12345'); + test('mdb.openMongoDBDocumentFromTree openes a document from the sidebar and saves it to MongoDB', async () => { + const mockDocument = { + _id: 'pancakes', + name: '', + time: { + $time: '12345', + }, + }; + const mockGet = sinon.fake.returns('pancakes'); + sinon.replace( + mdbTestExtension.testExtensionController._editorsController + ._documentIdStore, + 'get', + mockGet + ); - const expectedMessage = - "The document was saved successfully to 'waffle.house'"; + const activeTextEditor = mockTextEditor; + activeTextEditor.document.uri = vscode.Uri.parse( + [ + 'VIEW_DOCUMENT_SCHEME:/', + 'waffle.house:pancakes.json?', + 'namespace=waffle.house&', + 'connectionId=tasty_sandwhich&', + 'documentId=93333a0d-83f6-4e6f-a575-af7ea6187a4a&', + 'source=treeview', + ].join('') + ); + activeTextEditor.document.getText = () => JSON.stringify(mockDocument); + sandbox.replaceGetter( + vscode.window, + 'activeTextEditor', + () => activeTextEditor + ); - assert.strictEqual( - fakeShowInformationMessage.firstCall.args[0], - expectedMessage - ); + const mockGetActiveDataService = sinon.fake.returns({ + find: () => { + return Promise.resolve([mockDocument]); + }, + findOneAndReplace: ( + namespace: string, + filter: object, + replacement: object, + options: object, + callback: (error: Error | null, result: object) => void + ) => { + mockDocument.name = 'something sweet'; + + return callback(null, mockDocument); + }, }); + sinon.replace( + mdbTestExtension.testExtensionController._connectionController, + 'getActiveDataService', + mockGetActiveDataService + ); - test('mdb.openMongoDBDocumentFromTree openes a document from a tree with a treeview source', async () => { - const mockDocument = { - _id: 'pancakes', - name: '', - time: { - $time: '12345', - }, - }; - const documentItem = new DocumentTreeItem( - mockDocument, - 'waffle.house', - 0, - {} as DataService, - () => Promise.resolve() - ); - const mockFetchDocument = sinon.fake.resolves(null); - sinon.replace( - mdbTestExtension.testExtensionController._editorsController - ._mongoDBDocumentService, - 'fetchDocument', - mockFetchDocument - ); - await vscode.commands.executeCommand( - 'mdb.openMongoDBDocumentFromTree', - documentItem - ); - assert.strictEqual( - mockFetchDocument.firstCall.args[0].source, - 'treeview' - ); - }); + const documentItem = new DocumentTreeItem( + mockDocument, + 'waffle.house', + 0, + {} as DataService, + () => Promise.resolve() + ); + await vscode.commands.executeCommand( + 'mdb.openMongoDBDocumentFromTree', + documentItem + ); + assert(mockOpenTextDocument.firstCall.args[0].path.includes('.json')); + assert.strictEqual( + mockOpenTextDocument.firstCall.args[0].scheme, + 'VIEW_DOCUMENT_SCHEME' + ); + assert( + mockOpenTextDocument.firstCall.args[0].query.includes('documentId=') + ); + assert( + mockOpenTextDocument.firstCall.args[0].query.includes('connectionId=') + ); + assert( + mockOpenTextDocument.firstCall.args[0].query.includes('source=treeview') + ); + assert( + mockOpenTextDocument.firstCall.args[0].query.includes( + 'namespace=waffle.house' + ) + ); + await vscode.commands.executeCommand('mdb.saveMongoDBDocument'); + assert.strictEqual(mockDocument.name, 'something sweet'); + assert.strictEqual(mockDocument.time.$time, '12345'); - test('mdb.openMongoDBDocumentFromCodeLens openes a document from a playground results with a playground source', async () => { - const documentItem = { - source: 'playground', - line: 1, - documentId: '93333a0d-83f6-4e6f-a575-af7ea6187a4a', - namespace: 'db.coll', - connectionId: null, - }; - const mockFetchDocument = sinon.fake.resolves(null); - sinon.replace( - mdbTestExtension.testExtensionController._editorsController - ._mongoDBDocumentService, - 'fetchDocument', - mockFetchDocument - ); - await vscode.commands.executeCommand( - 'mdb.openMongoDBDocumentFromCodeLens', - documentItem - ); - assert.strictEqual( - mockFetchDocument.firstCall.args[0].source, - 'playground' - ); - }); + const expectedMessage = + "The document was saved successfully to 'waffle.house'"; - test('mdb.saveMongoDBDocument replaces a document with a treeview source', async () => { - const mockDocument = { - _id: 'pancakes', - name: '', - time: { - $time: '12345', - }, - }; - const mockGet = sinon.fake.returns('pancakes'); - sinon.replace( - mdbTestExtension.testExtensionController._editorsController - ._documentIdStore, - 'get', - mockGet - ); - sandbox.replaceGetter( - vscode.window, - 'activeTextEditor', - () => - ({ - document: { - uri: { - scheme: 'VIEW_DOCUMENT_SCHEME', - query: [ - 'namespace=waffle.house', - 'connectionId=tasty_sandwhich', - 'documentId=93333a0d-83f6-4e6f-a575-af7ea6187a4a', - 'source=treeview', - ].join('&'), - }, - getText: () => JSON.stringify(mockDocument), - save: () => {}, - }, - } as unknown as typeof vscode.window.activeTextEditor) - ); + assert.strictEqual( + fakeShowInformationMessage.firstCall.args[0], + expectedMessage + ); + }); - const mockReplaceDocument = sinon.fake.resolves(null); - sinon.replace( - mdbTestExtension.testExtensionController._editorsController - ._mongoDBDocumentService, - 'replaceDocument', - mockReplaceDocument - ); - await vscode.commands.executeCommand('mdb.saveMongoDBDocument'); - assert.strictEqual( - mockReplaceDocument.firstCall.args[0].source, - 'treeview' - ); - }); + test('mdb.openMongoDBDocumentFromTree openes a document from a tree with a treeview source', async () => { + const mockDocument = { + _id: 'pancakes', + name: '', + time: { + $time: '12345', + }, + }; + const documentItem = new DocumentTreeItem( + mockDocument, + 'waffle.house', + 0, + {} as DataService, + () => Promise.resolve() + ); + const mockFetchDocument = sinon.fake.resolves(null); + sinon.replace( + mdbTestExtension.testExtensionController._editorsController + ._mongoDBDocumentService, + 'fetchDocument', + mockFetchDocument + ); + await vscode.commands.executeCommand( + 'mdb.openMongoDBDocumentFromTree', + documentItem + ); + assert.strictEqual( + mockFetchDocument.firstCall.args[0].source, + 'treeview' + ); + }); - test('mdb.saveMongoDBDocuments replaces a document with a playground source', async () => { - const mockDocument = { - _id: 'pancakes', - name: '', - time: { - $time: '12345', - }, - }; - const mockGet = sinon.fake.returns('pancakes'); - sinon.replace( - mdbTestExtension.testExtensionController._editorsController - ._documentIdStore, - 'get', - mockGet - ); - sandbox.replaceGetter( - vscode.window, - 'activeTextEditor', - () => - ({ - document: { - uri: { - scheme: 'VIEW_DOCUMENT_SCHEME', - query: [ - 'namespace=waffle.house', - 'connectionId=tasty_sandwhich', - 'documentId=93333a0d-83f6-4e6f-a575-af7ea6187a4a', - 'source=playground', - ].join('&'), - }, - getText: () => JSON.stringify(mockDocument), - save: () => {}, + test('mdb.openMongoDBDocumentFromCodeLens openes a document from a playground results with a playground source', async () => { + const documentItem = { + source: 'playground', + line: 1, + documentId: '93333a0d-83f6-4e6f-a575-af7ea6187a4a', + namespace: 'db.coll', + connectionId: null, + }; + const mockFetchDocument = sinon.fake.resolves(null); + sinon.replace( + mdbTestExtension.testExtensionController._editorsController + ._mongoDBDocumentService, + 'fetchDocument', + mockFetchDocument + ); + await vscode.commands.executeCommand( + 'mdb.openMongoDBDocumentFromCodeLens', + documentItem + ); + assert.strictEqual( + mockFetchDocument.firstCall.args[0].source, + 'playground' + ); + }); + + test('mdb.saveMongoDBDocument replaces a document with a treeview source', async () => { + const mockDocument = { + _id: 'pancakes', + name: '', + time: { + $time: '12345', + }, + }; + const mockGet = sinon.fake.returns('pancakes'); + sinon.replace( + mdbTestExtension.testExtensionController._editorsController + ._documentIdStore, + 'get', + mockGet + ); + sandbox.replaceGetter( + vscode.window, + 'activeTextEditor', + () => + ({ + document: { + uri: { + scheme: 'VIEW_DOCUMENT_SCHEME', + query: [ + 'namespace=waffle.house', + 'connectionId=tasty_sandwhich', + 'documentId=93333a0d-83f6-4e6f-a575-af7ea6187a4a', + 'source=treeview', + ].join('&'), }, - } as unknown as typeof vscode.window.activeTextEditor) - ); + getText: () => JSON.stringify(mockDocument), + save: () => {}, + }, + } as unknown as typeof vscode.window.activeTextEditor) + ); - const mockReplaceDocument = sinon.fake.resolves(null); - sinon.replace( - mdbTestExtension.testExtensionController._editorsController - ._mongoDBDocumentService, - 'replaceDocument', - mockReplaceDocument - ); - await vscode.commands.executeCommand('mdb.saveMongoDBDocument'); - assert.strictEqual( - mockReplaceDocument.firstCall.args[0].source, - 'playground' - ); - }); + const mockReplaceDocument = sinon.fake.resolves(null); + sinon.replace( + mdbTestExtension.testExtensionController._editorsController + ._mongoDBDocumentService, + 'replaceDocument', + mockReplaceDocument + ); + await vscode.commands.executeCommand('mdb.saveMongoDBDocument'); + assert.strictEqual( + mockReplaceDocument.firstCall.args[0].source, + 'treeview' + ); + }); - test('mdb.runSelectedPlaygroundBlocks runs selected playgroundB blocks once', async () => { - const mockRunSelectedPlaygroundBlocks = sinon.fake(); - sinon.replace( - mdbTestExtension.testExtensionController._playgroundController, - 'runSelectedPlaygroundBlocks', - mockRunSelectedPlaygroundBlocks - ); - await vscode.commands.executeCommand('mdb.runSelectedPlaygroundBlocks'); - assert( - mockRunSelectedPlaygroundBlocks.calledOnce, - 'Expected "runSelectedPlaygroundBlocks" to be called on the playground controller.' - ); - }); + test('mdb.saveMongoDBDocuments replaces a document with a playground source', async () => { + const mockDocument = { + _id: 'pancakes', + name: '', + time: { + $time: '12345', + }, + }; + const mockGet = sinon.fake.returns('pancakes'); + sinon.replace( + mdbTestExtension.testExtensionController._editorsController + ._documentIdStore, + 'get', + mockGet + ); + sandbox.replaceGetter( + vscode.window, + 'activeTextEditor', + () => + ({ + document: { + uri: { + scheme: 'VIEW_DOCUMENT_SCHEME', + query: [ + 'namespace=waffle.house', + 'connectionId=tasty_sandwhich', + 'documentId=93333a0d-83f6-4e6f-a575-af7ea6187a4a', + 'source=playground', + ].join('&'), + }, + getText: () => JSON.stringify(mockDocument), + save: () => {}, + }, + } as unknown as typeof vscode.window.activeTextEditor) + ); - test('mdb.runAllPlaygroundBlocks runs all playgroundB blocks once', async () => { - const mockRunAllPlaygroundBlocks = sinon.fake(); - sinon.replace( - mdbTestExtension.testExtensionController._playgroundController, - 'runAllPlaygroundBlocks', - mockRunAllPlaygroundBlocks - ); - await vscode.commands.executeCommand('mdb.runAllPlaygroundBlocks'); - assert( - mockRunAllPlaygroundBlocks.calledOnce, - 'Expected "runAllPlaygroundBlocks" to be called on the playground controller.' - ); - }); + const mockReplaceDocument = sinon.fake.resolves(null); + sinon.replace( + mdbTestExtension.testExtensionController._editorsController + ._mongoDBDocumentService, + 'replaceDocument', + mockReplaceDocument + ); + await vscode.commands.executeCommand('mdb.saveMongoDBDocument'); + assert.strictEqual( + mockReplaceDocument.firstCall.args[0].source, + 'playground' + ); + }); - test('mdb.changeActiveConnection changes the active connection once', async () => { - const mockChangeActiveConnection = sinon.fake(); - sinon.replace( - mdbTestExtension.testExtensionController._connectionController, - 'changeActiveConnection', - mockChangeActiveConnection - ); - await vscode.commands.executeCommand('mdb.changeActiveConnection'); - assert( - mockChangeActiveConnection.calledOnce, - 'Expected "changeActiveConnection" to be called on the playground controller.' - ); - }); + test('mdb.runSelectedPlaygroundBlocks runs selected playgroundB blocks once', async () => { + const mockRunSelectedPlaygroundBlocks = sinon.fake(); + sinon.replace( + mdbTestExtension.testExtensionController._playgroundController, + 'runSelectedPlaygroundBlocks', + mockRunSelectedPlaygroundBlocks + ); + await vscode.commands.executeCommand('mdb.runSelectedPlaygroundBlocks'); + assert( + mockRunSelectedPlaygroundBlocks.calledOnce, + 'Expected "runSelectedPlaygroundBlocks" to be called on the playground controller.' + ); + }); - test('mdb.refreshPlaygrounds refreshes the playgrounds explorer once', async () => { - const mockRefreshPlaygrounds = sinon.fake(); - sinon.replace( - mdbTestExtension.testExtensionController._playgroundsExplorer, - 'refresh', - mockRefreshPlaygrounds - ); - await vscode.commands.executeCommand('mdb.refreshPlaygrounds'); - assert( - mockRefreshPlaygrounds.calledOnce, - 'Expected "refreshPlaygrounds" to be called on the playground controller.' - ); - }); + test('mdb.runAllPlaygroundBlocks runs all playgroundB blocks once', async () => { + const mockRunAllPlaygroundBlocks = sinon.fake(); + sinon.replace( + mdbTestExtension.testExtensionController._playgroundController, + 'runAllPlaygroundBlocks', + mockRunAllPlaygroundBlocks + ); + await vscode.commands.executeCommand('mdb.runAllPlaygroundBlocks'); + assert( + mockRunAllPlaygroundBlocks.calledOnce, + 'Expected "runAllPlaygroundBlocks" to be called on the playground controller.' + ); + }); - test("mdb.copyDocumentContentsFromTreeView should copy a document's content to the clipboard", async () => { - const mockDocument = { - _id: 'pancakes', - time: { - $time: '12345', - }, - }; - let namespaceUsed = ''; + test('mdb.changeActiveConnection changes the active connection once', async () => { + const mockChangeActiveConnection = sinon.fake(); + sinon.replace( + mdbTestExtension.testExtensionController._connectionController, + 'changeActiveConnection', + mockChangeActiveConnection + ); + await vscode.commands.executeCommand('mdb.changeActiveConnection'); + assert( + mockChangeActiveConnection.calledOnce, + 'Expected "changeActiveConnection" to be called on the playground controller.' + ); + }); - const findStub = sinon.stub(); - findStub.resolves([mockDocument]); + test('mdb.refreshPlaygrounds refreshes the playgrounds explorer once', async () => { + const mockRefreshPlaygrounds = sinon.fake(); + sinon.replace( + mdbTestExtension.testExtensionController._playgroundsExplorer, + 'refresh', + mockRefreshPlaygrounds + ); + await vscode.commands.executeCommand('mdb.refreshPlaygrounds'); + assert( + mockRefreshPlaygrounds.calledOnce, + 'Expected "refreshPlaygrounds" to be called on the playground controller.' + ); + }); - const mockDataService = { - find: (namespace: string) => { - namespaceUsed = namespace; - return Promise.resolve([mockDocument]); - }, - } as Pick as unknown as DataService; - const documentTreeItem = new DocumentTreeItem( - mockDocument, - 'waffle.house', - 0, - mockDataService, - () => Promise.resolve() - ); - const mockCopyToClipboard = sinon.fake(); - sinon.replaceGetter(vscode.env, 'clipboard', () => ({ - writeText: mockCopyToClipboard, - readText: sinon.fake(), - })); - await vscode.commands.executeCommand( - 'mdb.copyDocumentContentsFromTreeView', - documentTreeItem - ); - assert.strictEqual(mockCopyToClipboard.called, true); - assert.strictEqual( - mockCopyToClipboard.firstCall.args[0], - `{ + test("mdb.copyDocumentContentsFromTreeView should copy a document's content to the clipboard", async () => { + const mockDocument = { + _id: 'pancakes', + time: { + $time: '12345', + }, + }; + let namespaceUsed = ''; + + const findStub = sinon.stub(); + findStub.resolves([mockDocument]); + + const mockDataService = { + find: (namespace: string) => { + namespaceUsed = namespace; + return Promise.resolve([mockDocument]); + }, + } as Pick as unknown as DataService; + const documentTreeItem = new DocumentTreeItem( + mockDocument, + 'waffle.house', + 0, + mockDataService, + () => Promise.resolve() + ); + const mockCopyToClipboard = sinon.fake(); + sinon.replaceGetter(vscode.env, 'clipboard', () => ({ + writeText: mockCopyToClipboard, + readText: sinon.fake(), + })); + await vscode.commands.executeCommand( + 'mdb.copyDocumentContentsFromTreeView', + documentTreeItem + ); + assert.strictEqual(mockCopyToClipboard.called, true); + assert.strictEqual( + mockCopyToClipboard.firstCall.args[0], + `{ "_id": "pancakes", "time": { "$time": "12345" } }` - ); - assert.strictEqual(namespaceUsed, 'waffle.house'); - }); + ); + assert.strictEqual(namespaceUsed, 'waffle.house'); + }); - test("mdb.cloneDocumentFromTreeView opens a playground with a document's content", async () => { - const mockDocument = { - _id: 'pancakes', - time: new Date('3001-01-01T05:00:00.000Z'), - objectIdField: new ObjectId('57e193d7a9cc81b4027498b2'), - }; - let namespaceUsed = ''; - const mockDataService = { - find: (namespace: string) => { - namespaceUsed = namespace; - return Promise.resolve([mockDocument]); - }, - } as unknown as DataService; - const documentTreeItem = new DocumentTreeItem( - mockDocument, - 'waffle.house', - 0, - mockDataService, - () => Promise.resolve() - ); - const mockCreatePlaygroundForCloneDocument = sinon.fake(); - sinon.replace( - mdbTestExtension.testExtensionController._playgroundController, - 'createPlaygroundForCloneDocument', - mockCreatePlaygroundForCloneDocument - ); - await vscode.commands.executeCommand( - 'mdb.cloneDocumentFromTreeView', - documentTreeItem - ); - assert.strictEqual( - mockCreatePlaygroundForCloneDocument.calledOnce, - true - ); - assert.strictEqual( - mockCreatePlaygroundForCloneDocument.firstCall.args[0], - `{ + test("mdb.cloneDocumentFromTreeView opens a playground with a document's content", async () => { + const mockDocument = { + _id: 'pancakes', + time: new Date('3001-01-01T05:00:00.000Z'), + objectIdField: new ObjectId('57e193d7a9cc81b4027498b2'), + }; + let namespaceUsed = ''; + const mockDataService = { + find: (namespace: string) => { + namespaceUsed = namespace; + return Promise.resolve([mockDocument]); + }, + } as unknown as DataService; + const documentTreeItem = new DocumentTreeItem( + mockDocument, + 'waffle.house', + 0, + mockDataService, + () => Promise.resolve() + ); + const mockCreatePlaygroundForCloneDocument = sinon.fake(); + sinon.replace( + mdbTestExtension.testExtensionController._playgroundController, + 'createPlaygroundForCloneDocument', + mockCreatePlaygroundForCloneDocument + ); + await vscode.commands.executeCommand( + 'mdb.cloneDocumentFromTreeView', + documentTreeItem + ); + assert.strictEqual(mockCreatePlaygroundForCloneDocument.calledOnce, true); + assert.strictEqual( + mockCreatePlaygroundForCloneDocument.firstCall.args[0], + `{ _id: 'pancakes', time: ISODate('3001-01-01T05:00:00.000Z'), objectIdField: ObjectId('57e193d7a9cc81b4027498b2') }` - ); - assert.strictEqual( - mockCreatePlaygroundForCloneDocument.firstCall.args[1], - 'waffle' - ); - assert.strictEqual( - mockCreatePlaygroundForCloneDocument.firstCall.args[2], - 'house' - ); - assert.strictEqual(namespaceUsed, 'waffle.house'); - }); - - test('mdb.insertDocumentFromTreeView opens a playground with an insert document template', async () => { - const collectionTreeItem = new CollectionTreeItem( - { - name: 'pineapple', - type: CollectionTypes.collection, - }, - 'plants', - {}, - false, - false, - null - ); - const mockCreatePlaygroundForInsertDocument = sinon.fake(); - sinon.replace( - mdbTestExtension.testExtensionController._playgroundController, - 'createPlaygroundForInsertDocument', - mockCreatePlaygroundForInsertDocument - ); - await vscode.commands.executeCommand( - 'mdb.insertDocumentFromTreeView', - collectionTreeItem - ); - assert.strictEqual( - mockCreatePlaygroundForInsertDocument.calledOnce, - true - ); - assert.strictEqual( - mockCreatePlaygroundForInsertDocument.firstCall.args[0], - 'plants' - ); - assert.strictEqual( - mockCreatePlaygroundForInsertDocument.firstCall.args[1], - 'pineapple' - ); - }); + ); + assert.strictEqual( + mockCreatePlaygroundForCloneDocument.firstCall.args[1], + 'waffle' + ); + assert.strictEqual( + mockCreatePlaygroundForCloneDocument.firstCall.args[2], + 'house' + ); + assert.strictEqual(namespaceUsed, 'waffle.house'); + }); - test('mdb.deleteDocumentFromTreeView deletes a document when the confirmation is cancelled', async () => { - const mockDocument = { - _id: 'pancakes', - time: { - $time: '12345', - }, - }; - let calledDelete = false; - const mockDataService = { - deleteOne: ( - namespace: string, - _id: any, - options: object, - callback: ( - error: Error | undefined, - result: { deletedCount: number } - ) => void - ) => { - calledDelete = true; - callback(undefined, { - deletedCount: 1, - }); - }, - } as Pick as unknown as DataService; - const documentTreeItem = new DocumentTreeItem( - mockDocument, - 'waffle.house', - 0, - mockDataService, - () => Promise.resolve() - ); - const result = await vscode.commands.executeCommand( - 'mdb.deleteDocumentFromTreeView', - documentTreeItem - ); - assert.strictEqual(result, false); - assert.strictEqual(calledDelete, false); - }); + test('mdb.insertDocumentFromTreeView opens a playground with an insert document template', async () => { + const collectionTreeItem = new CollectionTreeItem( + { + name: 'pineapple', + type: CollectionTypes.collection, + }, + 'plants', + {}, + false, + false, + null + ); + const mockCreatePlaygroundForInsertDocument = sinon.fake(); + sinon.replace( + mdbTestExtension.testExtensionController._playgroundController, + 'createPlaygroundForInsertDocument', + mockCreatePlaygroundForInsertDocument + ); + await vscode.commands.executeCommand( + 'mdb.insertDocumentFromTreeView', + collectionTreeItem + ); + assert.strictEqual( + mockCreatePlaygroundForInsertDocument.calledOnce, + true + ); + assert.strictEqual( + mockCreatePlaygroundForInsertDocument.firstCall.args[0], + 'plants' + ); + assert.strictEqual( + mockCreatePlaygroundForInsertDocument.firstCall.args[1], + 'pineapple' + ); + }); - test('mdb.deleteDocumentFromTreeView deletes a document after confirmation', async () => { - fakeShowInformationMessage.resolves('Yes'); + test('mdb.deleteDocumentFromTreeView deletes a document when the confirmation is cancelled', async () => { + const mockDocument = { + _id: 'pancakes', + time: { + $time: '12345', + }, + }; + let calledDelete = false; + const mockDataService = { + deleteOne: ( + namespace: string, + _id: any, + options: object, + callback: ( + error: Error | undefined, + result: { deletedCount: number } + ) => void + ) => { + calledDelete = true; + callback(undefined, { + deletedCount: 1, + }); + }, + } as Pick as unknown as DataService; + const documentTreeItem = new DocumentTreeItem( + mockDocument, + 'waffle.house', + 0, + mockDataService, + () => Promise.resolve() + ); + const result = await vscode.commands.executeCommand( + 'mdb.deleteDocumentFromTreeView', + documentTreeItem + ); + assert.strictEqual(result, false); + assert.strictEqual(calledDelete, false); + }); - const mockDocument = { - _id: 'pancakes', - time: { - $time: '12345', - }, - }; - let namespaceUsed = ''; - let _idUsed; - const mockDataService = { - deleteOne: ( - namespace: string, - query: any, - options: object, - callback: ( - error: Error | undefined, - result: { deletedCount: number } - ) => void - ) => { - _idUsed = query; - namespaceUsed = namespace; - callback(undefined, { - deletedCount: 1, - }); - }, - } as Pick as unknown as DataService; - const documentTreeItem = new DocumentTreeItem( - mockDocument, - 'waffle.house', - 0, - mockDataService, - () => Promise.resolve() - ); - const result = await vscode.commands.executeCommand( - 'mdb.deleteDocumentFromTreeView', - documentTreeItem - ); - assert.deepStrictEqual(_idUsed, { - _id: 'pancakes', - }); - assert.strictEqual(namespaceUsed, 'waffle.house'); - assert.strictEqual(result, true); + test('mdb.deleteDocumentFromTreeView deletes a document after confirmation', async () => { + fakeShowInformationMessage.resolves('Yes'); + + const mockDocument = { + _id: 'pancakes', + time: { + $time: '12345', + }, + }; + let namespaceUsed = ''; + let _idUsed; + const mockDataService = { + deleteOne: ( + namespace: string, + query: any, + options: object, + callback: ( + error: Error | undefined, + result: { deletedCount: number } + ) => void + ) => { + _idUsed = query; + namespaceUsed = namespace; + callback(undefined, { + deletedCount: 1, + }); + }, + } as Pick as unknown as DataService; + const documentTreeItem = new DocumentTreeItem( + mockDocument, + 'waffle.house', + 0, + mockDataService, + () => Promise.resolve() + ); + const result = await vscode.commands.executeCommand( + 'mdb.deleteDocumentFromTreeView', + documentTreeItem + ); + assert.deepStrictEqual(_idUsed, { + _id: 'pancakes', }); + assert.strictEqual(namespaceUsed, 'waffle.house'); + assert.strictEqual(result, true); + }); - suite( - 'when a user hasnt been shown the initial overview page yet and they have no connections saved', - () => { - let mockVSCodeExecuteCommand: SinonSpy; - let mockStorageControllerUpdate: SinonSpy; - - beforeEach(() => { - mockVSCodeExecuteCommand = sinon.fake.resolves(undefined); - sinon.replace( - vscode.commands, - 'executeCommand', - mockVSCodeExecuteCommand - ); - sinon.replace( - mdbTestExtension.testExtensionController._storageController, - 'get', - sinon.fake.returns(false) - ); - sinon.replace( - mdbTestExtension.testExtensionController._storageController, - 'hasSavedConnections', - sinon.fake.returns(false) - ); - - mockStorageControllerUpdate = sinon.fake.resolves(undefined); - sinon.replace( - mdbTestExtension.testExtensionController._storageController, - 'update', - mockStorageControllerUpdate - ); - - void mdbTestExtension.testExtensionController.showOverviewPageIfRecentlyInstalled(); - }); + suite( + 'when a user hasnt been shown the initial overview page yet and they have no connections saved', + () => { + let mockVSCodeExecuteCommand: SinonSpy; + let mockStorageControllerUpdate: SinonSpy; - afterEach(() => { - sinon.restore(); - }); + beforeEach(() => { + mockVSCodeExecuteCommand = sinon.fake.resolves(undefined); + sinon.replace( + vscode.commands, + 'executeCommand', + mockVSCodeExecuteCommand + ); + sinon.replace( + mdbTestExtension.testExtensionController._storageController, + 'get', + sinon.fake.returns(false) + ); + sinon.replace( + mdbTestExtension.testExtensionController._storageController, + 'hasSavedConnections', + sinon.fake.returns(false) + ); - test('they are shown the overview page', () => { - assert(mockVSCodeExecuteCommand.called); - assert.strictEqual( - mockVSCodeExecuteCommand.firstCall.args[0], - 'mdb.openOverviewPage' - ); - assert.strictEqual( - mockVSCodeExecuteCommand.firstCall.args[0], - EXTENSION_COMMANDS.MDB_OPEN_OVERVIEW_PAGE - ); - }); + mockStorageControllerUpdate = sinon.fake.resolves(undefined); + sinon.replace( + mdbTestExtension.testExtensionController._storageController, + 'update', + mockStorageControllerUpdate + ); - test("it sets that they've been shown the overview page", () => { - assert(mockStorageControllerUpdate.called); - assert.strictEqual( - mockStorageControllerUpdate.firstCall.args[0], - StorageVariables.GLOBAL_HAS_BEEN_SHOWN_INITIAL_VIEW - ); - assert.strictEqual( - mockStorageControllerUpdate.firstCall.args[0], - 'GLOBAL_HAS_BEEN_SHOWN_INITIAL_VIEW' - ); - assert.strictEqual( - mockStorageControllerUpdate.firstCall.args[1], - true - ); - }); - } - ); - - suite( - 'when a user hasnt been shown the initial overview page yet and they have connections saved', - () => { - let mockVSCodeExecuteCommand: SinonSpy; - let mockStorageControllerUpdate: SinonSpy; - - beforeEach(() => { - mockVSCodeExecuteCommand = sinon.fake.resolves(undefined); - sinon.replace( - vscode.commands, - 'executeCommand', - mockVSCodeExecuteCommand - ); - sinon.replace( - mdbTestExtension.testExtensionController._storageController, - 'get', - sinon.fake.returns(undefined) - ); - sinon.replace( - mdbTestExtension.testExtensionController._storageController, - 'hasSavedConnections', - sinon.fake.returns(true) - ); - mockStorageControllerUpdate = sinon.fake.resolves(undefined); - sinon.replace( - mdbTestExtension.testExtensionController._storageController, - 'update', - mockStorageControllerUpdate - ); - - void mdbTestExtension.testExtensionController.showOverviewPageIfRecentlyInstalled(); - }); + void mdbTestExtension.testExtensionController.showOverviewPageIfRecentlyInstalled(); + }); - test('they are not shown the overview page', () => { - assert(!mockVSCodeExecuteCommand.called); - }); + afterEach(() => { + sinon.restore(); + }); - test("it sets that they've been shown the overview page", () => { - assert(mockStorageControllerUpdate.called); - assert.strictEqual( - mockStorageControllerUpdate.firstCall.args[0], - StorageVariables.GLOBAL_HAS_BEEN_SHOWN_INITIAL_VIEW - ); - assert.strictEqual( - mockStorageControllerUpdate.firstCall.args[0], - 'GLOBAL_HAS_BEEN_SHOWN_INITIAL_VIEW' - ); - assert.strictEqual( - mockStorageControllerUpdate.firstCall.args[1], - true - ); - }); - } - ); + test('they are shown the overview page', () => { + assert(mockVSCodeExecuteCommand.called); + assert.strictEqual( + mockVSCodeExecuteCommand.firstCall.args[0], + 'mdb.openOverviewPage' + ); + assert.strictEqual( + mockVSCodeExecuteCommand.firstCall.args[0], + EXTENSION_COMMANDS.MDB_OPEN_OVERVIEW_PAGE + ); + }); - suite('when a user has been shown the initial overview page', () => { + test("it sets that they've been shown the overview page", () => { + assert(mockStorageControllerUpdate.called); + assert.strictEqual( + mockStorageControllerUpdate.firstCall.args[0], + StorageVariables.GLOBAL_HAS_BEEN_SHOWN_INITIAL_VIEW + ); + assert.strictEqual( + mockStorageControllerUpdate.firstCall.args[0], + 'GLOBAL_HAS_BEEN_SHOWN_INITIAL_VIEW' + ); + assert.strictEqual( + mockStorageControllerUpdate.firstCall.args[1], + true + ); + }); + } + ); + + suite( + 'when a user hasnt been shown the initial overview page yet and they have connections saved', + () => { let mockVSCodeExecuteCommand: SinonSpy; + let mockStorageControllerUpdate: SinonSpy; beforeEach(() => { + mockVSCodeExecuteCommand = sinon.fake.resolves(undefined); + sinon.replace( + vscode.commands, + 'executeCommand', + mockVSCodeExecuteCommand + ); sinon.replace( mdbTestExtension.testExtensionController._storageController, 'get', + sinon.fake.returns(undefined) + ); + sinon.replace( + mdbTestExtension.testExtensionController._storageController, + 'hasSavedConnections', sinon.fake.returns(true) ); - mockVSCodeExecuteCommand = sinon.fake.resolves(undefined); + mockStorageControllerUpdate = sinon.fake.resolves(undefined); sinon.replace( - vscode.commands, - 'executeCommand', - mockVSCodeExecuteCommand + mdbTestExtension.testExtensionController._storageController, + 'update', + mockStorageControllerUpdate ); void mdbTestExtension.testExtensionController.showOverviewPageIfRecentlyInstalled(); @@ -1634,145 +1664,47 @@ suite('MDBExtensionController Test Suite', function () { test('they are not shown the overview page', () => { assert(!mockVSCodeExecuteCommand.called); }); - }); - }); - }); - - suite('with real text document', () => { - beforeEach(() => { - sinon.stub(vscode.window, 'showInformationMessage'); - sinon.stub(vscode.window, 'showErrorMessage'); - const mockActiveConnectionId = sinon.fake.returns('tasty_sandwhich'); - sinon.replace( - mdbTestExtension.testExtensionController._connectionController, - 'getActiveConnectionId', - mockActiveConnectionId - ); - }); - - afterEach(async () => { - await vscode.commands.executeCommand( - 'workbench.action.closeActiveEditor' - ); - sinon.restore(); - }); - - test('mdb.addDatabase should create a MongoDB playground with create collection template', async () => { - const mockTreeItem = new ConnectionTreeItem( - 'tasty_sandwhich', - vscode.TreeItemCollapsibleState.None, - false, - mdbTestExtension.testExtensionController._connectionController, - false, - {} - ); - await vscode.commands.executeCommand('mdb.addDatabase', mockTreeItem); - - const activeTextEditor = - mdbTestExtension.testExtensionController._playgroundController - ._activeTextEditor; - assert.strictEqual(activeTextEditor?.document.languageId, 'javascript'); - assert.strictEqual(activeTextEditor?.document.uri.scheme, 'untitled'); - - const content = activeTextEditor.document.getText(); - assert(content.includes('// Create a new database.')); - assert(content.includes('NEW_DATABASE_NAME')); - assert(content.includes('NEW_COLLECTION_NAME')); - }); - - test('mdb.addCollection should create a MongoDB playground with create collection template', async () => { - const mockTreeItem = new DatabaseTreeItem( - 'iceCreamDB', - {}, - false, - false, - {} - ); - await vscode.commands.executeCommand('mdb.addCollection', mockTreeItem); - - const activeTextEditor = - mdbTestExtension.testExtensionController._playgroundController - ._activeTextEditor; - assert.strictEqual(activeTextEditor?.document.languageId, 'javascript'); - assert.strictEqual(activeTextEditor?.document.uri.scheme, 'untitled'); - - const content = activeTextEditor.document.getText(); - assert(content.includes('// The current database to use.')); - assert(content.includes('iceCreamDB')); - assert(content.includes('NEW_COLLECTION_NAME')); - assert(!content.includes('time-series')); - }); - - test('mdb.searchForDocuments should create a MongoDB playground with search template', async () => { - await vscode.commands.executeCommand('mdb.searchForDocuments', { - databaseName: 'dbbbbbName', - collectionName: 'colllllllllName', - }); - - const activeTextEditor = - mdbTestExtension.testExtensionController._playgroundController - ._activeTextEditor; - assert.strictEqual(activeTextEditor?.document.languageId, 'javascript'); - assert.strictEqual(activeTextEditor?.document.uri.scheme, 'untitled'); - - const content = activeTextEditor.document.getText(); - assert( - content.includes('Search for documents in the current collection.') - ); - assert(content.includes('dbbbbbName')); - assert(content.includes('colllllllllName')); - }); - test('mdb.createIndexFromTreeView should create a MongoDB playground with index template', async () => { - await vscode.commands.executeCommand('mdb.createIndexFromTreeView', { - databaseName: 'dbbbbbName', - collectionName: 'colllllllllName', - }); + test("it sets that they've been shown the overview page", () => { + assert(mockStorageControllerUpdate.called); + assert.strictEqual( + mockStorageControllerUpdate.firstCall.args[0], + StorageVariables.GLOBAL_HAS_BEEN_SHOWN_INITIAL_VIEW + ); + assert.strictEqual( + mockStorageControllerUpdate.firstCall.args[0], + 'GLOBAL_HAS_BEEN_SHOWN_INITIAL_VIEW' + ); + assert.strictEqual( + mockStorageControllerUpdate.firstCall.args[1], + true + ); + }); + } + ); - const activeTextEditor = - mdbTestExtension.testExtensionController._playgroundController - ._activeTextEditor; - assert.strictEqual(activeTextEditor?.document.languageId, 'javascript'); - assert.strictEqual(activeTextEditor?.document.uri.scheme, 'untitled'); + suite('when a user has been shown the initial overview page', () => { + let mockVSCodeExecuteCommand: SinonSpy; - const content = activeTextEditor.document.getText(); - assert(content.includes('Create a new index in the collection.')); - assert(content.includes('dbbbbbName')); - assert(content.includes('colllllllllName')); - }); + beforeEach(() => { + sinon.replace( + mdbTestExtension.testExtensionController._storageController, + 'get', + sinon.fake.returns(true) + ); + mockVSCodeExecuteCommand = sinon.fake.resolves(undefined); + sinon.replace( + vscode.commands, + 'executeCommand', + mockVSCodeExecuteCommand + ); - test('mdb.createPlayground should create a MongoDB playground with default template', async () => { - const mockGetConfiguration = sinon.fake.returns({ - get: () => true, + void mdbTestExtension.testExtensionController.showOverviewPageIfRecentlyInstalled(); }); - sinon.replace(vscode.workspace, 'getConfiguration', mockGetConfiguration); - await vscode.commands.executeCommand('mdb.createPlayground'); - - const activeTextEditor = - mdbTestExtension.testExtensionController._playgroundController - ._activeTextEditor; - assert.strictEqual(activeTextEditor?.document.languageId, 'javascript'); - assert.strictEqual(activeTextEditor?.document.uri.scheme, 'untitled'); - - const content = activeTextEditor.document.getText(); - assert(content.includes('// MongoDB Playground')); - }); - test('mdb.createPlayground command should create a MongoDB playground without template', async () => { - const mockGetConfiguration = sinon.fake.returns({ - get: () => false, + test('they are not shown the overview page', () => { + assert(!mockVSCodeExecuteCommand.called); }); - sinon.replace(vscode.workspace, 'getConfiguration', mockGetConfiguration); - await vscode.commands.executeCommand('mdb.createPlayground'); - - const activeTextEditor = - mdbTestExtension.testExtensionController._playgroundController - ._activeTextEditor; - assert.strictEqual(activeTextEditor?.document.languageId, 'javascript'); - assert.strictEqual(activeTextEditor?.document.uri.scheme, 'untitled'); - - const content = activeTextEditor.document.getText(); - assert.strictEqual(content, ''); }); }); }); From 12c4bbcc1229b474b3fe97e54d379dd65fe2123a Mon Sep 17 00:00:00 2001 From: Alena Khineika Date: Wed, 1 Mar 2023 17:26:49 +0100 Subject: [PATCH 32/36] test: fake vscode messages and get rid of some any --- src/editors/playgroundController.ts | 4 +- src/explorer/collectionTreeItem.ts | 2 + src/explorer/documentListTreeItem.ts | 2 + src/explorer/fieldTreeItem.ts | 2 + src/explorer/schemaTreeItem.ts | 2 + src/language/README.md | 5 +- src/language/languageServerController.ts | 4 - .../suite/commands/launchMongoShell.test.ts | 97 +-- src/test/suite/connectionController.test.ts | 95 +-- .../activeConnectionCodeLensProvider.test.ts | 52 +- ...ollectionDocumentsCodeLensProvider.test.ts | 7 - ...collectionDocumentsOperationsStore.test.ts | 11 +- .../collectionDocumentsProvider.test.ts | 166 ++-- .../suite/editors/documentStringFixtures.ts | 67 -- .../editDocumentCodeLensProvider.test.ts | 55 +- .../suite/editors/editorsController.test.ts | 16 +- .../exportToLanguageCodeLensProvider.test.ts | 10 - .../editors/mongoDBDocumentService.test.ts | 89 +- .../editors/playgroundController.test.ts | 398 ++++----- .../editors/playgroundResultProvider.test.ts | 73 +- ...aygroundSelectedCodeActionProvider.test.ts | 26 +- .../suite/explorer/collectionTreeItem.test.ts | 12 +- .../explorer/documentListTreeItem.test.ts | 36 +- .../suite/explorer/documentTreeItem.test.ts | 6 +- .../suite/explorer/explorerController.test.ts | 9 +- src/test/suite/explorer/fieldTreeItem.test.ts | 8 +- .../suite/explorer/indexListTreeItem.test.ts | 17 +- src/test/suite/explorer/indexTreeItem.test.ts | 5 +- .../suite/explorer/schemaTreeItem.test.ts | 20 +- src/test/suite/extension.test.ts | 2 - src/test/suite/index.ts | 6 +- .../language/languageServerController.test.ts | 20 +- .../suite/language/mongoDBService.test.ts | 26 +- src/test/suite/mdbExtensionController.test.ts | 761 +++++++++--------- .../suite/snippets/stageAutocompleter.test.ts | 2 +- .../suite/storage/storageController.test.ts | 56 +- src/test/suite/stubbableMdbExtension.ts | 4 +- src/test/suite/stubs.ts | 98 ++- .../telemetry/connectionTelemetry.test.ts | 16 +- .../suite/telemetry/telemetryService.test.ts | 109 ++- src/test/suite/utils/linkHelper.test.ts | 12 +- .../connect-form/general-tab/host.test.tsx | 9 +- .../suite/views/webviewController.test.ts | 122 +-- 43 files changed, 1224 insertions(+), 1315 deletions(-) delete mode 100644 src/test/suite/editors/documentStringFixtures.ts diff --git a/src/editors/playgroundController.ts b/src/editors/playgroundController.ts index 5daa5939c..d347e4c52 100644 --- a/src/editors/playgroundController.ts +++ b/src/editors/playgroundController.ts @@ -598,7 +598,7 @@ export default class PlaygroundController { !isPlayground(this._activeTextEditor.document.uri) ) { void vscode.window.showErrorMessage( - "Please open a '.mongodb' playground file before running it." + 'Please open a MongoDB playground file before running it.' ); return Promise.resolve(false); @@ -616,7 +616,7 @@ export default class PlaygroundController { !isPlayground(this._activeTextEditor.document.uri) ) { void vscode.window.showErrorMessage( - "Please open a '.mongodb' playground file before running it." + 'Please open a MongoDB playground file before running it.' ); return Promise.resolve(false); diff --git a/src/explorer/collectionTreeItem.ts b/src/explorer/collectionTreeItem.ts index e88fce3ae..60242a1bd 100644 --- a/src/explorer/collectionTreeItem.ts +++ b/src/explorer/collectionTreeItem.ts @@ -83,6 +83,8 @@ export default class CollectionTreeItem isDropped = false; + iconPath: { light: string; dark: string }; + constructor( collection: CollectionModelType, databaseName: string, diff --git a/src/explorer/documentListTreeItem.ts b/src/explorer/documentListTreeItem.ts index 4c7d8e06a..6b71c97cb 100644 --- a/src/explorer/documentListTreeItem.ts +++ b/src/explorer/documentListTreeItem.ts @@ -108,6 +108,8 @@ export default class DocumentListTreeItem isExpanded: boolean; + iconPath: { light: string; dark: string }; + constructor( collectionName: string, databaseName: string, diff --git a/src/explorer/fieldTreeItem.ts b/src/explorer/fieldTreeItem.ts index 20414c9e8..2e5b61e3b 100644 --- a/src/explorer/fieldTreeItem.ts +++ b/src/explorer/fieldTreeItem.ts @@ -173,6 +173,8 @@ export default class FieldTreeItem isExpanded: boolean; + iconPath: string | { light: string; dark: string }; + constructor( field: SchemaFieldType, isExpanded: boolean, diff --git a/src/explorer/schemaTreeItem.ts b/src/explorer/schemaTreeItem.ts index 3bb3c7e75..76c0a3c4d 100644 --- a/src/explorer/schemaTreeItem.ts +++ b/src/explorer/schemaTreeItem.ts @@ -59,6 +59,8 @@ export default class SchemaTreeItem hasClickedShowMoreFields: boolean; hasMoreFieldsToShow: boolean; + iconPath: { light: string; dark: string }; + constructor( collectionName: string, databaseName: string, diff --git a/src/language/README.md b/src/language/README.md index f9262fda4..dbbc3df1e 100644 --- a/src/language/README.md +++ b/src/language/README.md @@ -8,10 +8,7 @@ The language server protocol [(LSP)](https://microsoft.github.io/language-server-protocol/specification) is mainly used as a tool between the editor (the client) and a language smartness provider (the server) to integrate features like autocomplete, go to definition, find all references, list document symbols, signature help and much more. You can find the complete list of supported features in [the official documentation](https://code.visualstudio.com/api/language-extensions/language-server-extension-guide). -We can also extend the mongodb language server and client with custom methods to leverage it as a background worker. Because the language server is a separate JSON RPC enabled process, we can add RPC definitions for: - -- Execute playground .mongodb scripts with mongosh repl evaluator thingie -- Schema analysis and caching +We extend the mongodb language server and client with custom methods to leverage it as a background worker. ### Debugging diff --git a/src/language/languageServerController.ts b/src/language/languageServerController.ts index 749d7697b..8c00dedd9 100644 --- a/src/language/languageServerController.ts +++ b/src/language/languageServerController.ts @@ -116,10 +116,6 @@ export default class LanguageServerController { } deactivate(): void { - if (!this._client) { - return undefined; - } - // Stop the language server void this._client.stop(); } diff --git a/src/test/suite/commands/launchMongoShell.test.ts b/src/test/suite/commands/launchMongoShell.test.ts index 9352f27a3..301143dbe 100644 --- a/src/test/suite/commands/launchMongoShell.test.ts +++ b/src/test/suite/commands/launchMongoShell.test.ts @@ -1,72 +1,67 @@ import * as vscode from 'vscode'; -import * as sinon from 'sinon'; import assert from 'assert'; import { beforeEach, afterEach } from 'mocha'; +import sinon from 'sinon'; +import type { SinonSpy, SinonStub } from 'sinon'; import launchMongoShell from '../../../commands/launchMongoShell'; import { mdbTestExtension } from '../stubbableMdbExtension'; suite('Commands Test Suite', () => { - void vscode.window.showInformationMessage('Starting tests...'); - - const mockConnectionController = + const testConnectionController = mdbTestExtension.testExtensionController._connectionController; - const sandbox = sinon.createSandbox(); - let fakeShowErrorMessage: any; - let fakeGetMongoClientConnectionOptions: any; - let fakeIsCurrentlyConnected: any; - let createTerminalStub: any; - let fakeSendTerminalText: any; + let showErrorMessageStub: SinonStub; + let fakeGetMongoClientConnectionOptions: SinonStub; + let fakeIsCurrentlyConnected: SinonStub; + let createTerminalStub: SinonStub; + let sendTextStub: SinonSpy; beforeEach(() => { - sandbox.stub(vscode.window, 'showInformationMessage'); - - fakeShowErrorMessage = sandbox.stub(vscode.window, 'showErrorMessage'); - fakeGetMongoClientConnectionOptions = sandbox.stub( - mockConnectionController, + sinon.stub(vscode.window, 'showInformationMessage'); + showErrorMessageStub = sinon.stub(vscode.window, 'showErrorMessage'); + fakeGetMongoClientConnectionOptions = sinon.stub( + testConnectionController, 'getMongoClientConnectionOptions' ); - - fakeIsCurrentlyConnected = sandbox.stub( - mockConnectionController, + fakeIsCurrentlyConnected = sinon.stub( + testConnectionController, 'isCurrentlyConnected' ); - - createTerminalStub = sandbox.stub(); - fakeSendTerminalText = sandbox.stub(); - + createTerminalStub = sinon.stub(vscode.window, 'createTerminal'); + sendTextStub = sinon.stub(); createTerminalStub.returns({ - sendText: fakeSendTerminalText, + sendText: sendTextStub, show: () => {}, }); - sandbox.replace(vscode.window, 'createTerminal', createTerminalStub); }); afterEach(async () => { - sandbox.restore(); sinon.restore(); - await mockConnectionController.disconnect(); - mockConnectionController.clearAllConnections(); + await testConnectionController.disconnect(); + testConnectionController.clearAllConnections(); }); suite('bash env shell', () => { + const sandbox = sinon.createSandbox(); + beforeEach(() => { sandbox.replaceGetter(vscode.env, 'shell', () => 'bash'); }); - test('openMongoDBShell should display an error message when not connected', async () => { - const errorMessage = - 'You need to be connected before launching the MongoDB Shell.'; - - fakeShowErrorMessage.resolves(errorMessage); + afterEach(() => { + sandbox.restore(); + }); - try { - await launchMongoShell(mockConnectionController); - } catch (error) { - sinon.assert.calledWith(fakeShowErrorMessage, errorMessage); - } + test('openMongoDBShell should show an error message when not connected', async () => { + const expectedMessage = + 'You need to be connected before launching the MongoDB Shell.'; + await launchMongoShell(testConnectionController); + assert( + showErrorMessageStub.firstCall.args[0] === expectedMessage, + `Expected the error message "${expectedMessage}" to be shown when attempting to add a database while disconnecting, found "${showErrorMessageStub.firstCall.args[0]}"` + ); }); test('openMongoDBShell should open a terminal with the active connection driver url', async () => { @@ -79,29 +74,33 @@ suite('Commands Test Suite', () => { }); fakeIsCurrentlyConnected.returns(true); - await launchMongoShell(mockConnectionController); + await launchMongoShell(testConnectionController); assert(createTerminalStub.called); const terminalOptions: vscode.TerminalOptions = createTerminalStub.firstCall.args[0]; - assert( terminalOptions.env?.MDB_CONNECTION_STRING === expectedDriverUrl, `Expected open terminal to set shell arg as driver url "${expectedDriverUrl}" found "${terminalOptions.env?.MDB_CONNECTION_STRING}"` ); - const shellCommandText = fakeSendTerminalText.firstCall.args[0]; - + const shellCommandText = sendTextStub.firstCall.args[0]; assert.strictEqual(shellCommandText, 'mongosh $MDB_CONNECTION_STRING;'); }); }); suite('Windows powershell env shell', () => { + const sandbox = sinon.createSandbox(); + beforeEach(() => { sandbox.replaceGetter(vscode.env, 'shell', () => 'powershell.exe'); }); + afterEach(() => { + sandbox.restore(); + }); + test('powershell openMongoDBShell should open a terminal with the active connection driver url', async () => { const expectedDriverUrl = 'mongodb://localhost:27018/?readPreference=primary&ssl=false'; @@ -113,19 +112,17 @@ suite('Commands Test Suite', () => { fakeIsCurrentlyConnected.returns(true); - await launchMongoShell(mockConnectionController); - + await launchMongoShell(testConnectionController); assert(createTerminalStub.called); const terminalOptions: vscode.TerminalOptions = createTerminalStub.firstCall.args[0]; - assert( terminalOptions.env?.MDB_CONNECTION_STRING === expectedDriverUrl, `Expected open terminal to set shell arg as driver url "${expectedDriverUrl}" found "${terminalOptions.env?.MDB_CONNECTION_STRING}"` ); - const shellCommandText = fakeSendTerminalText.firstCall.args[0]; + const shellCommandText = sendTextStub.firstCall.args[0]; assert( shellCommandText.includes('$Env:MDB_CONNECTION_STRING'), `Expected sendText to terminal (${shellCommandText}) to use powershell env variable syntax` @@ -134,10 +131,16 @@ suite('Commands Test Suite', () => { }); suite('Windows cmd env shell', () => { + const sandbox = sinon.createSandbox(); + beforeEach(() => { sandbox.replaceGetter(vscode.env, 'shell', () => 'cmd.exe'); }); + afterEach(() => { + sandbox.restore(); + }); + test('windows cmd openMongoDBShell should open a terminal with the active connection driver url', async () => { const expectedDriverUrl = 'mongodb://localhost:27018/?readPreference=primary&ssl=false'; @@ -149,13 +152,11 @@ suite('Commands Test Suite', () => { fakeIsCurrentlyConnected.returns(true); - await launchMongoShell(mockConnectionController); - + await launchMongoShell(testConnectionController); assert(createTerminalStub.called); const terminalOptions: vscode.TerminalOptions = createTerminalStub.firstCall.args[0]; - assert( terminalOptions.env?.MDB_CONNECTION_STRING === expectedDriverUrl, `Expected open terminal to set shell arg as driver url "${expectedDriverUrl}" found "${terminalOptions.env?.MDB_CONNECTION_STRING}"` diff --git a/src/test/suite/connectionController.test.ts b/src/test/suite/connectionController.test.ts index 9a87fdcbf..64d603200 100644 --- a/src/test/suite/connectionController.test.ts +++ b/src/test/suite/connectionController.test.ts @@ -1,4 +1,5 @@ -import * as sinon from 'sinon'; +import sinon from 'sinon'; +import type { SinonStub } from 'sinon'; import * as util from 'util'; import * as vscode from 'vscode'; import { afterEach, beforeEach } from 'mocha'; @@ -20,7 +21,7 @@ import SSH_TUNNEL_TYPES from '../../views/webview-app/connection-model/constants import SSL_METHODS from '../../views/webview-app/connection-model/constants/ssl-methods'; import { StatusView } from '../../views'; import TelemetryService from '../../telemetry/telemetryService'; -import { TestExtensionContext } from './stubs'; +import { ExtensionContextStub } from './stubs'; import { TEST_DATABASE_URI, TEST_DATABASE_URI_USER, @@ -39,32 +40,28 @@ const sleep = (ms: number): Promise => { suite('Connection Controller Test Suite', function () { this.timeout(5000); - const mockExtensionContext = new TestExtensionContext(); - const mockStorageController = new StorageController(mockExtensionContext); + const extensionContextStub = new ExtensionContextStub(); + const testStorageController = new StorageController(extensionContextStub); const testTelemetryService = new TelemetryService( - mockStorageController, - mockExtensionContext + testStorageController, + extensionContextStub ); const testConnectionController = new ConnectionController( - new StatusView(mockExtensionContext), - mockStorageController, + new StatusView(extensionContextStub), + testStorageController, testTelemetryService ); + let showErrorMessageStub: SinonStub; beforeEach(() => { - // Here we stub the showInformationMessage process because it is too much - // for the render process and leads to crashes while testing. - sinon.replace( - vscode.window, - 'showInformationMessage', - sinon.fake.resolves(true) - ); + sinon.stub(vscode.window, 'showInformationMessage'); + showErrorMessageStub = sinon.stub(vscode.window, 'showErrorMessage'); }); afterEach(async () => { // Reset our mock extension's state. - mockExtensionContext._workspaceState = {}; - mockExtensionContext._globalState = {}; + extensionContextStub._workspaceState = {}; + extensionContextStub._globalState = {}; await testConnectionController.disconnect(); testConnectionController.clearAllConnections(); @@ -127,33 +124,19 @@ suite('Connection Controller Test Suite', function () { test('"removeMongoDBConnection()" returns a reject promise when there is no active connection', async () => { const expectedMessage = 'No connections to remove.'; - const fakeVscodeErrorMessage = sinon.fake(); - - sinon.replace(vscode.window, 'showErrorMessage', fakeVscodeErrorMessage); - const successfullyRemovedMongoDBConnection = await testConnectionController.onRemoveMongoDBConnection(); - assert.strictEqual( - fakeVscodeErrorMessage.firstCall.args[0], - expectedMessage - ); + assert.strictEqual(showErrorMessageStub.firstCall.args[0], expectedMessage); assert.strictEqual(successfullyRemovedMongoDBConnection, false); }); test('"disconnect()" fails when there is no active connection', async () => { const expectedMessage = 'Unable to disconnect: no active connection.'; - const fakeVscodeErrorMessage = sinon.fake(); - - sinon.replace(vscode.window, 'showErrorMessage', fakeVscodeErrorMessage); - const successfullyDisconnected = await testConnectionController.disconnect(); - assert.strictEqual( - fakeVscodeErrorMessage.firstCall.args[0], - expectedMessage - ); + assert.strictEqual(showErrorMessageStub.firstCall.args[0], expectedMessage); assert.strictEqual(successfullyDisconnected, false); }); @@ -308,7 +291,7 @@ suite('Connection Controller Test Suite', function () { TEST_DATABASE_URI ); - const globalStoreConnections = mockStorageController.get( + const globalStoreConnections = testStorageController.get( StorageVariables.GLOBAL_SAVED_CONNECTIONS, StorageLocation.GLOBAL ); @@ -322,7 +305,7 @@ suite('Connection Controller Test Suite', function () { testDatabaseConnectionName ); - const workspaceStoreConnections = mockStorageController.get( + const workspaceStoreConnections = testStorageController.get( StorageVariables.WORKSPACE_SAVED_CONNECTIONS ); @@ -341,7 +324,7 @@ suite('Connection Controller Test Suite', function () { TEST_DATABASE_URI ); - const workspaceStoreConnections = mockStorageController.get( + const workspaceStoreConnections = testStorageController.get( StorageVariables.WORKSPACE_SAVED_CONNECTIONS, StorageLocation.WORKSPACE ); @@ -355,7 +338,7 @@ suite('Connection Controller Test Suite', function () { testDatabaseConnectionName ); - const globalStoreConnections = mockStorageController.get( + const globalStoreConnections = testStorageController.get( StorageVariables.GLOBAL_SAVED_CONNECTIONS, StorageLocation.GLOBAL ); @@ -392,7 +375,7 @@ suite('Connection Controller Test Suite', function () { TEST_DATABASE_URI ); - const workspaceStoreConnections = mockStorageController.get( + const workspaceStoreConnections = testStorageController.get( StorageVariables.WORKSPACE_SAVED_CONNECTIONS, StorageLocation.WORKSPACE ); @@ -461,14 +444,14 @@ suite('Connection Controller Test Suite', function () { ); const objectString = JSON.stringify(undefined); - const globalStoreConnections = mockStorageController.get( + const globalStoreConnections = testStorageController.get( StorageVariables.GLOBAL_SAVED_CONNECTIONS, StorageLocation.GLOBAL ); assert.strictEqual(JSON.stringify(globalStoreConnections), objectString); - const workspaceStoreConnections = mockStorageController.get( + const workspaceStoreConnections = testStorageController.get( StorageVariables.WORKSPACE_SAVED_CONNECTIONS, StorageLocation.WORKSPACE ); @@ -488,7 +471,7 @@ suite('Connection Controller Test Suite', function () { TEST_DATABASE_URI ); - const workspaceStoreConnections = mockStorageController.get( + const workspaceStoreConnections = testStorageController.get( StorageVariables.WORKSPACE_SAVED_CONNECTIONS, StorageLocation.WORKSPACE ); @@ -501,7 +484,7 @@ suite('Connection Controller Test Suite', function () { await testConnectionController.disconnect(); await testConnectionController.removeSavedConnection(connectionId); - const postWorkspaceStoreConnections = mockStorageController.get( + const postWorkspaceStoreConnections = testStorageController.get( StorageVariables.WORKSPACE_SAVED_CONNECTIONS, StorageLocation.WORKSPACE ); @@ -518,7 +501,7 @@ suite('Connection Controller Test Suite', function () { TEST_DATABASE_URI ); - const globalStoreConnections = mockStorageController.get( + const globalStoreConnections = testStorageController.get( StorageVariables.GLOBAL_SAVED_CONNECTIONS, StorageLocation.GLOBAL ); @@ -529,7 +512,7 @@ suite('Connection Controller Test Suite', function () { testConnectionController.getActiveConnectionId() || 'a'; await testConnectionController.removeSavedConnection(connectionId); - const postGlobalStoreConnections = mockStorageController.get( + const postGlobalStoreConnections = testStorageController.get( StorageVariables.GLOBAL_SAVED_CONNECTIONS, StorageLocation.GLOBAL ); @@ -549,7 +532,7 @@ suite('Connection Controller Test Suite', function () { TEST_DATABASE_URI ); - const workspaceStoreConnections = mockStorageController.get( + const workspaceStoreConnections = testStorageController.get( StorageVariables.WORKSPACE_SAVED_CONNECTIONS, StorageLocation.WORKSPACE ); @@ -558,10 +541,10 @@ suite('Connection Controller Test Suite', function () { const connectionId = testConnectionController.getActiveConnectionId() || 'zz'; - const mockInputBoxResolves = sinon.stub(); - mockInputBoxResolves.onCall(0).resolves('new connection name'); - sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); + const inputBoxResolvesStub = sinon.stub(); + inputBoxResolvesStub.onCall(0).resolves('new connection name'); + sinon.replace(vscode.window, 'showInputBox', inputBoxResolvesStub); const renameSuccess = await testConnectionController.renameConnection( connectionId @@ -618,10 +601,9 @@ suite('Connection Controller Test Suite', function () { assert.strictEqual(connections[connectionIds[0]].name, 'localhost:27018'); assert.strictEqual(connections[connectionIds[1]].name, 'localhost:27018'); - const mockInputBoxResolves = sinon.stub(); - - mockInputBoxResolves.onCall(0).resolves('Lynx'); - sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); + const inputBoxResolvesStub = sinon.stub(); + inputBoxResolvesStub.onCall(0).resolves('Lynx'); + sinon.replace(vscode.window, 'showInputBox', inputBoxResolvesStub); const renameSuccess = await testConnectionController.renameConnection( connectionIds[0] @@ -927,7 +909,7 @@ suite('Connection Controller Test Suite', function () { sshTunnelPort: 22, }, }; - const mockSaveConnection: any = sinon.fake.resolves({ + const mockSaveConnection = sinon.fake.resolves({ id: 'fb210b47-f85d-4823-8552-aa6d7825156b', }); @@ -971,7 +953,7 @@ suite('Connection Controller Test Suite', function () { sshTunnelPort: 22, }, }; - const mockMigratePreviouslySavedConnection: any = sinon.fake.resolves({ + const mockMigratePreviouslySavedConnection = sinon.fake.resolves({ id: '1d700f37-ba57-4568-9552-0ea23effea89', name: 'localhost:27017', storageLocation: 'GLOBAL', @@ -1013,7 +995,7 @@ suite('Connection Controller Test Suite', function () { assert.strictEqual(connections.length, 1); - const mockMigratePreviouslySavedConnection: any = sinon.fake(); + const mockMigratePreviouslySavedConnection = sinon.fake(); sinon.replace( testConnectionController, @@ -1031,10 +1013,9 @@ suite('Connection Controller Test Suite', function () { }); test('addNewConnectionStringAndConnect saves connection without secrets to the global storage', async () => { - const mockConnect: any = sinon.fake.resolves({ + const mockConnect = sinon.fake.resolves({ successfullyConnected: true, }); - sinon.replace(testConnectionController, '_connect', mockConnect); await vscode.workspace diff --git a/src/test/suite/editors/activeConnectionCodeLensProvider.test.ts b/src/test/suite/editors/activeConnectionCodeLensProvider.test.ts index 4ad2772d9..2f26a9519 100644 --- a/src/test/suite/editors/activeConnectionCodeLensProvider.test.ts +++ b/src/test/suite/editors/activeConnectionCodeLensProvider.test.ts @@ -8,39 +8,39 @@ import ActiveConnectionCodeLensProvider from '../../../editors/activeConnectionC import ConnectionController from '../../../connectionController'; import { StatusView } from '../../../views'; import { StorageController } from '../../../storage'; -import { TestExtensionContext } from '../stubs'; +import { ExtensionContextStub } from '../stubs'; import TelemetryService from '../../../telemetry/telemetryService'; const expect = chai.expect; suite('Active Connection CodeLens Provider Test Suite', () => { - const mockExtensionContext = new TestExtensionContext(); - const mockStorageController = new StorageController(mockExtensionContext); + const extensionContextStub = new ExtensionContextStub(); + const testStorageController = new StorageController(extensionContextStub); const testTelemetryService = new TelemetryService( - mockStorageController, - mockExtensionContext + testStorageController, + extensionContextStub ); - const testStatusView = new StatusView(mockExtensionContext); + const testStatusView = new StatusView(extensionContextStub); suite('the MongoDB playground in JS', () => { suite('user is not connected', () => { const testConnectionController = new ConnectionController( testStatusView, - mockStorageController, + testStorageController, testTelemetryService ); const testCodeLensProvider = new ActiveConnectionCodeLensProvider( testConnectionController ); - const mockShowQuickPick = sinon.fake(); + const testShowQuickPick = sinon.fake(); beforeEach(() => { testCodeLensProvider.setActiveTextEditor( vscode.window.activeTextEditor ); - sinon.replace(vscode.window, 'showQuickPick', mockShowQuickPick); - const mockIsPlayground = sinon.fake.returns(true); - sinon.replace(testCodeLensProvider, 'isPlayground', mockIsPlayground); + sinon.replace(vscode.window, 'showQuickPick', testShowQuickPick); + const testIsPlayground = sinon.fake.returns(true); + sinon.replace(testCodeLensProvider, 'isPlayground', testIsPlayground); }); afterEach(() => { @@ -63,7 +63,7 @@ suite('Active Connection CodeLens Provider Test Suite', () => { suite('user is connected', () => { const testConnectionController = new ConnectionController( testStatusView, - mockStorageController, + testStorageController, testTelemetryService ); const testCodeLensProvider = new ActiveConnectionCodeLensProvider( @@ -82,12 +82,12 @@ suite('Active Connection CodeLens Provider Test Suite', () => { genuineMongoDB: {}, host: {}, } as unknown as Awaited>); - const mockActiveDataService = { + const testActiveDataService = { find: findStub, instance: instanceStub, } as Pick as unknown as DataService; - testConnectionController.setActiveDataService(mockActiveDataService); + testConnectionController.setActiveDataService(testActiveDataService); beforeEach(() => { testCodeLensProvider.setActiveTextEditor( @@ -98,8 +98,8 @@ suite('Active Connection CodeLens Provider Test Suite', () => { 'getActiveConnectionName', sinon.fake.returns('fakeName') ); - const mockIsPlayground = sinon.fake.returns(true); - sinon.replace(testCodeLensProvider, 'isPlayground', mockIsPlayground); + const testIsPlayground = sinon.fake.returns(true); + sinon.replace(testCodeLensProvider, 'isPlayground', testIsPlayground); }); afterEach(() => { @@ -127,18 +127,18 @@ suite('Active Connection CodeLens Provider Test Suite', () => { suite('user is not connected', () => { const testConnectionController = new ConnectionController( testStatusView, - mockStorageController, + testStorageController, testTelemetryService ); const testCodeLensProvider = new ActiveConnectionCodeLensProvider( testConnectionController ); - const mockShowQuickPick = sinon.fake(); + const testShowQuickPick = sinon.fake(); beforeEach(() => { - sinon.replace(vscode.window, 'showQuickPick', mockShowQuickPick); - const mockIsPlayground = sinon.fake.returns(false); - sinon.replace(testCodeLensProvider, 'isPlayground', mockIsPlayground); + sinon.replace(vscode.window, 'showQuickPick', testShowQuickPick); + const testIsPlayground = sinon.fake.returns(false); + sinon.replace(testCodeLensProvider, 'isPlayground', testIsPlayground); }); afterEach(() => { @@ -156,7 +156,7 @@ suite('Active Connection CodeLens Provider Test Suite', () => { suite('user is connected', () => { const testConnectionController = new ConnectionController( testStatusView, - mockStorageController, + testStorageController, testTelemetryService ); const testCodeLensProvider = new ActiveConnectionCodeLensProvider( @@ -176,11 +176,11 @@ suite('Active Connection CodeLens Provider Test Suite', () => { genuineMongoDB: {}, host: {}, } as unknown as Awaited>); - const mockActiveDataService = { + const testActiveDataService = { find: findStub, instance: instanceStub, } as Pick as unknown as DataService; - testConnectionController.setActiveDataService(mockActiveDataService); + testConnectionController.setActiveDataService(testActiveDataService); beforeEach(() => { sinon.replace( @@ -188,8 +188,8 @@ suite('Active Connection CodeLens Provider Test Suite', () => { 'getActiveConnectionName', sinon.fake.returns('fakeName') ); - const mockIsPlayground = sinon.fake.returns(false); - sinon.replace(testCodeLensProvider, 'isPlayground', mockIsPlayground); + const testIsPlayground = sinon.fake.returns(false); + sinon.replace(testCodeLensProvider, 'isPlayground', testIsPlayground); }); afterEach(() => { diff --git a/src/test/suite/editors/collectionDocumentsCodeLensProvider.test.ts b/src/test/suite/editors/collectionDocumentsCodeLensProvider.test.ts index bc84f3a4b..046a07bbf 100644 --- a/src/test/suite/editors/collectionDocumentsCodeLensProvider.test.ts +++ b/src/test/suite/editors/collectionDocumentsCodeLensProvider.test.ts @@ -11,13 +11,10 @@ suite('Collection Documents Provider Test Suite', () => { const testCodeLensProvider = new CollectionDocumentsCodeLensProvider( testQueryStore ); - const operationId = testQueryStore.createNewOperation(); - const uri = vscode.Uri.parse( `scheme:Results: filename.json?&operationId=${operationId}` ); - const mockDocument = { ...mockVSCodeTextDocument, uri, @@ -45,19 +42,15 @@ suite('Collection Documents Provider Test Suite', () => { const testCodeLensProvider = new CollectionDocumentsCodeLensProvider( testQueryStore ); - const operationId = testQueryStore.createNewOperation(); testQueryStore.operations[operationId].hasMoreDocumentsToShow = false; - const uri = vscode.Uri.parse( `scheme:Results: filename.json?operationId=${operationId}` ); - const mockDocument = { ...mockVSCodeTextDocument, uri, }; - const codeLens = testCodeLensProvider.provideCodeLenses(mockDocument); assert(codeLens.length === 0); }); diff --git a/src/test/suite/editors/collectionDocumentsOperationsStore.test.ts b/src/test/suite/editors/collectionDocumentsOperationsStore.test.ts index 99822b9f2..680dd810c 100644 --- a/src/test/suite/editors/collectionDocumentsOperationsStore.test.ts +++ b/src/test/suite/editors/collectionDocumentsOperationsStore.test.ts @@ -1,14 +1,12 @@ -import assert from 'assert'; import * as vscode from 'vscode'; +import assert from 'assert'; import CollectionDocumentsOperationsStore from '../../../editors/collectionDocumentsOperationsStore'; suite('Collection Documents Operations Store Test Suite', () => { test('expected CollectionDocumentsOperationsStore createNewOperation to add an operation with a document limit and return an id', () => { const testOpsStore = new CollectionDocumentsOperationsStore(); - const opId = testOpsStore.createNewOperation(); - assert( !!testOpsStore.operations[opId], `Expected operation with id ${opId}` @@ -17,12 +15,11 @@ suite('Collection Documents Operations Store Test Suite', () => { Object.keys(testOpsStore.operations).length === 1, `Expected an operation to be in the operations store, found ${testOpsStore.operations.length}` ); - const operation = testOpsStore.operations[opId]; + const operation = testOpsStore.operations[opId]; const expectedLimit = vscode.workspace .getConfiguration('mdb') .get('defaultLimit'); - assert( operation.currentLimit === expectedLimit, `Expected limit to be ${expectedLimit} found ${operation.currentLimit}` @@ -31,21 +28,17 @@ suite('Collection Documents Operations Store Test Suite', () => { test('expected increaseOperationDocumentLimit createNewOperation to increase limit by config setting', () => { const testOpsStore = new CollectionDocumentsOperationsStore(); - const opId = testOpsStore.createNewOperation(); const operation = testOpsStore.operations[opId]; - const expectedLimit = Number( vscode.workspace.getConfiguration('mdb').get('defaultLimit') ); - assert( operation.currentLimit === expectedLimit, `Expected limit to be ${expectedLimit} found ${operation.currentLimit}` ); testOpsStore.increaseOperationDocumentLimit(opId); - assert( operation.currentLimit === expectedLimit * 2, `Expected limit to be ${expectedLimit} found ${operation.currentLimit}` diff --git a/src/test/suite/editors/collectionDocumentsProvider.test.ts b/src/test/suite/editors/collectionDocumentsProvider.test.ts index 8df217d2f..a52fc3519 100644 --- a/src/test/suite/editors/collectionDocumentsProvider.test.ts +++ b/src/test/suite/editors/collectionDocumentsProvider.test.ts @@ -1,8 +1,8 @@ import * as vscode from 'vscode'; -import { afterEach } from 'mocha'; import assert from 'assert'; -import type { DataService } from 'mongodb-data-service'; +import { beforeEach, afterEach } from 'mocha'; import sinon from 'sinon'; +import type { DataService } from 'mongodb-data-service'; import { DocumentSource } from '../../../documentSource'; import CollectionDocumentsOperationsStore from '../../../editors/collectionDocumentsOperationsStore'; @@ -16,7 +16,7 @@ import { StorageController } from '../../../storage'; import { StorageLocation } from '../../../storage/storageController'; import TelemetryService from '../../../telemetry/telemetryService'; import { TEST_DATABASE_URI } from '../dbTestHelper'; -import { TestExtensionContext, mockTextEditor } from '../stubs'; +import { ExtensionContextStub, mockTextEditor } from '../stubs'; const mockDocumentsAsJsonString = `[ { @@ -30,14 +30,18 @@ const mockDocumentsAsJsonString = `[ ]`; suite('Collection Documents Provider Test Suite', () => { - const mockExtensionContext = new TestExtensionContext(); - const mockStorageController = new StorageController(mockExtensionContext); + const extensionContextStub = new ExtensionContextStub(); + const testStorageController = new StorageController(extensionContextStub); const testTelemetryService = new TelemetryService( - mockStorageController, - mockExtensionContext + testStorageController, + extensionContextStub ); const sandbox = sinon.createSandbox(); + beforeEach(() => { + sinon.stub(vscode.window, 'showInformationMessage'); + }); + afterEach(() => { sandbox.restore(); sinon.restore(); @@ -50,22 +54,22 @@ suite('Collection Documents Provider Test Suite', () => { find: findStub, } as Pick as unknown as DataService; - const mockConnectionController = new ConnectionController( - new StatusView(mockExtensionContext), - mockStorageController, + const testConnectionController = new ConnectionController( + new StatusView(extensionContextStub), + testStorageController, testTelemetryService ); - mockConnectionController.setActiveDataService(testDataService); + testConnectionController.setActiveDataService(testDataService); const testQueryStore = new CollectionDocumentsOperationsStore(); const testCodeLensProvider = new EditDocumentCodeLensProvider( - mockConnectionController + testConnectionController ); const testCollectionViewProvider = new CollectionDocumentsProvider( - mockExtensionContext, - mockConnectionController, + extensionContextStub, + testConnectionController, testQueryStore, - new StatusView(mockExtensionContext), + new StatusView(extensionContextStub), testCodeLensProvider ); @@ -106,22 +110,22 @@ suite('Collection Documents Provider Test Suite', () => { find: findStub, } as Pick as unknown as DataService; - const mockConnectionController = new ConnectionController( - new StatusView(mockExtensionContext), - mockStorageController, + const testConnectionController = new ConnectionController( + new StatusView(extensionContextStub), + testStorageController, testTelemetryService ); - mockConnectionController.setActiveDataService(testDataService); + testConnectionController.setActiveDataService(testDataService); const testQueryStore = new CollectionDocumentsOperationsStore(); const testCodeLensProvider = new EditDocumentCodeLensProvider( - mockConnectionController + testConnectionController ); const testCollectionViewProvider = new CollectionDocumentsProvider( - mockExtensionContext, - mockConnectionController, + extensionContextStub, + testConnectionController, testQueryStore, - new StatusView(mockExtensionContext), + new StatusView(extensionContextStub), testCodeLensProvider ); @@ -146,22 +150,22 @@ suite('Collection Documents Provider Test Suite', () => { const testDataService = { find: findStub, } as Pick as unknown as DataService; - const mockConnectionController = new ConnectionController( - new StatusView(mockExtensionContext), - mockStorageController, + const testConnectionController = new ConnectionController( + new StatusView(extensionContextStub), + testStorageController, testTelemetryService ); - mockConnectionController.setActiveDataService(testDataService); + testConnectionController.setActiveDataService(testDataService); const testQueryStore = new CollectionDocumentsOperationsStore(); const testCodeLensProvider = new EditDocumentCodeLensProvider( - mockConnectionController + testConnectionController ); const testCollectionViewProvider = new CollectionDocumentsProvider( - mockExtensionContext, - mockConnectionController, + extensionContextStub, + testConnectionController, testQueryStore, - new StatusView(mockExtensionContext), + new StatusView(extensionContextStub), testCodeLensProvider ); @@ -193,22 +197,22 @@ suite('Collection Documents Provider Test Suite', () => { DataService, 'find' > as unknown as DataService; - const mockConnectionController = new ConnectionController( - new StatusView(mockExtensionContext), - mockStorageController, + const testConnectionController = new ConnectionController( + new StatusView(extensionContextStub), + testStorageController, testTelemetryService ); - mockConnectionController.setActiveDataService(mockActiveDataService); + testConnectionController.setActiveDataService(mockActiveDataService); - const testStatusView = new StatusView(mockExtensionContext); + const testStatusView = new StatusView(extensionContextStub); const testQueryStore = new CollectionDocumentsOperationsStore(); const testCodeLensProvider = new EditDocumentCodeLensProvider( - mockConnectionController + testConnectionController ); const testCollectionViewProvider = new CollectionDocumentsProvider( - mockExtensionContext, - mockConnectionController, + extensionContextStub, + testConnectionController, testQueryStore, testStatusView, testCodeLensProvider @@ -220,49 +224,49 @@ suite('Collection Documents Provider Test Suite', () => { `scheme:Results: filename.json?namespace=aaaaaaaa&operationId=${operationId}` ); - const mockShowMessage = sinon.fake(); - sinon.replace(testStatusView, 'showMessage', mockShowMessage); + const fakeShowMessage = sinon.fake(); + sinon.replace(testStatusView, 'showMessage', fakeShowMessage); - const mockHideMessage = sinon.fake(); - sinon.replace(testStatusView, 'hideMessage', mockHideMessage); + const fakeHideMessage = sinon.fake(); + sinon.replace(testStatusView, 'hideMessage', fakeHideMessage); mockActiveDataService.find = () => { - assert(mockShowMessage.called); - assert(!mockHideMessage.called); - assert(mockShowMessage.firstCall.args[0] === 'Fetching documents...'); + assert(fakeShowMessage.called); + assert(!fakeHideMessage.called); + assert(fakeShowMessage.firstCall.args[0] === 'Fetching documents...'); return Promise.resolve([{ field: 'aaaaaaaaaaaaaaaaa' }]); }; await testCollectionViewProvider.provideTextDocumentContent(uri); - assert(mockHideMessage.called); + assert(fakeHideMessage.called); }); test('provideTextDocumentContent sets different code lenses for different namespaces from the same connection', async () => { - const mockConnectionController = new ConnectionController( - new StatusView(mockExtensionContext), - mockStorageController, + const testConnectionController = new ConnectionController( + new StatusView(extensionContextStub), + testStorageController, testTelemetryService ); const testQueryStore = new CollectionDocumentsOperationsStore(); const testCodeLensProvider = new EditDocumentCodeLensProvider( - mockConnectionController + testConnectionController ); const testCollectionViewProvider = new CollectionDocumentsProvider( - mockExtensionContext, - mockConnectionController, + extensionContextStub, + testConnectionController, testQueryStore, - new StatusView(mockExtensionContext), + new StatusView(extensionContextStub), testCodeLensProvider ); testCollectionViewProvider._operationsStore = new CollectionDocumentsOperationsStore(); - const documents: any[] = [ - { _id: '5ea8745ee4811fafe8b65ecb', koko: 'nothing5' }, + const documents: { _id: string; name?: string; price?: number }[] = [ + { _id: '5ea8745ee4811fafe8b65ecb', name: 'nothing5' }, ]; - const mockGetActiveDataService = sinon.fake.returns({ + const fakeGetActiveDataService = sinon.fake.returns({ find: () => { return Promise.resolve(documents); }, @@ -270,29 +274,29 @@ suite('Collection Documents Provider Test Suite', () => { sinon.replace( testCollectionViewProvider._connectionController, 'getActiveDataService', - mockGetActiveDataService + fakeGetActiveDataService ); - const mockShowMessage = sinon.fake(); + const fakeShowMessage = sinon.fake(); sinon.replace( testCollectionViewProvider._statusView, 'showMessage', - mockShowMessage + fakeShowMessage ); - const mockHideMessage = sinon.fake(); + const fakeHideMessage = sinon.fake(); sinon.replace( testCollectionViewProvider._statusView, 'hideMessage', - mockHideMessage + fakeHideMessage ); const connectionId = '1c8c2b06-fbfb-40b7-bd8a-bd1f8333a487'; - const mockActiveConnectionId = sinon.fake.returns(connectionId); + const fakeActiveConnectionId = sinon.fake.returns(connectionId); sinon.replace( testCollectionViewProvider._connectionController, 'getActiveConnectionId', - mockActiveConnectionId + fakeActiveConnectionId ); const firstCollectionOperationId = @@ -441,30 +445,30 @@ suite('Collection Documents Provider Test Suite', () => { }); test('provideTextDocumentContent sets different code lenses for identical namespaces from the different connections', async () => { - const mockConnectionController = new ConnectionController( - new StatusView(mockExtensionContext), - mockStorageController, + const testConnectionController = new ConnectionController( + new StatusView(extensionContextStub), + testStorageController, testTelemetryService ); const testQueryStore = new CollectionDocumentsOperationsStore(); const testCodeLensProvider = new EditDocumentCodeLensProvider( - mockConnectionController + testConnectionController ); const testCollectionViewProvider = new CollectionDocumentsProvider( - mockExtensionContext, - mockConnectionController, + extensionContextStub, + testConnectionController, testQueryStore, - new StatusView(mockExtensionContext), + new StatusView(extensionContextStub), testCodeLensProvider ); testCollectionViewProvider._operationsStore = new CollectionDocumentsOperationsStore(); - const documents: any[] = [ + const documents: { _id: string; location?: string; district?: string }[] = [ { _id: '5ea8745ee4811fafe8b65ecb', location: 'alexanderplatz' }, ]; - const mockGetActiveDataService = sinon.fake.returns({ + const fakeGetActiveDataService = sinon.fake.returns({ find: () => { return Promise.resolve(documents); }, @@ -472,27 +476,27 @@ suite('Collection Documents Provider Test Suite', () => { sinon.replace( testCollectionViewProvider._connectionController, 'getActiveDataService', - mockGetActiveDataService + fakeGetActiveDataService ); - const mockShowMessage = sinon.fake(); + const fakeShowMessage = sinon.fake(); sinon.replace( testCollectionViewProvider._statusView, 'showMessage', - mockShowMessage + fakeShowMessage ); - const mockHideMessage = sinon.fake(); + const fakeHideMessage = sinon.fake(); sinon.replace( testCollectionViewProvider._statusView, 'hideMessage', - mockHideMessage + fakeHideMessage ); const firstConnectionId = '1c8c2b06-fbfb-40b7-bd8a-bd1f8333a487'; const secondConnectionId = '333c2b06-hhhh-40b7-bd8a-bd1f8333a896'; - mockConnectionController._connections = { + testConnectionController._connections = { [firstConnectionId]: { id: firstConnectionId, name: 'localhost', @@ -507,7 +511,7 @@ suite('Collection Documents Provider Test Suite', () => { }, }; - await mockConnectionController.connectWithConnectionId(firstConnectionId); + await testConnectionController.connectWithConnectionId(firstConnectionId); const firstCollectionOperationId = testCollectionViewProvider._operationsStore.createNewOperation(); @@ -580,7 +584,7 @@ suite('Collection Documents Provider Test Suite', () => { ); // Connect to another connection. - await mockConnectionController.connectWithConnectionId(secondConnectionId); + await testConnectionController.connectWithConnectionId(secondConnectionId); const secondCollectionOperationId = testCollectionViewProvider._operationsStore.createNewOperation(); diff --git a/src/test/suite/editors/documentStringFixtures.ts b/src/test/suite/editors/documentStringFixtures.ts deleted file mode 100644 index cc8a98bc6..000000000 --- a/src/test/suite/editors/documentStringFixtures.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { Binary, EJSON } from 'bson'; - -const docString = - '{"_id":{"$oid":"57e193d7a9cc81b4027498b5"},"Symbol":"symbol","String":"string","Int32":{"$numberInt":"42"},"Int64":{"$numberLong":"42"},"Double":{"$numberDouble":"-1"},"Binary":{"$binary":{"base64":"o0w498Or7cijeBSpkquNtg==","subType":"03"}},"BinaryUserDefined":{"$binary":{"base64":"AQIDBAU=","subType":"80"}},"Code":{"$code":"function() {}"},"CodeWithScope":{"$code":"function() {}","$scope":{}},"Subdocument":{"foo":"bar"},"Array":[{"$numberInt":"1"},{"$numberInt":"2"},{"$numberInt":"3"},{"$numberInt":"4"},{"$numberInt":"5"}],"Timestamp":{"$timestamp":{"t":42,"i":1}},"Regex":{"$regularExpression":{"pattern":"pattern","options":""}},"DatetimeEpoch":{"$date":{"$numberLong":"0"}},"DatetimePositive":{"$date":{"$numberLong":"2147483647"}},"DatetimeNegative":{"$date":{"$numberLong":"-2147483648"}},"True":true,"False":false,"DBPointer":{"$ref":"collection","$id":{"$oid":"57e193d7a9cc81b4027498b1"}},"DBRef":{"$ref":"collection","$id":{"$oid":"57fd71e96e32ab4225b723fb"},"$db":"database"},"Minkey":{"$minKey":1},"Maxkey":{"$maxKey":1},"Null":null,"Undefined":null}'; -export const documentWithAllBSONTypes = EJSON.parse(docString); - -export const documentWithAllBsonTypesJsonified = `{ - "_id": "57e193d7a9cc81b4027498b5", - "Symbol": "symbol", - "String": "string", - "Int32": 42, - "Int64": 42, - "Double": -1, - "Binary": "o0w498Or7cijeBSpkquNtg==", - "BinaryUserDefined": "AQIDBAU=", - "Code": { - "code": "function() {}" - }, - "CodeWithScope": { - "scope": {}, - "code": "function() {}" - }, - "Subdocument": { - "foo": "bar" - }, - "Array": [ - 1, - 2, - 3, - 4, - 5 - ], - "Timestamp": "180388626433", - "Regex": {}, - "DatetimeEpoch": "1970-01-01T00:00:00.000Z", - "DatetimePositive": "1970-01-25T20:31:23.647Z", - "DatetimeNegative": "1969-12-07T03:28:36.352Z", - "True": true, - "False": false, - "DBPointer": { - "$ref": "collection", - "$id": "57e193d7a9cc81b4027498b1", - "$db": "" - }, - "DBRef": { - "$ref": "collection", - "$id": "57fd71e96e32ab4225b723fb", - "$db": "database" - }, - "Minkey": { - "_bsontype": "MinKey" - }, - "Maxkey": { - "_bsontype": "MaxKey" - }, - "Null": null, - "Undefined": null -}`; - -export const documentWithBinaryId = { - _id: new Binary('a+b'), -}; -export const documentWithBinaryIdString = JSON.stringify( - documentWithBinaryId, - null, - 2 -); diff --git a/src/test/suite/editors/editDocumentCodeLensProvider.test.ts b/src/test/suite/editors/editDocumentCodeLensProvider.test.ts index 76cfca949..2ec2c0eb3 100644 --- a/src/test/suite/editors/editDocumentCodeLensProvider.test.ts +++ b/src/test/suite/editors/editDocumentCodeLensProvider.test.ts @@ -1,9 +1,9 @@ import * as vscode from 'vscode'; -import * as util from 'util'; -import { afterEach } from 'mocha'; import assert from 'assert'; +import { afterEach } from 'mocha'; import { ObjectId } from 'bson'; import sinon from 'sinon'; +import * as util from 'util'; import ConnectionController from '../../../connectionController'; import { DocumentSource } from '../../../documentSource'; @@ -12,19 +12,19 @@ import { mockTextEditor } from '../stubs'; import { StatusView } from '../../../views'; import { StorageController } from '../../../storage'; import TelemetryService from '../../../telemetry/telemetryService'; -import { TestExtensionContext } from '../stubs'; +import { ExtensionContextStub } from '../stubs'; suite('Edit Document Code Lens Provider Test Suite', () => { - const mockExtensionContext = new TestExtensionContext(); - const mockStorageController = new StorageController(mockExtensionContext); + const extensionContextStub = new ExtensionContextStub(); + const testStorageController = new StorageController(extensionContextStub); const testTelemetryService = new TelemetryService( - mockStorageController, - mockExtensionContext + testStorageController, + extensionContextStub ); - const testStatusView = new StatusView(mockExtensionContext); + const testStatusView = new StatusView(extensionContextStub); const testConnectionController = new ConnectionController( testStatusView, - mockStorageController, + testStorageController, testTelemetryService ); const sandbox = sinon.createSandbox(); @@ -60,22 +60,22 @@ suite('Edit Document Code Lens Provider Test Suite', () => { source: DocumentSource.DOCUMENT_SOURCE_PLAYGROUND, }; - const mockActiveConnectionId = sinon.fake.returns('tasty_sandwhich'); + const fakeActiveConnectionId = sinon.fake.returns('tasty_sandwhich'); sinon.replace( testCodeLensProvider._connectionController, 'getActiveConnectionId', - mockActiveConnectionId + fakeActiveConnectionId ); - const result = testCodeLensProvider._updateCodeLensesForCursor(playgroundResult); assert(!!result); + const codeLensesInfo = result[0]; assert(!!codeLensesInfo); assert(!!codeLensesInfo.documentId); - const bsonId = new ObjectId('5d973ae744376d2aae72a160'); + const bsonId = new ObjectId('5d973ae744376d2aae72a160'); assert(util.inspect(codeLensesInfo.documentId) !== util.inspect(ejsinId)); assert(util.inspect(codeLensesInfo.documentId) === util.inspect(bsonId)); }); @@ -94,22 +94,21 @@ suite('Edit Document Code Lens Provider Test Suite', () => { source: DocumentSource.DOCUMENT_SOURCE_PLAYGROUND, }; - const mockActiveConnectionId = sinon.fake.returns('tasty_sandwhich'); + const fakeActiveConnectionId = sinon.fake.returns('tasty_sandwhich'); sinon.replace( testCodeLensProvider._connectionController, 'getActiveConnectionId', - mockActiveConnectionId + fakeActiveConnectionId ); - const result = testCodeLensProvider._updateCodeLensesForDocument(playgroundResult); - assert(!!result); + const codeLensesInfo = result[0]; assert(!!codeLensesInfo); assert(!!codeLensesInfo.documentId); - const bsonId = new ObjectId('5d973ae744376d2aae72a160'); + const bsonId = new ObjectId('5d973ae744376d2aae72a160'); assert(util.inspect(codeLensesInfo.documentId) !== util.inspect(ejsinId)); assert(util.inspect(codeLensesInfo.documentId) === util.inspect(bsonId)); }); @@ -119,7 +118,6 @@ suite('Edit Document Code Lens Provider Test Suite', () => { const testCodeLensProvider = new EditDocumentCodeLensProvider( testConnectionController ); - const activeTextEditor = mockTextEditor; mockTextEditor.document.uri = vscode.Uri.parse( 'PLAYGROUND_RESULT_SCHEME:/Playground Result' @@ -129,7 +127,6 @@ suite('Edit Document Code Lens Provider Test Suite', () => { 'activeTextEditor', () => activeTextEditor ); - testCodeLensProvider.updateCodeLensesForPlayground({ namespace: 'db.coll', type: 'Document', @@ -138,15 +135,16 @@ suite('Edit Document Code Lens Provider Test Suite', () => { }); const codeLens = testCodeLensProvider.provideCodeLenses(); - assert(!!codeLens); assert(codeLens.length === 1); + const range = codeLens[0].range; const expectedStartLine = 1; assert( range.start.line === expectedStartLine, `Expected a codeLens position to be at line ${expectedStartLine}, found ${range.start.line}` ); + const expectedEnd = 1; assert( range.end.line === expectedEnd, @@ -157,6 +155,7 @@ suite('Edit Document Code Lens Provider Test Suite', () => { assert( codeLens[0].command?.command === 'mdb.openMongoDBDocumentFromCodeLens' ); + const commandArguments = codeLens[0].command?.arguments; assert(!!commandArguments); assert(commandArguments[0].source === 'playground'); @@ -166,7 +165,6 @@ suite('Edit Document Code Lens Provider Test Suite', () => { const testCodeLensProvider = new EditDocumentCodeLensProvider( testConnectionController ); - const activeTextEditor = mockTextEditor; activeTextEditor.document.uri = vscode.Uri.parse( 'PLAYGROUND_RESULT_SCHEME:/Playground Result' @@ -176,7 +174,6 @@ suite('Edit Document Code Lens Provider Test Suite', () => { 'activeTextEditor', () => activeTextEditor ); - testCodeLensProvider.updateCodeLensesForPlayground({ namespace: 'db.coll', type: 'Cursor', @@ -188,26 +185,29 @@ suite('Edit Document Code Lens Provider Test Suite', () => { }); const codeLens = testCodeLensProvider.provideCodeLenses(); - assert(!!codeLens); assert(codeLens.length === 2); + const firstRange = codeLens[0].range; const firstExpectedStartLine = 2; assert( firstRange.start.line === firstExpectedStartLine, `Expected a codeLens position to be at line ${firstExpectedStartLine}, found ${firstRange.start.line}` ); + const firstExpectedEnd = 2; assert( firstRange.end.line === firstExpectedEnd, `Expected a codeLens position to be at line ${firstExpectedEnd}, found ${firstRange.end.line}` ); + const secondRange = codeLens[1].range; const secondExpectedStartLine = 5; assert( secondRange.start.line === secondExpectedStartLine, `Expected a codeLens position to be at line ${secondExpectedStartLine}, found ${secondRange.start.line}` ); + const secondExpectedEnd = 5; assert( secondRange.end.line === secondExpectedEnd, @@ -219,7 +219,6 @@ suite('Edit Document Code Lens Provider Test Suite', () => { const testCodeLensProvider = new EditDocumentCodeLensProvider( testConnectionController ); - const activeTextEditor = mockTextEditor; activeTextEditor.document.uri = vscode.Uri.parse( 'PLAYGROUND_RESULT_SCHEME:/Playground Result' @@ -229,7 +228,6 @@ suite('Edit Document Code Lens Provider Test Suite', () => { 'activeTextEditor', () => activeTextEditor ); - testCodeLensProvider.updateCodeLensesForPlayground({ namespace: 'db.coll', type: 'Cursor', @@ -257,26 +255,29 @@ suite('Edit Document Code Lens Provider Test Suite', () => { }); const codeLens = testCodeLensProvider.provideCodeLenses(); - assert(!!codeLens); assert(codeLens.length === 2); + const firstRange = codeLens[0].range; const firstExpectedStartLine = 2; assert( firstRange.start.line === firstExpectedStartLine, `Expected a codeLens position to be at line ${firstExpectedStartLine}, found ${firstRange.start.line}` ); + const firstExpectedEnd = 2; assert( firstRange.end.line === firstExpectedEnd, `Expected a codeLens position to be at line ${firstExpectedEnd}, found ${firstRange.end.line}` ); + const secondRange = codeLens[1].range; const secondExpectedStartLine = 11; assert( secondRange.start.line === secondExpectedStartLine, `Expected a codeLens position to be at line ${secondExpectedStartLine}, found ${secondRange.start.line}` ); + const secondExpectedEnd = 11; assert( secondRange.end.line === secondExpectedEnd, diff --git a/src/test/suite/editors/editorsController.test.ts b/src/test/suite/editors/editorsController.test.ts index 3ba37b891..22366cc72 100644 --- a/src/test/suite/editors/editorsController.test.ts +++ b/src/test/suite/editors/editorsController.test.ts @@ -1,20 +1,27 @@ import * as vscode from 'vscode'; -import { afterEach } from 'mocha'; import assert from 'assert'; +import { beforeEach, afterEach } from 'mocha'; import chai from 'chai'; -import { mockTextEditor } from '../stubs'; import sinon from 'sinon'; +import type { SinonStub } from 'sinon'; import { ObjectId } from 'bson'; import { getFileDisplayNameForDocument, getViewCollectionDocumentsUri, } from '../../../editors/editorsController'; +import { mockTextEditor } from '../stubs'; const expect = chai.expect; suite('Editors Controller Test Suite', () => { const sandbox = sinon.createSandbox(); + let showErrorMessageStub: SinonStub; + + beforeEach(() => { + sinon.stub(vscode.window, 'showInformationMessage'); + showErrorMessageStub = sinon.stub(vscode.window, 'showErrorMessage'); + }); afterEach(() => { sandbox.restore(); @@ -100,15 +107,12 @@ suite('Editors Controller Test Suite', () => { test('saveMongoDBDocument returns false if there is no active editor', async () => { sandbox.replaceGetter(vscode.window, 'activeTextEditor', () => undefined); - const fakeShowErrorMessage: any = sinon.fake(); - sinon.replace(vscode.window, 'showErrorMessage', fakeShowErrorMessage); - const result = await vscode.commands.executeCommand( 'mdb.saveMongoDBDocument' ); expect(result).to.be.equal(false); - expect(fakeShowErrorMessage.firstArg).to.be.equal(null); + expect(showErrorMessageStub.notCalled).to.be.equal(true); }); test('saveMongoDBDocument returns false if this is not a mongodb document', async () => { diff --git a/src/test/suite/editors/exportToLanguageCodeLensProvider.test.ts b/src/test/suite/editors/exportToLanguageCodeLensProvider.test.ts index d20f3d2c7..a4d1024fa 100644 --- a/src/test/suite/editors/exportToLanguageCodeLensProvider.test.ts +++ b/src/test/suite/editors/exportToLanguageCodeLensProvider.test.ts @@ -24,7 +24,6 @@ suite('Export To Language Code Lens Provider Test Suite', function () { testExportToLanguageCodeLensProvider.refresh(defaults); const codeLenses = testExportToLanguageCodeLensProvider.provideCodeLenses(); - expect(codeLenses.length).to.be.equal(2); expect(codeLenses[0].command?.title).to.be.equal( 'Include Import Statements' @@ -38,7 +37,6 @@ suite('Export To Language Code Lens Provider Test Suite', function () { }); const codeLenses = testExportToLanguageCodeLensProvider.provideCodeLenses(); - expect(codeLenses.length).to.be.equal(2); expect(codeLenses[0].command?.title).to.be.equal( 'Exclude Import Statements' @@ -49,7 +47,6 @@ suite('Export To Language Code Lens Provider Test Suite', function () { testExportToLanguageCodeLensProvider.refresh(defaults); const codeLenses = testExportToLanguageCodeLensProvider.provideCodeLenses(); - expect(codeLenses.length).to.be.equal(2); expect(codeLenses[1].command?.title).to.be.equal('Include Driver Syntax'); }); @@ -61,7 +58,6 @@ suite('Export To Language Code Lens Provider Test Suite', function () { }); const codeLenses = testExportToLanguageCodeLensProvider.provideCodeLenses(); - expect(codeLenses.length).to.be.equal(2); expect(codeLenses[1].command?.title).to.be.equal('Exclude Driver Syntax'); }); @@ -74,7 +70,6 @@ suite('Export To Language Code Lens Provider Test Suite', function () { }); const codeLenses = testExportToLanguageCodeLensProvider.provideCodeLenses(); - expect(codeLenses.length).to.be.equal(3); expect(codeLenses[2].command?.title).to.be.equal('Use Builders'); }); @@ -87,7 +82,6 @@ suite('Export To Language Code Lens Provider Test Suite', function () { }); const codeLenses = testExportToLanguageCodeLensProvider.provideCodeLenses(); - expect(codeLenses.length).to.be.equal(1); // Csharp does not support driver syntax. expect(codeLenses[0].command?.title).to.be.equal( 'Include Import Statements' @@ -103,7 +97,6 @@ suite('Export To Language Code Lens Provider Test Suite', function () { }); const codeLenses = testExportToLanguageCodeLensProvider.provideCodeLenses(); - expect(codeLenses.length).to.be.equal(3); expect(codeLenses[2].command?.title).to.be.equal('Use Raw Query'); }); @@ -117,7 +110,6 @@ suite('Export To Language Code Lens Provider Test Suite', function () { }); const codeLenses = testExportToLanguageCodeLensProvider.provideCodeLenses(); - expect(codeLenses.length).to.be.equal(2); }); @@ -130,7 +122,6 @@ suite('Export To Language Code Lens Provider Test Suite', function () { }); const codeLenses = testExportToLanguageCodeLensProvider.provideCodeLenses(); - expect(codeLenses.length).to.be.equal(0); }); @@ -143,7 +134,6 @@ suite('Export To Language Code Lens Provider Test Suite', function () { }); const codeLenses = testExportToLanguageCodeLensProvider.provideCodeLenses(); - expect(codeLenses.length).to.be.equal(0); }); }); diff --git a/src/test/suite/editors/mongoDBDocumentService.test.ts b/src/test/suite/editors/mongoDBDocumentService.test.ts index 4d61a4df8..102210690 100644 --- a/src/test/suite/editors/mongoDBDocumentService.test.ts +++ b/src/test/suite/editors/mongoDBDocumentService.test.ts @@ -1,5 +1,5 @@ import * as vscode from 'vscode'; -import { afterEach } from 'mocha'; +import { beforeEach, afterEach } from 'mocha'; import chai from 'chai'; import { EJSON } from 'bson'; import sinon from 'sinon'; @@ -12,17 +12,17 @@ import MongoDBDocumentService from '../../../editors/mongoDBDocumentService'; import { StorageController } from '../../../storage'; import { StatusView } from '../../../views'; import TelemetryService from '../../../telemetry/telemetryService'; -import { TestExtensionContext } from '../stubs'; +import { ExtensionContextStub } from '../stubs'; const expect = chai.expect; suite('MongoDB Document Service Test Suite', () => { - const mockExtensionContext = new TestExtensionContext(); - const testStorageController = new StorageController(mockExtensionContext); - const testStatusView = new StatusView(mockExtensionContext); + const extensionContextStub = new ExtensionContextStub(); + const testStorageController = new StorageController(extensionContextStub); + const testStatusView = new StatusView(extensionContextStub); const testTelemetryService = new TelemetryService( testStorageController, - mockExtensionContext + extensionContextStub ); const testConnectionController = new ConnectionController( testStatusView, @@ -30,16 +30,17 @@ suite('MongoDB Document Service Test Suite', () => { testTelemetryService ); const testMongoDBDocumentService = new MongoDBDocumentService( - mockExtensionContext, + extensionContextStub, testConnectionController, testStatusView, testTelemetryService ); - const sandbox = sinon.createSandbox(); + beforeEach(() => { + sinon.stub(vscode.window, 'showErrorMessage'); + }); afterEach(() => { - sandbox.restore(); sinon.restore(); }); @@ -51,14 +52,14 @@ suite('MongoDB Document Service Test Suite', () => { const newDocument = { _id: '123', price: 5000 }; const source = DocumentSource.DOCUMENT_SOURCE_TREEVIEW; - const mockActiveConnectionId = sinon.fake.returns('tasty_sandwhich'); + const fakeActiveConnectionId = sinon.fake.returns('tasty_sandwhich'); sinon.replace( testConnectionController, 'getActiveConnectionId', - mockActiveConnectionId + fakeActiveConnectionId ); - const mockGetActiveDataService = sinon.fake.returns({ + const fakeGetActiveDataService = sinon.fake.returns({ findOneAndReplace: ( namespace: string, filter: object, @@ -74,14 +75,14 @@ suite('MongoDB Document Service Test Suite', () => { sinon.replace( testConnectionController, 'getActiveDataService', - mockGetActiveDataService + fakeGetActiveDataService ); - const mockShowMessage = sinon.fake(); - sinon.replace(testStatusView, 'showMessage', mockShowMessage); + const fakeShowMessage = sinon.fake(); + sinon.replace(testStatusView, 'showMessage', fakeShowMessage); - const mockHideMessage = sinon.fake(); - sinon.replace(testStatusView, 'hideMessage', mockHideMessage); + const fakeHideMessage = sinon.fake(); + sinon.replace(testStatusView, 'hideMessage', fakeHideMessage); await testMongoDBDocumentService.replaceDocument({ namespace, @@ -102,7 +103,7 @@ suite('MongoDB Document Service Test Suite', () => { const documents = [{ _id: '123' }]; const source = DocumentSource.DOCUMENT_SOURCE_PLAYGROUND; - const mockGetActiveDataService = sinon.fake.returns({ + const fakeGetActiveDataService = sinon.fake.returns({ find: () => { return Promise.resolve([{ _id: '123' }]); }, @@ -110,21 +111,21 @@ suite('MongoDB Document Service Test Suite', () => { sinon.replace( testConnectionController, 'getActiveDataService', - mockGetActiveDataService + fakeGetActiveDataService ); - const mockGetActiveConnectionId = sinon.fake.returns(connectionId); + const fakeGetActiveConnectionId = sinon.fake.returns(connectionId); sinon.replace( testConnectionController, 'getActiveConnectionId', - mockGetActiveConnectionId + fakeGetActiveConnectionId ); - const mockShowMessage = sinon.fake(); - sinon.replace(testStatusView, 'showMessage', mockShowMessage); + const fakeShowMessage = sinon.fake(); + sinon.replace(testStatusView, 'showMessage', fakeShowMessage); - const mockHideMessage = sinon.fake(); - sinon.replace(testStatusView, 'hideMessage', mockHideMessage); + const fakeHideMessage = sinon.fake(); + sinon.replace(testStatusView, 'hideMessage', fakeHideMessage); const result = await testMongoDBDocumentService.fetchDocument({ namespace, @@ -144,21 +145,18 @@ suite('MongoDB Document Service Test Suite', () => { const newDocument = { _id: '123', price: 5000 }; const source = DocumentSource.DOCUMENT_SOURCE_TREEVIEW; - const fakeVscodeErrorMessage = sinon.fake(); - sinon.replace(vscode.window, 'showErrorMessage', fakeVscodeErrorMessage); - - const mockActiveConnectionId = sinon.fake.returns(null); + const fakeActiveConnectionId = sinon.fake.returns(null); sinon.replace( testConnectionController, 'getActiveConnectionId', - mockActiveConnectionId + fakeActiveConnectionId ); - const mockGetSavedConnectionName = sinon.fake.returns('tasty_sandwhich'); + const fakeGetSavedConnectionName = sinon.fake.returns('tasty_sandwhich'); sinon.replace( testConnectionController, 'getSavedConnectionName', - mockGetSavedConnectionName + fakeGetSavedConnectionName ); try { @@ -184,21 +182,18 @@ suite('MongoDB Document Service Test Suite', () => { const newDocument = { _id: '123', price: 5000 }; const source = DocumentSource.DOCUMENT_SOURCE_PLAYGROUND; - const fakeVscodeErrorMessage = sinon.fake(); - sinon.replace(vscode.window, 'showErrorMessage', fakeVscodeErrorMessage); - - const mockActiveConnectionId = sinon.fake.returns('berlin.coctails'); + const fakeActiveConnectionId = sinon.fake.returns('berlin.coctails'); sinon.replace( testConnectionController, 'getActiveConnectionId', - mockActiveConnectionId + fakeActiveConnectionId ); - const mockGetSavedConnectionName = sinon.fake.returns('tasty_sandwhich'); + const fakeGetSavedConnectionName = sinon.fake.returns('tasty_sandwhich'); sinon.replace( testConnectionController, 'getSavedConnectionName', - mockGetSavedConnectionName + fakeGetSavedConnectionName ); try { @@ -224,25 +219,25 @@ suite('MongoDB Document Service Test Suite', () => { const line = 1; const source = DocumentSource.DOCUMENT_SOURCE_PLAYGROUND; - const mockGetActiveConnectionId = sinon.fake.returns('345'); + const fakeGetActiveConnectionId = sinon.fake.returns('345'); sinon.replace( testConnectionController, 'getActiveConnectionId', - mockGetActiveConnectionId + fakeGetActiveConnectionId ); - const mockGetSavedConnectionName = sinon.fake.returns('tasty_sandwhich'); + const fakeGetSavedConnectionName = sinon.fake.returns('tasty_sandwhich'); sinon.replace( testConnectionController, 'getSavedConnectionName', - mockGetSavedConnectionName + fakeGetSavedConnectionName ); - const mockShowMessage = sinon.fake(); - sinon.replace(testStatusView, 'showMessage', mockShowMessage); + const fakeShowMessage = sinon.fake(); + sinon.replace(testStatusView, 'showMessage', fakeShowMessage); - const mockHideMessage = sinon.fake(); - sinon.replace(testStatusView, 'hideMessage', mockHideMessage); + const fakeHideMessage = sinon.fake(); + sinon.replace(testStatusView, 'hideMessage', fakeHideMessage); try { await testMongoDBDocumentService.fetchDocument({ diff --git a/src/test/suite/editors/playgroundController.test.ts b/src/test/suite/editors/playgroundController.test.ts index 26621454c..00ee5f3c6 100644 --- a/src/test/suite/editors/playgroundController.test.ts +++ b/src/test/suite/editors/playgroundController.test.ts @@ -1,8 +1,9 @@ import * as vscode from 'vscode'; -import { before, beforeEach, afterEach } from 'mocha'; +import { beforeEach, afterEach } from 'mocha'; import chai from 'chai'; import type { DataService } from 'mongodb-data-service'; import sinon from 'sinon'; +import type { SinonSpy, SinonStub } from 'sinon'; import { v4 as uuidv4 } from 'uuid'; import path from 'path'; @@ -20,7 +21,7 @@ import { StatusView } from '../../../views'; import { StorageController } from '../../../storage'; import TelemetryService from '../../../telemetry/telemetryService'; import { TEST_DATABASE_URI } from '../dbTestHelper'; -import { TestExtensionContext, MockLanguageServerController } from '../stubs'; +import { ExtensionContextStub, LanguageServerControllerStub } from '../stubs'; const expect = chai.expect; @@ -29,25 +30,25 @@ chai.use(require('chai-as-promised')); suite('Playground Controller Test Suite', function () { this.timeout(5000); - const mockExtensionContext = new TestExtensionContext(); + const extensionContextStub = new ExtensionContextStub(); // The test extension runner. - mockExtensionContext.extensionPath = '../../'; + extensionContextStub.extensionPath = '../../'; - const mockStorageController = new StorageController(mockExtensionContext); + const testStorageController = new StorageController(extensionContextStub); const testTelemetryService = new TelemetryService( - mockStorageController, - mockExtensionContext + testStorageController, + extensionContextStub ); - const testStatusView = new StatusView(mockExtensionContext); + const testStatusView = new StatusView(extensionContextStub); const testConnectionController = new ConnectionController( testStatusView, - mockStorageController, + testStorageController, testTelemetryService ); - const mockLanguageServerController = new MockLanguageServerController( - mockExtensionContext, - mockStorageController + const languageServerControllerStub = new LanguageServerControllerStub( + extensionContextStub, + testStorageController ); const testEditDocumentCodeLensProvider = new EditDocumentCodeLensProvider( testConnectionController @@ -67,7 +68,7 @@ suite('Playground Controller Test Suite', function () { ); const testPlaygroundController = new PlaygroundController( testConnectionController, - mockLanguageServerController as LanguageServerController, + languageServerControllerStub as LanguageServerController, testTelemetryService, testStatusView, testPlaygroundResultProvider, @@ -77,13 +78,10 @@ suite('Playground Controller Test Suite', function () { testExplorerController ); const sandbox = sinon.createSandbox(); - let fakeShowInformationMessage: sinon.SinonStub; + let showErrorMessageStub: SinonStub; beforeEach(() => { - fakeShowInformationMessage = sandbox.stub( - vscode.window, - 'showInformationMessage' - ); + showErrorMessageStub = sinon.stub(vscode.window, 'showErrorMessage'); }); afterEach(() => { @@ -92,39 +90,35 @@ suite('Playground Controller Test Suite', function () { }); suite('passing connection details to service provider', () => { - let mockConnectToServiceProvider: sinon.SinonSpy; + let fakeConnectToServiceProvider: SinonSpy; beforeEach(async () => { - const mockGetActiveConnectionName = sinon.fake.returns('fakeName'); + const fakeGetActiveConnectionName = sinon.fake.returns('fakeName'); const mockActiveDataService = { getMongoClientConnectionOptions: () => ({ url: 'mongodb://username@ldaphost:27017/?authMechanism=MONGODB-X509&readPreference=primary&appname=mongodb-vscode+0.0.0-dev.0&ssl=true&authSource=%24external&tlsAllowInvalidCertificates=true&tlsAllowInvalidHostnames=true&tlsCAFile=./path/to/ca&tlsCertificateKeyFile=./path/to/cert', options: { monitorCommands: true }, }), } as DataService; - const mockGetActiveConnectionId = sinon.fake.returns('pineapple'); - mockConnectToServiceProvider = sinon.fake.resolves(undefined); + const fakeGetActiveConnectionId = sinon.fake.returns('pineapple'); + fakeConnectToServiceProvider = sinon.fake.resolves(undefined); sinon.replace( testPlaygroundController._connectionController, 'getActiveConnectionName', - mockGetActiveConnectionName - ); - sinon.replace( - testPlaygroundController._connectionController, - 'isCurrentlyConnected', - () => true + fakeGetActiveConnectionName ); sinon.replace( testPlaygroundController._connectionController, 'getActiveConnectionId', - mockGetActiveConnectionId + fakeGetActiveConnectionId ); sinon.replace( testPlaygroundController._languageServerController, 'connectToServiceProvider', - mockConnectToServiceProvider + fakeConnectToServiceProvider ); + sinon.stub(vscode.window, 'showInformationMessage'); testPlaygroundController._connectionController.setActiveDataService( mockActiveDataService @@ -132,10 +126,14 @@ suite('Playground Controller Test Suite', function () { await testPlaygroundController._connectToServiceProvider(); }); + afterEach(() => { + sinon.restore(); + }); + test('it should pass the active connection id to the language server for connecting', () => { expect( ( - mockConnectToServiceProvider.firstCall.firstArg as { + fakeConnectToServiceProvider.firstCall.firstArg as { connectionId: string; } ).connectionId @@ -145,14 +143,14 @@ suite('Playground Controller Test Suite', function () { test('it should pass ssl strings to the language server for connecting', () => { expect( ( - mockConnectToServiceProvider.firstCall.firstArg as { + fakeConnectToServiceProvider.firstCall.firstArg as { connectionString: string; } ).connectionString ).includes('./path/to/cert'); expect( ( - mockConnectToServiceProvider.firstCall.firstArg as { + fakeConnectToServiceProvider.firstCall.firstArg as { connectionString: string; } ).connectionString @@ -161,45 +159,45 @@ suite('Playground Controller Test Suite', function () { }); suite('playground is not open', () => { + let showInformationMessageStub: SinonStub; testPlaygroundController._activeTextEditor = undefined; - test('run all playground blocks should throw the playground not found error', async () => { - const expectedMessage = - "Please open a '.mongodb' playground file before running it."; - const fakeShowErrorMessage: any = sinon.fake(); - sinon.replace(vscode.window, 'showErrorMessage', fakeShowErrorMessage); + beforeEach(() => { + showInformationMessageStub = sinon.stub( + vscode.window, + 'showInformationMessage' + ); + }); - try { - await testPlaygroundController.runAllPlaygroundBlocks(); - } catch (error) { - expect(fakeShowErrorMessage.firstArg).to.be.equal(expectedMessage); - } + afterEach(() => { + sinon.restore(); }); - test('run selected playground blocks should throw the playground not found error', async () => { + test('run all playground tells to open a playground file', async () => { const expectedMessage = - "Please open a '.mongodb' playground file before running it."; - const fakeShowErrorMessage: any = sinon.fake(); - sinon.replace(vscode.window, 'showErrorMessage', fakeShowErrorMessage); - - try { - await testPlaygroundController.runSelectedPlaygroundBlocks(); - } catch (error) { - expect(fakeShowErrorMessage.firstArg).to.be.equal(expectedMessage); - } + 'Please open a MongoDB playground file before running it.'; + await testPlaygroundController.runAllPlaygroundBlocks(); + expect(showErrorMessageStub.firstCall.args[0]).to.be.equal( + expectedMessage + ); }); - test('run all or selected playground blocks should throw the playground not found error', async () => { + test('run selected playground blocks tells to select one or more lines in the playground', async () => { const expectedMessage = - "Please open a '.mongodb' playground file before running it."; - const fakeShowErrorMessage: any = sinon.fake(); - sinon.replace(vscode.window, 'showErrorMessage', fakeShowErrorMessage); + 'Please select one or more lines in the playground.'; + await testPlaygroundController.runSelectedPlaygroundBlocks(); + expect(showInformationMessageStub.firstCall.args[0]).to.be.equal( + expectedMessage + ); + }); - try { - await testPlaygroundController.runAllOrSelectedPlaygroundBlocks(); - } catch (error) { - expect(fakeShowErrorMessage.firstArg).to.be.equal(expectedMessage); - } + test('run all or selected playground blocks tells to select one or more lines in the playground', async () => { + const expectedMessage = + 'Please open a MongoDB playground file before running it.'; + await testPlaygroundController.runAllOrSelectedPlaygroundBlocks(); + expect(showErrorMessageStub.firstCall.args[0]).to.be.equal( + expectedMessage + ); }); }); @@ -209,7 +207,7 @@ suite('Playground Controller Test Suite', function () { `playground-${uuidv4()}.mongodb.js` ); const documentUri = vscode.Uri.from({ path: fileName, scheme: 'untitled' }); - const activeTestEditorMock: unknown = { + const mockActiveTestEditor: unknown = { document: { languageId: 'javascript', uri: documentUri, @@ -226,176 +224,109 @@ suite('Playground Controller Test Suite', function () { beforeEach(() => { testPlaygroundController._activeTextEditor = - activeTestEditorMock as vscode.TextEditor; + mockActiveTestEditor as vscode.TextEditor; + testPlaygroundController._selectedText = undefined; + sinon.stub(vscode.window, 'showInformationMessage'); }); - suite('user is not connected', () => { - before(() => { - const mockGetActiveConnectionName = sinon.fake.returns(''); + afterEach(() => { + sinon.restore(); + }); + suite('user is not connected', () => { + beforeEach(() => { sinon.replace( testPlaygroundController._connectionController, - 'getActiveConnectionName', - mockGetActiveConnectionName + 'isCurrentlyConnected', + sinon.fake.returns(false) ); }); - test('run all playground blocks should throw the error', async () => { + afterEach(() => { + sinon.restore(); + }); + + test('run all playground blocks shows please connect to a database error', async () => { const expectedMessage = 'Please connect to a database before running a playground.'; - const fakeShowErrorMessage: any = sinon.fake(); - sinon.replace(vscode.window, 'showErrorMessage', fakeShowErrorMessage); - - try { - await testPlaygroundController.runAllPlaygroundBlocks(); - } catch (error) { - expect(fakeShowErrorMessage.firstArg).to.be.equal(expectedMessage); - } + await testPlaygroundController.runAllPlaygroundBlocks(); + expect(showErrorMessageStub.firstCall.args[0]).to.be.equal( + expectedMessage + ); }); - test('run selected playground blocks should throw the error', async () => { + test('run selected playground blocks shows please connect to a database error', async () => { + testPlaygroundController._selectedText = '{}'; const expectedMessage = 'Please connect to a database before running a playground.'; - const fakeShowErrorMessage: any = sinon.fake(); - sinon.replace(vscode.window, 'showErrorMessage', fakeShowErrorMessage); - - try { - await testPlaygroundController.runSelectedPlaygroundBlocks(); - } catch (error) { - expect(fakeShowErrorMessage.firstArg).to.be.equal(expectedMessage); - } + await testPlaygroundController.runSelectedPlaygroundBlocks(); + expect(showErrorMessageStub.firstCall.args[0]).to.be.equal( + expectedMessage + ); }); - test('run all or selected playground blocks should throw the error', async () => { + test('run all or selected playground blocks shows please connect to a database error', async () => { + testPlaygroundController._selectedText = '{}'; const expectedMessage = 'Please connect to a database before running a playground.'; - const fakeShowErrorMessage: any = sinon.fake(); - sinon.replace(vscode.window, 'showErrorMessage', fakeShowErrorMessage); - - try { - await testPlaygroundController.runAllOrSelectedPlaygroundBlocks(); - } catch (error) { - expect(fakeShowErrorMessage.firstArg).to.be.equal(expectedMessage); - } + await testPlaygroundController.runAllOrSelectedPlaygroundBlocks(); + expect(showErrorMessageStub.firstCall.args[0]).to.be.equal( + expectedMessage + ); }); }); suite('user is connected', () => { + let showTextDocumentStub: SinonStub; + beforeEach(async () => { - const mockGetActiveConnectionName = sinon.fake.returns('fakeName'); - const mockGetActiveDataService = sinon.fake.returns({ + const fakeGetActiveConnectionName = sinon.fake.returns('fakeName'); + const fakeGetActiveDataService = sinon.fake.returns({ getMongoClientConnectionOptions: () => ({ url: TEST_DATABASE_URI, options: {}, }), }); - const mockGetActiveConnectionId = sinon.fake.returns('pineapple'); + const fakeGetActiveConnectionId = sinon.fake.returns('pineapple'); sinon.replace( testPlaygroundController._connectionController, 'getActiveConnectionName', - mockGetActiveConnectionName + fakeGetActiveConnectionName ); sinon.replace( testPlaygroundController._connectionController, 'isCurrentlyConnected', - () => true + sinon.fake.returns(true) ); sinon.replace( testPlaygroundController._connectionController, 'getActiveDataService', - mockGetActiveDataService + fakeGetActiveDataService ); sinon.replace( testPlaygroundController._connectionController, 'getActiveConnectionId', - mockGetActiveConnectionId + fakeGetActiveConnectionId ); + showTextDocumentStub = sinon.stub(vscode.window, 'showTextDocument'); await testPlaygroundController._connectToServiceProvider(); }); - test('keep a playground in focus after running it', async () => { - const mockShowTextDocument: any = sinon.fake(); - sinon.replace(vscode.window, 'showTextDocument', mockShowTextDocument); + afterEach(() => { + sinon.restore(); + }); + test('keep a playground in focus after running it', async () => { await testPlaygroundController._showResultAsVirtualDocument(); - const showTextDocumentOptions = mockShowTextDocument.lastArg; - + const showTextDocumentOptions = showTextDocumentStub.getCall(0).lastArg; expect(showTextDocumentOptions.preview).to.be.equal(false); expect(showTextDocumentOptions.preserveFocus).to.be.equal(true); expect(showTextDocumentOptions.viewColumn).to.be.equal(-2); }); - test('show a confirmation message if mdb.confirmRunAll is true', async () => { - fakeShowInformationMessage.resolves('Yes'); - - const mockEvaluateWithCancelModal = sinon.fake.resolves({ - outputLines: [], - result: '123', - }); - sinon.replace( - testPlaygroundController, - '_evaluateWithCancelModal', - mockEvaluateWithCancelModal - ); - - const mockOpenPlaygroundResult = sinon.fake(); - sinon.replace( - testPlaygroundController, - '_openPlaygroundResult', - mockOpenPlaygroundResult - ); - - const result = await testPlaygroundController.runAllPlaygroundBlocks(); - - expect(result).to.be.equal(true); - sinon.assert.called(fakeShowInformationMessage); - }); - - test('do not show a confirmation message if mdb.confirmRunAll is false', async () => { - fakeShowInformationMessage.resolves('Yes'); - - await vscode.workspace - .getConfiguration('mdb') - .update('confirmRunAll', false); - - const mockEvaluateWithCancelModal = sinon.fake.resolves({ - outputLines: [], - result: '123', - }); - sinon.replace( - testPlaygroundController, - '_evaluateWithCancelModal', - mockEvaluateWithCancelModal - ); - - const mockOpenPlaygroundResult = sinon.fake(); - sinon.replace( - testPlaygroundController, - '_openPlaygroundResult', - mockOpenPlaygroundResult - ); - - const result = await testPlaygroundController.runAllPlaygroundBlocks(); - - expect(result).to.be.equal(true); - sinon.assert.notCalled(fakeShowInformationMessage); - }); - - test('do not run a playground if user selected No in the confirmation message', async () => { - await vscode.workspace - .getConfiguration('mdb') - .update('confirmRunAll', true); - - fakeShowInformationMessage.resolves('No'); - - const result = await testPlaygroundController.runAllPlaygroundBlocks(); - - expect(result).to.be.false; - }); - test('close cancelation modal when a playground is canceled', async () => { sinon.replace( testPlaygroundController, @@ -418,35 +349,31 @@ suite('Playground Controller Test Suite', function () { ); (mockConnectionDisposedError as any).code = -32097; sinon - .stub(mockLanguageServerController, 'executeAll') + .stub(languageServerControllerStub, 'executeAll') .rejects(mockConnectionDisposedError); const stubStartLanguageServer = sinon - .stub(mockLanguageServerController, 'startLanguageServer') + .stub(languageServerControllerStub, 'startLanguageServer') .resolves(); const stubConnectToServiceProvider = sinon .stub(testPlaygroundController, '_connectToServiceProvider') .resolves(); - const stubVSCodeErrorMessage = sinon - .stub(vscode.window, 'showErrorMessage') - .resolves(undefined); - try { await testPlaygroundController._evaluate('console.log("test");'); // It should have thrown in the above evaluation. expect(true).to.equal(false); - } catch (err: any) { - expect(err.message).to.equal( + } catch (error) { + expect((error).message).to.equal( 'Pending response rejected since connection got disposed' ); - expect(err.code).to.equal(-32097); + expect((error).code).to.equal(-32097); } - expect(stubVSCodeErrorMessage.calledOnce).to.equal(true); - expect(stubVSCodeErrorMessage.firstCall.args[0]).to.equal( + expect(showErrorMessageStub.calledOnce).to.equal(true); + expect(showErrorMessageStub.firstCall.args[0]).to.equal( 'An error occurred when running the playground. This can occur when the playground runner runs out of memory.' ); @@ -458,7 +385,7 @@ suite('Playground Controller Test Suite', function () { sandbox.replaceGetter( vscode.window, 'activeTextEditor', - () => activeTestEditorMock as vscode.TextEditor + () => mockActiveTestEditor as vscode.TextEditor ); const testExplorerController = new ExplorerController( @@ -466,7 +393,7 @@ suite('Playground Controller Test Suite', function () { ); const playgroundControllerTest = new PlaygroundController( testConnectionController, - mockLanguageServerController as LanguageServerController, + languageServerControllerStub as LanguageServerController, testTelemetryService, testStatusView, testPlaygroundResultProvider, @@ -477,7 +404,7 @@ suite('Playground Controller Test Suite', function () { ); expect(playgroundControllerTest._activeTextEditor).to.deep.equal( - activeTestEditorMock + mockActiveTestEditor ); }); @@ -487,7 +414,7 @@ suite('Playground Controller Test Suite', function () { ); const playgroundControllerTest = new PlaygroundController( testConnectionController, - mockLanguageServerController as LanguageServerController, + languageServerControllerStub as LanguageServerController, testTelemetryService, testStatusView, testPlaygroundResultProvider, @@ -506,10 +433,6 @@ suite('Playground Controller Test Suite', function () { document: { getText: () => textFromEditor }, } as vscode.TextEditor; - const fakeVscodeErrorMessage = sinon - .stub(vscode.window, 'showErrorMessage') - .resolves(undefined); - playgroundControllerTest._selectedText = '{ name: qwerty }'; playgroundControllerTest._playgroundSelectedCodeActionProvider.selection = selection; @@ -521,10 +444,93 @@ suite('Playground Controller Test Suite', function () { const expectedMessage = "Unable to export to csharp language: Symbol 'qwerty' is undefined"; - expect(fakeVscodeErrorMessage.firstCall.args[0]).to.equal( + expect(showErrorMessageStub.firstCall.args[0]).to.equal( expectedMessage ); }); }); }); + + suite('confirmation modal', () => { + let showInformationMessageStub: SinonStub; + + beforeEach(() => { + showInformationMessageStub = sinon.stub( + vscode.window, + 'showInformationMessage' + ); + }); + + afterEach(() => { + sinon.restore(); + }); + + test('show a confirmation message if mdb.confirmRunAll is true', async () => { + showInformationMessageStub.resolves('Yes'); + + const fakeEvaluateWithCancelModal = sinon.fake.resolves({ + outputLines: [], + result: '123', + }); + sinon.replace( + testPlaygroundController, + '_evaluateWithCancelModal', + fakeEvaluateWithCancelModal + ); + + const fakeOpenPlaygroundResult = sinon.fake(); + sinon.replace( + testPlaygroundController, + '_openPlaygroundResult', + fakeOpenPlaygroundResult + ); + + const result = await testPlaygroundController.runAllPlaygroundBlocks(); + + expect(result).to.be.equal(true); + sinon.assert.called(showInformationMessageStub); + }); + + test('do not show a confirmation message if mdb.confirmRunAll is false', async () => { + showInformationMessageStub.resolves('Yes'); + + await vscode.workspace + .getConfiguration('mdb') + .update('confirmRunAll', false); + + const fakeEvaluateWithCancelModal = sinon.fake.resolves({ + outputLines: [], + result: '123', + }); + sinon.replace( + testPlaygroundController, + '_evaluateWithCancelModal', + fakeEvaluateWithCancelModal + ); + + const fakeOpenPlaygroundResult = sinon.fake(); + sinon.replace( + testPlaygroundController, + '_openPlaygroundResult', + fakeOpenPlaygroundResult + ); + + const result = await testPlaygroundController.runAllPlaygroundBlocks(); + + expect(result).to.be.equal(true); + sinon.assert.notCalled(showInformationMessageStub); + }); + + test('do not run a playground if user selected No in the confirmation message', async () => { + showInformationMessageStub.resolves('No'); + + await vscode.workspace + .getConfiguration('mdb') + .update('confirmRunAll', true); + + const result = await testPlaygroundController.runAllPlaygroundBlocks(); + + expect(result).to.be.false; + }); + }); }); diff --git a/src/test/suite/editors/playgroundResultProvider.test.ts b/src/test/suite/editors/playgroundResultProvider.test.ts index 5004fa548..39847be68 100644 --- a/src/test/suite/editors/playgroundResultProvider.test.ts +++ b/src/test/suite/editors/playgroundResultProvider.test.ts @@ -15,21 +15,21 @@ import PlaygroundResultProvider from '../../../editors/playgroundResultProvider' import { StatusView } from '../../../views'; import { StorageController } from '../../../storage'; import TelemetryService from '../../../telemetry/telemetryService'; -import { TestExtensionContext } from '../stubs'; +import { ExtensionContextStub } from '../stubs'; const expect = chai.expect; suite('Playground Result Provider Test Suite', () => { - const mockExtensionContext = new TestExtensionContext(); - const mockStorageController = new StorageController(mockExtensionContext); + const extensionContextStub = new ExtensionContextStub(); + const testStorageController = new StorageController(extensionContextStub); const testTelemetryService = new TelemetryService( - mockStorageController, - mockExtensionContext + testStorageController, + extensionContextStub ); - const testStatusView = new StatusView(mockExtensionContext); + const testStatusView = new StatusView(extensionContextStub); const testConnectionController = new ConnectionController( testStatusView, - mockStorageController, + testStorageController, testTelemetryService ); const testEditDocumentCodeLensProvider = new EditDocumentCodeLensProvider( @@ -47,7 +47,6 @@ suite('Playground Result Provider Test Suite', () => { testConnectionController, testEditDocumentCodeLensProvider ); - expect(testPlaygroundResultViewProvider._playgroundResult).to.be.deep.equal( { namespace: null, @@ -72,9 +71,7 @@ suite('Playground Result Provider Test Suite', () => { }, language: 'json', }; - testPlaygroundResultViewProvider.setPlaygroundResult(playgroundResult); - expect(testPlaygroundResultViewProvider._playgroundResult).to.be.deep.equal( playgroundResult ); @@ -85,7 +82,6 @@ suite('Playground Result Provider Test Suite', () => { testConnectionController, testEditDocumentCodeLensProvider ); - testPlaygroundResultViewProvider._playgroundResult = { namespace: 'db.berlin', type: 'undefined', @@ -95,7 +91,6 @@ suite('Playground Result Provider Test Suite', () => { const result = testPlaygroundResultViewProvider.provideTextDocumentContent(); - expect(result).to.be.equal('undefined'); }); @@ -104,7 +99,6 @@ suite('Playground Result Provider Test Suite', () => { testConnectionController, testEditDocumentCodeLensProvider ); - testPlaygroundResultViewProvider._playgroundResult = { namespace: 'db.berlin', type: 'object', @@ -114,7 +108,6 @@ suite('Playground Result Provider Test Suite', () => { const result = testPlaygroundResultViewProvider.provideTextDocumentContent(); - expect(result).to.be.equal('null'); }); @@ -123,7 +116,6 @@ suite('Playground Result Provider Test Suite', () => { testConnectionController, testEditDocumentCodeLensProvider ); - testPlaygroundResultViewProvider._playgroundResult = { namespace: 'db.berlin', type: 'number', @@ -133,7 +125,6 @@ suite('Playground Result Provider Test Suite', () => { const result = testPlaygroundResultViewProvider.provideTextDocumentContent(); - expect(result).to.be.equal('4'); }); @@ -142,7 +133,6 @@ suite('Playground Result Provider Test Suite', () => { testConnectionController, testEditDocumentCodeLensProvider ); - testPlaygroundResultViewProvider._playgroundResult = { namespace: 'db.berlin', type: 'object', @@ -152,7 +142,6 @@ suite('Playground Result Provider Test Suite', () => { const result = testPlaygroundResultViewProvider.provideTextDocumentContent(); - expect(result).to.be.equal('[]'); }); @@ -161,7 +150,6 @@ suite('Playground Result Provider Test Suite', () => { testConnectionController, testEditDocumentCodeLensProvider ); - testPlaygroundResultViewProvider._playgroundResult = { namespace: 'db.berlin', type: 'object', @@ -171,7 +159,6 @@ suite('Playground Result Provider Test Suite', () => { const result = testPlaygroundResultViewProvider.provideTextDocumentContent(); - expect(result).to.be.equal('{}'); }); @@ -180,7 +167,6 @@ suite('Playground Result Provider Test Suite', () => { testConnectionController, testEditDocumentCodeLensProvider ); - testPlaygroundResultViewProvider._playgroundResult = { namespace: 'db.berlin', type: 'boolean', @@ -190,7 +176,6 @@ suite('Playground Result Provider Test Suite', () => { const result = testPlaygroundResultViewProvider.provideTextDocumentContent(); - expect(result).to.be.equal('true'); }); @@ -199,7 +184,6 @@ suite('Playground Result Provider Test Suite', () => { testConnectionController, testEditDocumentCodeLensProvider ); - testPlaygroundResultViewProvider._playgroundResult = { namespace: 'db.berlin', type: 'string', @@ -209,7 +193,6 @@ suite('Playground Result Provider Test Suite', () => { const result = testPlaygroundResultViewProvider.provideTextDocumentContent(); - expect(result).to.be.equal('Berlin'); }); @@ -235,21 +218,22 @@ suite('Playground Result Provider Test Suite', () => { language: 'json', }; - const mockRefresh = sinon.fake(); + const fakeUpdateCodeLensesForPlayground = sinon.fake(); sinon.replace( testPlaygroundResultViewProvider._editDocumentCodeLensProvider, 'updateCodeLensesForPlayground', - mockRefresh + fakeUpdateCodeLensesForPlayground ); testPlaygroundResultViewProvider._playgroundResult = playgroundResult; const result = testPlaygroundResultViewProvider.provideTextDocumentContent(); - expect(result).to.be.equal(JSON.stringify(content, null, 2)); - expect(mockRefresh.calledOnce).to.equal(true); - expect(mockRefresh.firstCall.firstArg).to.be.deep.equal(playgroundResult); + expect(fakeUpdateCodeLensesForPlayground.calledOnce).to.equal(true); + expect( + fakeUpdateCodeLensesForPlayground.firstCall.firstArg + ).to.be.deep.equal(playgroundResult); }); test('provideTextDocumentContent returns Document formatted to string if content is string', () => { @@ -268,21 +252,22 @@ suite('Playground Result Provider Test Suite', () => { language: 'json', }; - const mockRefresh = sinon.fake(); + const fakeUpdateCodeLensesForPlayground = sinon.fake(); sinon.replace( testPlaygroundResultViewProvider._editDocumentCodeLensProvider, 'updateCodeLensesForPlayground', - mockRefresh + fakeUpdateCodeLensesForPlayground ); testPlaygroundResultViewProvider._playgroundResult = playgroundResult; const result = testPlaygroundResultViewProvider.provideTextDocumentContent(); - expect(result).to.be.equal(JSON.stringify(content, null, 2)); - expect(mockRefresh.calledOnce).to.equal(true); - expect(mockRefresh.firstCall.firstArg).to.be.deep.equal(playgroundResult); + expect(fakeUpdateCodeLensesForPlayground.calledOnce).to.equal(true); + expect( + fakeUpdateCodeLensesForPlayground.firstCall.firstArg + ).to.be.deep.equal(playgroundResult); }); test('provideTextDocumentContent sets different code lenses for the playground and the collection', async () => { @@ -314,11 +299,11 @@ suite('Playground Result Provider Test Suite', () => { }; const connectionId = '1c8c2b06-fbfb-40b7-bd8a-bd1f8333a487'; - const mockActiveConnectionId = sinon.fake.returns(connectionId); + const fakeActiveConnectionId = sinon.fake.returns(connectionId); sinon.replace( testConnectionController, 'getActiveConnectionId', - mockActiveConnectionId + fakeActiveConnectionId ); const playgroundResultUri = vscode.Uri.parse( @@ -339,26 +324,21 @@ suite('Playground Result Provider Test Suite', () => { let codeLenses = testPlaygroundResultViewProvider._editDocumentCodeLensProvider.provideCodeLenses(); - expect(codeLenses.length).to.be.equal(2); let firstCodeLensRange = codeLenses[0].range; - expect(firstCodeLensRange.start.line).to.be.equal(2); expect(codeLenses[0].command?.title).to.be.equal('Edit Document'); const secondCodeLensRange = codeLenses[1].range; - expect(secondCodeLensRange.start.line).to.be.equal(9); let codeLensesInfo = testPlaygroundResultViewProvider._editDocumentCodeLensProvider ._codeLensesInfo; - expect(Object.keys(codeLensesInfo).length).to.be.equal(1); let firstCodeLensesInfo = codeLensesInfo[playgroundResultUri.toString()]; - expect(firstCodeLensesInfo.length).to.be.equal(2); expect(firstCodeLensesInfo[0].documentId).to.be.equal(1); expect(firstCodeLensesInfo[0].source).to.be.equal('playground'); @@ -374,7 +354,7 @@ suite('Playground Result Provider Test Suite', () => { const testQueryStore = new CollectionDocumentsOperationsStore(); const testCollectionViewProvider = new CollectionDocumentsProvider( - mockExtensionContext, + extensionContextStub, testConnectionController, testQueryStore, testStatusView, @@ -398,18 +378,18 @@ suite('Playground Result Provider Test Suite', () => { }, } as unknown as DataService); - const mockShowMessage = sinon.fake(); + const fakeShowMessage = sinon.fake(); sinon.replace( testCollectionViewProvider._statusView, 'showMessage', - mockShowMessage + fakeShowMessage ); - const mockHideMessage = sinon.fake(); + const fakeHideMessage = sinon.fake(); sinon.replace( testCollectionViewProvider._statusView, 'hideMessage', - mockHideMessage + fakeHideMessage ); const operationId = @@ -459,7 +439,6 @@ suite('Playground Result Provider Test Suite', () => { expect(firstCodeLensesInfo[1].line).to.be.equal(9); const secondCodeLensesInfo = codeLensesInfo[collectionUri.toString()]; - expect(secondCodeLensesInfo.length).to.be.equal(1); expect(secondCodeLensesInfo[0].documentId).to.be.equal( '5ea8745ee4811fafe8b65ecb' diff --git a/src/test/suite/editors/playgroundSelectedCodeActionProvider.test.ts b/src/test/suite/editors/playgroundSelectedCodeActionProvider.test.ts index 54419a582..66d969bf0 100644 --- a/src/test/suite/editors/playgroundSelectedCodeActionProvider.test.ts +++ b/src/test/suite/editors/playgroundSelectedCodeActionProvider.test.ts @@ -15,17 +15,17 @@ import { ExportToLanguageMode, } from '../../../types/playgroundType'; import { TEST_DATABASE_URI } from '../dbTestHelper'; -import { TestExtensionContext } from '../stubs'; +import { ExtensionContextStub } from '../stubs'; const expect = chai.expect; suite('Playground Selected CodeAction Provider Test Suite', function () { this.timeout(5000); - const mockExtensionContext = new TestExtensionContext(); + const extensionContextStub = new ExtensionContextStub(); // The test extension runner. - mockExtensionContext.extensionPath = '../../'; + extensionContextStub.extensionPath = '../../'; suite('the MongoDB playground in JS', () => { const testCodeActionProvider = new PlaygroundSelectedCodeActionProvider(); @@ -34,13 +34,9 @@ suite('Playground Selected CodeAction Provider Test Suite', function () { sinon.replace( mdbTestExtension.testExtensionController, '_languageServerController', - new LanguageServerController(mockExtensionContext) - ); - sinon.replace( - vscode.window, - 'showInformationMessage', - sinon.fake.resolves(true) + new LanguageServerController(extensionContextStub) ); + sinon.stub(vscode.window, 'showInformationMessage'); await mdbTestExtension.testExtensionController._connectionController.addNewConnectionStringAndConnect( TEST_DATABASE_URI @@ -69,11 +65,11 @@ suite('Playground Selected CodeAction Provider Test Suite', function () { testExplorerController ); - const mockOpenPlaygroundResult: any = sinon.fake(); + const fakeOpenPlaygroundResult = sinon.fake(); sinon.replace( mdbTestExtension.testExtensionController._playgroundController, '_openPlaygroundResult', - mockOpenPlaygroundResult + fakeOpenPlaygroundResult ); await vscode.workspace @@ -83,8 +79,8 @@ suite('Playground Selected CodeAction Provider Test Suite', function () { await mdbTestExtension.testExtensionController._languageServerController.startLanguageServer(); await mdbTestExtension.testExtensionController._playgroundController._connectToServiceProvider(); - const mockIsPlayground = sinon.fake.returns(true); - sinon.replace(testCodeActionProvider, 'isPlayground', mockIsPlayground); + const fakeIsPlayground = sinon.fake.returns(true); + sinon.replace(testCodeActionProvider, 'isPlayground', fakeIsPlayground); }); afterEach(async () => { @@ -478,8 +474,8 @@ suite('Playground Selected CodeAction Provider Test Suite', function () { const testCodeActionProvider = new PlaygroundSelectedCodeActionProvider(); beforeEach(() => { - const mockIsPlayground = sinon.fake.returns(false); - sinon.replace(testCodeActionProvider, 'isPlayground', mockIsPlayground); + const fakeIsPlayground = sinon.fake.returns(false); + sinon.replace(testCodeActionProvider, 'isPlayground', fakeIsPlayground); }); afterEach(() => { diff --git a/src/test/suite/explorer/collectionTreeItem.test.ts b/src/test/suite/explorer/collectionTreeItem.test.ts index 1fc1f9702..2aaa57c51 100644 --- a/src/test/suite/explorer/collectionTreeItem.test.ts +++ b/src/test/suite/explorer/collectionTreeItem.test.ts @@ -3,12 +3,12 @@ import assert from 'assert'; import CollectionTreeItem from '../../../explorer/collectionTreeItem'; import { CollectionTypes } from '../../../explorer/documentListTreeItem'; import { ext } from '../../../extensionConstants'; -import { TestExtensionContext, DataServiceStub } from '../stubs'; +import { ExtensionContextStub, DataServiceStub } from '../stubs'; const { contributes } = require('../../../../package.json'); suite('CollectionTreeItem Test Suite', () => { - ext.context = new TestExtensionContext(); + ext.context = new ExtensionContextStub(); test('its context value should be in the package json', () => { let registeredCommandInPackageJson = false; @@ -115,7 +115,7 @@ suite('CollectionTreeItem Test Suite', () => { null ); - const viewIconPath: any = testCollectionViewTreeItem.iconPath; + const viewIconPath = testCollectionViewTreeItem.iconPath; assert( viewIconPath.light.includes('view-folder.svg'), 'Expected icon path to point to an svg by the name "view-folder" with a light mode' @@ -137,7 +137,7 @@ suite('CollectionTreeItem Test Suite', () => { null ); - const collectionIconPath: any = testCollectionCollectionTreeItem.iconPath; + const collectionIconPath = testCollectionCollectionTreeItem.iconPath; assert( collectionIconPath.light.includes('collection-folder-closed.svg'), 'Expected icon path to point to an svg by the name "collection" with a light mode' @@ -161,7 +161,7 @@ suite('CollectionTreeItem Test Suite', () => { null ); - const viewIconPath: any = testCollectionViewTreeItem.iconPath; + const viewIconPath = testCollectionViewTreeItem.iconPath; assert( viewIconPath.light.includes('collection-timeseries.svg'), 'Expected icon path to point to an svg by the name "collection-timeseries" with a light mode' @@ -183,7 +183,7 @@ suite('CollectionTreeItem Test Suite', () => { null ); - const collectionIconPath: any = testCollectionCollectionTreeItem.iconPath; + const collectionIconPath = testCollectionCollectionTreeItem.iconPath; assert( collectionIconPath.light.includes('collection-folder-closed.svg'), 'Expected icon path to point to an svg by the name "collection" with a light mode' diff --git a/src/test/suite/explorer/documentListTreeItem.test.ts b/src/test/suite/explorer/documentListTreeItem.test.ts index 0454fb6c0..707bb141b 100644 --- a/src/test/suite/explorer/documentListTreeItem.test.ts +++ b/src/test/suite/explorer/documentListTreeItem.test.ts @@ -14,10 +14,10 @@ import DocumentListTreeItem, { import { DataServiceStub, mockDocuments } from '../stubs'; suite('DocumentListTreeItem Test Suite', () => { - let dataServiceMock: DataService; + let dataServiceStub: DataService; before(() => { - dataServiceMock = new DataServiceStub() as unknown as DataService; + dataServiceStub = new DataServiceStub() as unknown as DataService; }); test('its context value should be in the package json', () => { @@ -26,7 +26,7 @@ suite('DocumentListTreeItem Test Suite', () => { 'collectionName', 'databaseName', CollectionTypes.collection, - dataServiceMock, + dataServiceStub, false, MAX_DOCUMENTS_VISIBLE, null, @@ -83,7 +83,7 @@ suite('DocumentListTreeItem Test Suite', () => { 'mock_collection_name', 'mock_db_name', CollectionTypes.collection, - dataServiceMock, + dataServiceStub, false, MAX_DOCUMENTS_VISIBLE, null, @@ -104,7 +104,7 @@ suite('DocumentListTreeItem Test Suite', () => { 'mock_collection_name', 'mock_db_name', CollectionTypes.collection, - dataServiceMock, + dataServiceStub, false, MAX_DOCUMENTS_VISIBLE, null, @@ -127,7 +127,7 @@ suite('DocumentListTreeItem Test Suite', () => { 'mock_collection_name', 'mock_db_name', CollectionTypes.view, - dataServiceMock, + dataServiceStub, false, MAX_DOCUMENTS_VISIBLE, null, @@ -147,7 +147,7 @@ suite('DocumentListTreeItem Test Suite', () => { 'mock_collection_name_1', 'mock_db_name', CollectionTypes.collection, - dataServiceMock, + dataServiceStub, false, MAX_DOCUMENTS_VISIBLE, 25, @@ -174,7 +174,7 @@ suite('DocumentListTreeItem Test Suite', () => { 'mock_collection_name_2', 'mock_db_name', CollectionTypes.collection, - dataServiceMock, + dataServiceStub, false, MAX_DOCUMENTS_VISIBLE, 25, @@ -201,7 +201,7 @@ suite('DocumentListTreeItem Test Suite', () => { 'mock_collection_name_3', 'mock_db_name', CollectionTypes.collection, - dataServiceMock, + dataServiceStub, false, MAX_DOCUMENTS_VISIBLE, 25, @@ -233,7 +233,7 @@ suite('DocumentListTreeItem Test Suite', () => { 'mock_collection_name_4', 'mock_db_name', CollectionTypes.collection, - dataServiceMock, + dataServiceStub, false, MAX_DOCUMENTS_VISIBLE, 25, @@ -266,7 +266,7 @@ suite('DocumentListTreeItem Test Suite', () => { 'mock_collection_name_1', 'mock_db_name', CollectionTypes.collection, - dataServiceMock, + dataServiceStub, false, MAX_DOCUMENTS_VISIBLE, maxDocs, @@ -283,7 +283,7 @@ suite('DocumentListTreeItem Test Suite', () => { 'mock_collection_name_4', 'mock_db_name', CollectionTypes.collection, - dataServiceMock, + dataServiceStub, false, MAX_DOCUMENTS_VISIBLE, maxDocs, @@ -308,7 +308,7 @@ suite('DocumentListTreeItem Test Suite', () => { 'mock_collection_name_4', 'mock_db_name', CollectionTypes.view, - dataServiceMock, + dataServiceStub, false, MAX_DOCUMENTS_VISIBLE, null, @@ -317,7 +317,7 @@ suite('DocumentListTreeItem Test Suite', () => { [] ); - const viewIconPath: any = testCollectionViewTreeItem.iconPath; + const viewIconPath = testCollectionViewTreeItem.iconPath; assert( viewIconPath.dark.includes('documents.svg'), 'Expected icon path to point to an svg by the name "documents" a dark mode' @@ -327,7 +327,7 @@ suite('DocumentListTreeItem Test Suite', () => { 'mock_collection_name_4', 'mock_db_name', CollectionTypes.collection, - dataServiceMock, + dataServiceStub, false, MAX_DOCUMENTS_VISIBLE, null, @@ -336,7 +336,7 @@ suite('DocumentListTreeItem Test Suite', () => { [] ); - const collectionIconPath: any = testDocumentListTreeItem.iconPath; + const collectionIconPath = testDocumentListTreeItem.iconPath; assert( collectionIconPath.dark.includes('documents.svg'), 'Expected icon path to point to an svg by the name "documents" with a light mode' @@ -348,7 +348,7 @@ suite('DocumentListTreeItem Test Suite', () => { 'mock_collection_name_4', 'mock_db_name', CollectionTypes.collection, - dataServiceMock, + dataServiceStub, false, MAX_DOCUMENTS_VISIBLE, 25, @@ -365,7 +365,7 @@ suite('DocumentListTreeItem Test Suite', () => { 'mock_collection_name_4', 'mock_db_name', CollectionTypes.collection, - dataServiceMock, + dataServiceStub, false, MAX_DOCUMENTS_VISIBLE, 2200000, diff --git a/src/test/suite/explorer/documentTreeItem.test.ts b/src/test/suite/explorer/documentTreeItem.test.ts index 640828450..e7b48e77c 100644 --- a/src/test/suite/explorer/documentTreeItem.test.ts +++ b/src/test/suite/explorer/documentTreeItem.test.ts @@ -4,7 +4,7 @@ import type { DataService } from 'mongodb-data-service'; import DocumentTreeItem from '../../../explorer/documentTreeItem'; import { DataServiceStub } from '../stubs'; -const mockDataService = new DataServiceStub() as any as DataService; +const dataServiceStub = new DataServiceStub() as any as DataService; suite('DocumentTreeItem Test Suite', () => { test('it makes the document _id the label of the document tree item', function () { @@ -41,7 +41,7 @@ suite('DocumentTreeItem Test Suite', () => { mockDocument, 'namespace', 1, - mockDataService, + dataServiceStub, () => Promise.resolve() ); @@ -63,7 +63,7 @@ suite('DocumentTreeItem Test Suite', () => { mockDocument, 'namespace', 1, - mockDataService, + dataServiceStub, () => Promise.resolve() ); diff --git a/src/test/suite/explorer/explorerController.test.ts b/src/test/suite/explorer/explorerController.test.ts index 88574e3b4..41dda9c57 100644 --- a/src/test/suite/explorer/explorerController.test.ts +++ b/src/test/suite/explorer/explorerController.test.ts @@ -26,13 +26,8 @@ suite('Explorer Controller Test Suite', function () { 'defaultConnectionSavingLocation', DefaultSavingLocations['Session Only'] ); - // Here we stub the showInformationMessage process because it is too much - // for the render process and leads to crashes while testing. - sinon.replace( - vscode.window, - 'showInformationMessage', - sinon.fake.resolves(true) - ); + sinon.stub(vscode.window, 'showInformationMessage'); + sinon.stub(vscode.window, 'showErrorMessage'); }); afterEach(async () => { diff --git a/src/test/suite/explorer/fieldTreeItem.test.ts b/src/test/suite/explorer/fieldTreeItem.test.ts index 9236147ba..f99884087 100644 --- a/src/test/suite/explorer/fieldTreeItem.test.ts +++ b/src/test/suite/explorer/fieldTreeItem.test.ts @@ -16,7 +16,7 @@ import { TEST_DATABASE_URI, } from '../dbTestHelper'; import SchemaTreeItem from '../../../explorer/schemaTreeItem'; -import { TestExtensionContext } from '../stubs'; +import { ExtensionContextStub } from '../stubs'; const { contributes } = require('../../../../package.json'); @@ -38,7 +38,7 @@ suite('FieldTreeItem Test Suite', function () { }); test('it should have a different icon depending on the field type', () => { - ext.context = new TestExtensionContext(); + ext.context = new ExtensionContextStub(); const stringField = new FieldTreeItem( { @@ -51,7 +51,7 @@ suite('FieldTreeItem Test Suite', function () { {} ); - const iconPath: any = stringField.iconPath; + const iconPath = stringField.iconPath as { light: string; dark: string }; assert(iconPath.dark.includes('string.svg')); assert(iconPath.light.includes('string.svg')); @@ -66,7 +66,7 @@ suite('FieldTreeItem Test Suite', function () { {} ); - const numberIcon: any = numberField.iconPath; + const numberIcon = numberField.iconPath as { light: string; dark: string }; assert(numberIcon.dark.includes('number.svg')); assert(numberIcon.light.includes('number.svg')); }); diff --git a/src/test/suite/explorer/indexListTreeItem.test.ts b/src/test/suite/explorer/indexListTreeItem.test.ts index 7bba16839..de4246c4f 100644 --- a/src/test/suite/explorer/indexListTreeItem.test.ts +++ b/src/test/suite/explorer/indexListTreeItem.test.ts @@ -1,7 +1,8 @@ import * as vscode from 'vscode'; -import { afterEach } from 'mocha'; +import { beforeEach, afterEach } from 'mocha'; import assert from 'assert'; import sinon from 'sinon'; +import type { SinonStub } from 'sinon'; import { DataService } from 'mongodb-data-service'; import formatError from '../../../utils/formatError'; @@ -10,6 +11,12 @@ import IndexListTreeItem from '../../../explorer/indexListTreeItem'; const { contributes } = require('../../../../package.json'); suite('IndexListTreeItem Test Suite', () => { + let showErrorMessageStub: SinonStub; + + beforeEach(() => { + showErrorMessageStub = sinon.stub(vscode.window, 'showErrorMessage'); + }); + afterEach(() => { sinon.restore(); }); @@ -130,10 +137,6 @@ suite('IndexListTreeItem Test Suite', () => { test('when theres an error fetching indexes, the error is thrown in the caller (no timeout)', async () => { const expectedMessage = 'Some error message indexes could throw'; - const fakeVscodeErrorMessage = sinon.fake(); - - sinon.replace(vscode.window, 'showErrorMessage', fakeVscodeErrorMessage); - const testIndexListTreeItem = new IndexListTreeItem( 'pineapple', 'tasty_fruits', @@ -153,8 +156,8 @@ suite('IndexListTreeItem Test Suite', () => { await testIndexListTreeItem.getChildren(); assert( - fakeVscodeErrorMessage.firstCall.args[0] === expectedMessage, - `Expected error message "${expectedMessage}" when disconnecting with no active connection, recieved "${fakeVscodeErrorMessage.firstCall.args[0]}"` + showErrorMessageStub.firstCall.args[0] === expectedMessage, + `Expected error message "${expectedMessage}" when disconnecting with no active connection, recieved "${showErrorMessageStub.firstCall.args[0]}"` ); } catch (error) { assert(!!error, 'Expected an error disconnect response.'); diff --git a/src/test/suite/explorer/indexTreeItem.test.ts b/src/test/suite/explorer/indexTreeItem.test.ts index 23e3fd5fd..440b8f55f 100644 --- a/src/test/suite/explorer/indexTreeItem.test.ts +++ b/src/test/suite/explorer/indexTreeItem.test.ts @@ -44,7 +44,10 @@ suite('IndexTreeItem Test Suite', () => { IndexKeyType.GEOSPHERE ); - const iconPath: any = testIndexFieldTreeItem.iconPath; + const iconPath = testIndexFieldTreeItem.iconPath as { + light: string; + dark: string; + }; assert( iconPath.dark.includes('index') && iconPath.dark.includes('geospatial.svg'), diff --git a/src/test/suite/explorer/schemaTreeItem.test.ts b/src/test/suite/explorer/schemaTreeItem.test.ts index 3a2e08d46..8626ed688 100644 --- a/src/test/suite/explorer/schemaTreeItem.test.ts +++ b/src/test/suite/explorer/schemaTreeItem.test.ts @@ -19,7 +19,7 @@ import { import SchemaTreeItem, { FIELDS_TO_SHOW, } from '../../../explorer/schemaTreeItem'; -import { TestExtensionContext } from '../stubs'; +import { ExtensionContextStub } from '../stubs'; const { contributes } = require('../../../../package.json'); @@ -105,7 +105,7 @@ suite('SchemaTreeItem Test Suite', function () { {} ); - const fakeShowInformationMessage = sinon.stub( + const showInformationMessageStub = sinon.stub( vscode.window, 'showInformationMessage' ); @@ -118,8 +118,8 @@ suite('SchemaTreeItem Test Suite', function () { ); assert( - fakeShowInformationMessage.firstCall.args[0] === expectedMessage, - `Expected message to be '${expectedMessage}' found ${fakeShowInformationMessage.firstCall.args[0]}` + showInformationMessageStub.firstCall.args[0] === expectedMessage, + `Expected message to be '${expectedMessage}' found ${showInformationMessageStub.firstCall.args[0]}` ); }); @@ -214,14 +214,16 @@ suite('SchemaTreeItem Test Suite', function () { try { await testSchemaTreeItem.getChildren(); assert(false, 'Didnt expect to succeed.'); - } catch (error: any) { + } catch (error) { const expectedMessage = "Unable to parse schema: Cannot use 'in' operator to search for 'stream' in invalid schema to parse"; assert.strictEqual( - error.message, + (error).message, expectedMessage, - `Expected error message to be "${expectedMessage}" found "${error.message}"` + `Expected error message to be "${expectedMessage}" found "${ + (error).message + }"` ); } }); @@ -359,7 +361,7 @@ suite('SchemaTreeItem Test Suite', function () { }); test('it should have an icon with the name schema', () => { - ext.context = new TestExtensionContext(); + ext.context = new ExtensionContextStub(); const testSchemaTreeItem = new SchemaTreeItem( 'favoritePiesIWantToEatRightNow', @@ -372,7 +374,7 @@ suite('SchemaTreeItem Test Suite', function () { {} ); - const schemaIconPath: any = testSchemaTreeItem.iconPath; + const schemaIconPath = testSchemaTreeItem.iconPath; assert( schemaIconPath.light.includes('schema.svg'), 'Expected icon path to point to an svg by the name "schema" with a light mode' diff --git a/src/test/suite/extension.test.ts b/src/test/suite/extension.test.ts index 3654e1d48..2be4de6bd 100644 --- a/src/test/suite/extension.test.ts +++ b/src/test/suite/extension.test.ts @@ -5,8 +5,6 @@ import EXTENSION_COMMANDS from '../../commands'; const { contributes } = require('../../../package.json'); suite('Extension Test Suite', () => { - void vscode.window.showInformationMessage('Starting tests...'); - test('there should be 3 views registered in the package.json', () => { assert(contributes.views.mongoDB.length === 3); assert(contributes.views.mongoDB[0].id === 'mongoDBConnectionExplorer'); diff --git a/src/test/suite/index.ts b/src/test/suite/index.ts index 46e95500b..33777b621 100644 --- a/src/test/suite/index.ts +++ b/src/test/suite/index.ts @@ -4,7 +4,7 @@ import path = require('path'); import MDBExtensionController from '../../mdbExtensionController'; import { ext } from '../../extensionConstants'; import KeytarStub from './keytarStub'; -import { TestExtensionContext } from './stubs'; +import { ExtensionContextStub } from './stubs'; import { mdbTestExtension } from './stubbableMdbExtension'; export async function run(): Promise { @@ -24,9 +24,9 @@ export async function run(): Promise { const testsRoot = path.join(__dirname, '..'); // Activate the extension. - mdbTestExtension.testExtensionContext = new TestExtensionContext(); + mdbTestExtension.extensionContextStub = new ExtensionContextStub(); mdbTestExtension.testExtensionController = new MDBExtensionController( - mdbTestExtension.testExtensionContext, + mdbTestExtension.extensionContextStub, { shouldTrackTelemetry: false } ); diff --git a/src/test/suite/language/languageServerController.test.ts b/src/test/suite/language/languageServerController.test.ts index ec2ce3cd0..1e3dc75cc 100644 --- a/src/test/suite/language/languageServerController.test.ts +++ b/src/test/suite/language/languageServerController.test.ts @@ -19,30 +19,30 @@ import { StatusView } from '../../../views'; import { StorageController } from '../../../storage'; import { TEST_DATABASE_URI } from '../dbTestHelper'; import TelemetryService from '../../../telemetry/telemetryService'; -import { TestExtensionContext } from '../stubs'; +import { ExtensionContextStub } from '../stubs'; const expect = chai.expect; chai.use(require('chai-as-promised')); suite('Language Server Controller Test Suite', () => { - const mockExtensionContext = new TestExtensionContext(); + const extensionContextStub = new ExtensionContextStub(); // The test extension runner. - mockExtensionContext.extensionPath = '../../'; + extensionContextStub.extensionPath = '../../'; - const mockStorageController = new StorageController(mockExtensionContext); + const testStorageController = new StorageController(extensionContextStub); const testLanguageServerController = new LanguageServerController( - mockExtensionContext + extensionContextStub ); const testTelemetryService = new TelemetryService( - mockStorageController, - mockExtensionContext + testStorageController, + extensionContextStub ); - const testStatusView = new StatusView(mockExtensionContext); + const testStatusView = new StatusView(extensionContextStub); const testConnectionController = new ConnectionController( testStatusView, - mockStorageController, + testStorageController, testTelemetryService ); const testEditDocumentCodeLensProvider = new EditDocumentCodeLensProvider( @@ -130,7 +130,7 @@ suite('Language Server Controller Test Suite', () => { }); test('the language server dependency bundle exists', async () => { - const extensionPath = mdbTestExtension.testExtensionContext.extensionPath; + const extensionPath = mdbTestExtension.extensionContextStub.extensionPath; const languageServerModuleBundlePath = path.join( extensionPath, 'dist', diff --git a/src/test/suite/language/mongoDBService.test.ts b/src/test/suite/language/mongoDBService.test.ts index ba5cf409f..e4aae5d42 100644 --- a/src/test/suite/language/mongoDBService.test.ts +++ b/src/test/suite/language/mongoDBService.test.ts @@ -14,7 +14,7 @@ import MongoDBService, { languageServerWorkerFileName, } from '../../../language/mongoDBService'; import { mdbTestExtension } from '../stubbableMdbExtension'; -import { TestStream } from '../stubs'; +import { StreamStub } from '../stubs'; import READ_PREFERENCES from '../../../views/webview-app/connection-model/constants/read-preferences'; const expect = chai.expect; @@ -31,7 +31,7 @@ suite('MongoDBService Test Suite', () => { test('the language server worker dependency bundle exists', async () => { const languageServerModuleBundlePath = path.join( - mdbTestExtension.testExtensionContext.extensionPath, + mdbTestExtension.extensionContextStub.extensionPath, 'dist', languageServerWorkerFileName ); @@ -39,8 +39,8 @@ suite('MongoDBService Test Suite', () => { }); suite('Extension path', () => { - const up = new TestStream(); - const down = new TestStream(); + const up = new StreamStub(); + const down = new StreamStub(); const connection = createConnection(up, down); connection.listen(); @@ -84,8 +84,8 @@ suite('MongoDBService Test Suite', () => { }); suite('Connect', () => { - const up = new TestStream(); - const down = new TestStream(); + const up = new StreamStub(); + const down = new StreamStub(); const connection = createConnection(up, down); connection.listen(); @@ -107,8 +107,8 @@ suite('MongoDBService Test Suite', () => { }); suite('Complete', () => { - const up = new TestStream(); - const down = new TestStream(); + const up = new StreamStub(); + const down = new StreamStub(); const connection = createConnection(up, down); connection.listen(); @@ -1023,8 +1023,8 @@ suite('MongoDBService Test Suite', () => { suite('Evaluate', function () { this.timeout(INCREASED_TEST_TIMEOUT); - const up = new TestStream(); - const down = new TestStream(); + const up = new StreamStub(); + const down = new StreamStub(); const connection = createConnection(up, down); connection.listen(); @@ -1033,7 +1033,7 @@ suite('MongoDBService Test Suite', () => { before(async () => { testMongoDBService._extensionPath = - mdbTestExtension.testExtensionContext.extensionPath; + mdbTestExtension.extensionContextStub.extensionPath; await testMongoDBService.connectToServiceProvider(params); }); @@ -1340,8 +1340,8 @@ suite('MongoDBService Test Suite', () => { suite('getExportToLanguageMode', function () { this.timeout(INCREASED_TEST_TIMEOUT); - const up = new TestStream(); - const down = new TestStream(); + const up = new StreamStub(); + const down = new StreamStub(); const connection = createConnection(up, down); connection.listen(); diff --git a/src/test/suite/mdbExtensionController.test.ts b/src/test/suite/mdbExtensionController.test.ts index 9c8e20533..7aedd5de6 100644 --- a/src/test/suite/mdbExtensionController.test.ts +++ b/src/test/suite/mdbExtensionController.test.ts @@ -3,7 +3,14 @@ import { afterEach, beforeEach } from 'mocha'; import assert from 'assert'; import { DataService } from 'mongodb-data-service'; import { ObjectId } from 'mongodb'; -import sinon, { SinonSpy } from 'sinon'; +import sinon from 'sinon'; +import type { SinonSpy, SinonStub } from 'sinon'; +import type { + Document, + Filter, + FindOneAndReplaceOptions, + DeleteOptions, +} from 'mongodb'; import { CollectionTreeItem, @@ -30,24 +37,21 @@ suite('MDBExtensionController Test Suite', function () { this.timeout(10000); suite('when not connected', () => { - const sandbox = sinon.createSandbox(); - let fakeVscodeErrorMessage: SinonSpy; + let showErrorMessageStub: SinonSpy; beforeEach(() => { sinon.stub(vscode.window, 'showInformationMessage'); sinon.stub(vscode.workspace, 'openTextDocument'); sinon.stub(vscode.window, 'showTextDocument'); - fakeVscodeErrorMessage = sinon.fake(); - sinon.replace(vscode.window, 'showErrorMessage', fakeVscodeErrorMessage); + showErrorMessageStub = sinon.stub(vscode.window, 'showErrorMessage'); }); afterEach(() => { - sandbox.restore(); sinon.restore(); }); test('mdb.addDatabase command fails when not connected to the connection', async () => { - const mockTreeItem = new ConnectionTreeItem( + const testTreeItem = new ConnectionTreeItem( 'tasty_sandwhich', vscode.TreeItemCollapsibleState.None, false, @@ -57,7 +61,7 @@ suite('MDBExtensionController Test Suite', function () { ); const addDatabaseSucceeded = await vscode.commands.executeCommand( 'mdb.addDatabase', - mockTreeItem + testTreeItem ); assert( addDatabaseSucceeded === false, @@ -67,32 +71,31 @@ suite('MDBExtensionController Test Suite', function () { const expectedMessage = 'Please connect to this connection before adding a database.'; assert( - fakeVscodeErrorMessage.firstCall.args[0] === expectedMessage, - `Expected an error message "${expectedMessage}" to be shown when attempting to add a database to a not connected connection found "${fakeVscodeErrorMessage.firstCall.args[0]}"` + showErrorMessageStub.firstCall.args[0] === expectedMessage, + `Expected an error message "${expectedMessage}" to be shown when attempting to add a database to a not connected connection found "${showErrorMessageStub.firstCall.args[0]}"` ); }); }); suite('when connected', () => { const sandbox = sinon.createSandbox(); - let fakeShowInformationMessage: sinon.SinonStub; - let mockOpenTextDocument: SinonSpy; - let mockActiveConnectionId: SinonSpy; - let fakeVscodeErrorMessage: SinonSpy; + let showInformationMessageStub: SinonStub; + let openTextDocumentStub: SinonStub; + let fakeActiveConnectionId: SinonSpy; + let showErrorMessageStub: SinonStub; let fakeCreatePlaygroundFileWithContent: SinonSpy; - let fakeShowTextDocument: SinonSpy; beforeEach(() => { - fakeShowInformationMessage = sinon.stub( + showInformationMessageStub = sinon.stub( vscode.window, 'showInformationMessage' ); - mockOpenTextDocument = sinon.stub(vscode.workspace, 'openTextDocument'); - mockActiveConnectionId = sinon.fake.returns('tasty_sandwhich'); + openTextDocumentStub = sinon.stub(vscode.workspace, 'openTextDocument'); + fakeActiveConnectionId = sinon.fake.returns('tasty_sandwhich'); sinon.replace( mdbTestExtension.testExtensionController._connectionController, 'getActiveConnectionId', - mockActiveConnectionId + fakeActiveConnectionId ); fakeCreatePlaygroundFileWithContent = sinon.fake(); sinon.replace( @@ -100,10 +103,8 @@ suite('MDBExtensionController Test Suite', function () { '_createPlaygroundFileWithContent', fakeCreatePlaygroundFileWithContent ); - fakeVscodeErrorMessage = sinon.fake(); - sinon.replace(vscode.window, 'showErrorMessage', fakeVscodeErrorMessage); - fakeShowTextDocument = sinon.fake(); - sinon.replace(vscode.window, 'showTextDocument', fakeShowTextDocument); + showErrorMessageStub = sinon.stub(vscode.window, 'showErrorMessage'); + sinon.stub(vscode.window, 'showTextDocument'); }); afterEach(() => { @@ -128,18 +129,18 @@ suite('MDBExtensionController Test Suite', function () { textCollectionTree ); assert.strictEqual( - mockOpenTextDocument.firstCall.args[0].path.indexOf( + openTextDocumentStub.firstCall.args[0].path.indexOf( 'Results: testDbName.testColName' ), 0 ); - assert(mockOpenTextDocument.firstCall.args[0].path.includes('.json')); + assert(openTextDocumentStub.firstCall.args[0].path.includes('.json')); assert.strictEqual( - mockOpenTextDocument.firstCall.args[0].scheme, + openTextDocumentStub.firstCall.args[0].scheme, VIEW_COLLECTION_SCHEME ); assert( - mockOpenTextDocument.firstCall.args[0].query.includes( + openTextDocumentStub.firstCall.args[0].query.includes( 'namespace=testDbName.testColName' ) ); @@ -162,47 +163,45 @@ suite('MDBExtensionController Test Suite', function () { textCollectionTree ); assert.strictEqual( - mockOpenTextDocument.firstCall.args[0].path.indexOf( + openTextDocumentStub.firstCall.args[0].path.indexOf( 'Results: testDbName.testColName' ), 0 ); - assert(mockOpenTextDocument.firstCall.args[0].path.includes('.json')); + assert(openTextDocumentStub.firstCall.args[0].path.includes('.json')); assert.strictEqual( - mockOpenTextDocument.firstCall.args[0].scheme, + openTextDocumentStub.firstCall.args[0].scheme, VIEW_COLLECTION_SCHEME ); assert( - mockOpenTextDocument.firstCall.args[0].query.includes( + openTextDocumentStub.firstCall.args[0].query.includes( 'namespace=testDbName.testColName' ) ); }); test('mdb.addConnection command should call openWebview on the webview controller', async () => { - const mockOpenWebview = sinon.fake(); - sinon.replace( + const openWebviewStub = sinon.stub( mdbTestExtension.testExtensionController._webviewController, - 'openWebview', - mockOpenWebview + 'openWebview' ); await vscode.commands.executeCommand('mdb.addConnection'); - assert.strictEqual(mockOpenWebview.calledOnce, true); + assert.strictEqual(openWebviewStub.calledOnce, true); }); test('mdb.addConnectionWithURI command should call connectWithURI on the connection controller', async () => { - const mockConnectWithUri = sinon.fake(); + const fakeConnectWithURI = sinon.fake(); sinon.replace( mdbTestExtension.testExtensionController._connectionController, 'connectWithURI', - mockConnectWithUri + fakeConnectWithURI ); await vscode.commands.executeCommand('mdb.addConnectionWithURI'); - assert.strictEqual(mockConnectWithUri.calledOnce, true); + assert.strictEqual(fakeConnectWithURI.calledOnce, true); }); test('mdb.refreshConnection command should reset the cache on a connection tree item', async () => { - const mockTreeItem = new ConnectionTreeItem( + const testTreeItem = new ConnectionTreeItem( 'test', vscode.TreeItemCollapsibleState.None, false, @@ -210,32 +209,32 @@ suite('MDBExtensionController Test Suite', function () { false, {} ); - mockTreeItem.cacheIsUpToDate = true; + testTreeItem.cacheIsUpToDate = true; - const mockExplorerControllerRefresh = sinon.fake(); + const fakeRefresh = sinon.fake(); sinon.replace( mdbTestExtension.testExtensionController._explorerController, 'refresh', - mockExplorerControllerRefresh + fakeRefresh ); await vscode.commands.executeCommand( 'mdb.refreshConnection', - mockTreeItem + testTreeItem ); assert.strictEqual( - mockTreeItem.cacheIsUpToDate, + testTreeItem.cacheIsUpToDate, false, 'Expected cache on tree item to be set to not up to date.' ); assert.strictEqual( - mockExplorerControllerRefresh.called, + fakeRefresh.called, true, 'Expected explorer controller refresh to be called.' ); }); test('mdb.treeItemRemoveConnection command should call removeMongoDBConnection on the connection controller with the tree item connection id', async () => { - const mockTreeItem = new ConnectionTreeItem( + const testTreeItem = new ConnectionTreeItem( 'craving_for_pancakes_with_maple_syrup', vscode.TreeItemCollapsibleState.None, false, @@ -243,25 +242,25 @@ suite('MDBExtensionController Test Suite', function () { false, {} ); - const mockRemoveMongoDBConnection = sinon.fake(); + const fakeRemoveMongoDBConnection = sinon.fake(); sinon.replace( mdbTestExtension.testExtensionController._connectionController, 'removeMongoDBConnection', - mockRemoveMongoDBConnection + fakeRemoveMongoDBConnection ); await vscode.commands.executeCommand( 'mdb.treeItemRemoveConnection', - mockTreeItem + testTreeItem ); - assert.strictEqual(mockRemoveMongoDBConnection.calledOnce, true); + assert.strictEqual(fakeRemoveMongoDBConnection.calledOnce, true); assert.strictEqual( - mockRemoveMongoDBConnection.firstCall.args[0], + fakeRemoveMongoDBConnection.firstCall.args[0], 'craving_for_pancakes_with_maple_syrup' ); }); test('mdb.copyConnectionString command should try to copy the driver url to the vscode env clipboard', async () => { - const mockTreeItem = new ConnectionTreeItem( + const testTreeItem = new ConnectionTreeItem( 'craving_for_pancakes_with_maple_syrup', vscode.TreeItemCollapsibleState.None, false, @@ -269,54 +268,52 @@ suite('MDBExtensionController Test Suite', function () { false, {} ); - const mockCopyToClipboard = sinon.fake(); + const fakeWriteText = sinon.fake(); sinon.replaceGetter(vscode.env, 'clipboard', () => ({ - writeText: mockCopyToClipboard, + writeText: fakeWriteText, readText: sinon.fake(), })); - const mockStubUri = sinon.fake.returns('weStubThisUri'); + const fakeCopyConnectionStringByConnectionId = + sinon.fake.returns('weStubThisUri'); sinon.replace( mdbTestExtension.testExtensionController._connectionController, 'copyConnectionStringByConnectionId', - mockStubUri + fakeCopyConnectionStringByConnectionId ); await vscode.commands.executeCommand( 'mdb.copyConnectionString', - mockTreeItem - ); - assert.strictEqual(mockCopyToClipboard.calledOnce, true); - assert.strictEqual( - mockCopyToClipboard.firstCall.args[0], - 'weStubThisUri' + testTreeItem ); + assert.strictEqual(fakeWriteText.calledOnce, true); + assert.strictEqual(fakeWriteText.firstCall.args[0], 'weStubThisUri'); }); test('mdb.copyDatabaseName command should try to copy the database name to the vscode env clipboard', async () => { - const mockTreeItem = new DatabaseTreeItem( + const testTreeItem = new DatabaseTreeItem( 'isClubMateTheBestDrinkEver', {}, false, false, {} ); - const mockCopyToClipboard = sinon.fake(); + const fakeWriteText = sinon.fake(); sinon.replaceGetter(vscode.env, 'clipboard', () => ({ - writeText: mockCopyToClipboard, + writeText: fakeWriteText, readText: sinon.fake(), })); await vscode.commands.executeCommand( 'mdb.copyDatabaseName', - mockTreeItem + testTreeItem ); - assert.strictEqual(mockCopyToClipboard.calledOnce, true); + assert.strictEqual(fakeWriteText.calledOnce, true); assert.strictEqual( - mockCopyToClipboard.firstCall.args[0], + fakeWriteText.firstCall.args[0], 'isClubMateTheBestDrinkEver' ); }); test('mdb.copyCollectionName command should try to copy the collection name to the vscode env clipboard', async () => { - const mockTreeItem = new CollectionTreeItem( + const testTreeItem = new CollectionTreeItem( { name: 'waterBuffalo', type: CollectionTypes.collection, @@ -327,27 +324,27 @@ suite('MDBExtensionController Test Suite', function () { false, null ); - const mockCopyToClipboard = sinon.fake(); + const fakeWriteText = sinon.fake(); sinon.replaceGetter(vscode.env, 'clipboard', () => ({ - writeText: mockCopyToClipboard, + writeText: fakeWriteText, readText: sinon.fake(), })); await vscode.commands.executeCommand( 'mdb.copyCollectionName', - mockTreeItem + testTreeItem ); assert( - mockCopyToClipboard.called, + fakeWriteText.called, 'Expected "writeText" to be called on "vscode.env.clipboard".' ); assert( - mockCopyToClipboard.firstCall.args[0] === 'waterBuffalo', - `Expected the clipboard to be sent the uri string "waterBuffalo", found ${mockCopyToClipboard.firstCall.args[0]}.` + fakeWriteText.firstCall.args[0] === 'waterBuffalo', + `Expected the clipboard to be sent the uri string "waterBuffalo", found ${fakeWriteText.firstCall.args[0]}.` ); }); test('mdb.copySchemaFieldName command should try to copy the field name to the vscode env clipboard', async () => { - const mockTreeItem = new FieldTreeItem( + const testTreeItem = new FieldTreeItem( { name: 'dolphins are sentient', probability: 1, @@ -357,56 +354,56 @@ suite('MDBExtensionController Test Suite', function () { false, {} ); - const mockCopyToClipboard = sinon.fake(); + const fakeWriteText = sinon.fake(); sinon.replaceGetter(vscode.env, 'clipboard', () => ({ - writeText: mockCopyToClipboard, + writeText: fakeWriteText, readText: sinon.fake(), })); const commandResult = await vscode.commands.executeCommand( 'mdb.copySchemaFieldName', - mockTreeItem + testTreeItem ); assert(commandResult); assert( - mockCopyToClipboard.called, + fakeWriteText.called, 'Expected "writeText" to be called on "vscode.env.clipboard".' ); assert( - mockCopyToClipboard.firstCall.args[0] === 'dolphins are sentient', - `Expected the clipboard to be sent the schema field name "dolphins are sentient", found ${mockCopyToClipboard.firstCall.args[0]}.` + fakeWriteText.firstCall.args[0] === 'dolphins are sentient', + `Expected the clipboard to be sent the schema field name "dolphins are sentient", found ${fakeWriteText.firstCall.args[0]}.` ); }); test('mdb.refreshDatabase command should reset the cache on the database tree item', async () => { - const mockTreeItem = new DatabaseTreeItem( + const testTreeItem = new DatabaseTreeItem( 'pinkLemonade', {}, false, false, {} ); - mockTreeItem.cacheIsUpToDate = true; + testTreeItem.cacheIsUpToDate = true; - const mockExplorerControllerRefresh = sinon.fake(); + const fakeRefresh = sinon.fake(); sinon.replace( mdbTestExtension.testExtensionController._explorerController, 'refresh', - mockExplorerControllerRefresh + fakeRefresh ); - await vscode.commands.executeCommand('mdb.refreshDatabase', mockTreeItem); + await vscode.commands.executeCommand('mdb.refreshDatabase', testTreeItem); assert.strictEqual( - mockTreeItem.cacheIsUpToDate, + testTreeItem.cacheIsUpToDate, false, 'Expected cache on tree item to be set to not up to date.' ); assert( - mockExplorerControllerRefresh.called === true, + fakeRefresh.called === true, 'Expected explorer controller refresh to be called.' ); }); test('mdb.refreshCollection command should reset the expanded state of its children and call to refresh the explorer controller', async () => { - const mockTreeItem = new CollectionTreeItem( + const testTreeItem = new CollectionTreeItem( { name: 'iSawACatThatLookedLikeALionToday', type: CollectionTypes.collection, @@ -417,35 +414,35 @@ suite('MDBExtensionController Test Suite', function () { false, null ); - mockTreeItem.isExpanded = true; + testTreeItem.isExpanded = true; // Set expanded. - mockTreeItem.getSchemaChild().isExpanded = true; - mockTreeItem.getDocumentListChild().isExpanded = true; + testTreeItem.getSchemaChild().isExpanded = true; + testTreeItem.getDocumentListChild().isExpanded = true; - const mockExplorerControllerRefresh = sinon.fake(); + const fakeRefresh = sinon.fake(); sinon.replace( mdbTestExtension.testExtensionController._explorerController, 'refresh', - mockExplorerControllerRefresh + fakeRefresh ); await vscode.commands.executeCommand( 'mdb.refreshCollection', - mockTreeItem + testTreeItem ); assert( - mockTreeItem.getSchemaChild().isExpanded === false, + testTreeItem.getSchemaChild().isExpanded === false, 'Expected collection tree item child to be reset to not expanded.' ); assert( - mockExplorerControllerRefresh.called === true, + fakeRefresh.called === true, 'Expected explorer controller refresh to be called.' ); }); test('mdb.refreshDocumentList command should update the document count and call to refresh the explorer controller', async () => { let count = 9000; - const mockTreeItem = new CollectionTreeItem( + const testTreeItem = new CollectionTreeItem( { name: 'iSawACatThatLookedLikeALionToday', type: CollectionTypes.collection, @@ -456,19 +453,19 @@ suite('MDBExtensionController Test Suite', function () { false, null ); - await mockTreeItem.onDidExpand(); + await testTreeItem.onDidExpand(); - const collectionChildren = await mockTreeItem.getChildren(); + const collectionChildren = await testTreeItem.getChildren(); const docListTreeItem = collectionChildren[0]; assert.strictEqual(docListTreeItem.description, '9K'); count = 10000; docListTreeItem.isExpanded = true; - const mockExplorerControllerRefresh = sinon.fake(); + const fakeRefresh = sinon.fake(); sinon.replace( mdbTestExtension.testExtensionController._explorerController, 'refresh', - mockExplorerControllerRefresh + fakeRefresh ); await vscode.commands.executeCommand( @@ -480,17 +477,17 @@ suite('MDBExtensionController Test Suite', function () { 'Expected document list cache to be out of date.' ); assert( - mockTreeItem.documentCount === 10000, - `Expected document count to be 10000, found ${mockTreeItem.documentCount}.` + testTreeItem.documentCount === 10000, + `Expected document count to be 10000, found ${testTreeItem.documentCount}.` ); assert( - mockExplorerControllerRefresh.called === true, + fakeRefresh.called === true, 'Expected explorer controller refresh to be called.' ); }); test('mdb.refreshSchema command should reset its cache and call to refresh the explorer controller', async () => { - const mockTreeItem = new SchemaTreeItem( + const testTreeItem = new SchemaTreeItem( 'zebraWearwolf', 'giraffeVampire', {} as DataService, @@ -502,27 +499,27 @@ suite('MDBExtensionController Test Suite', function () { ); // Set cached. - mockTreeItem.cacheIsUpToDate = true; + testTreeItem.cacheIsUpToDate = true; - const mockExplorerControllerRefresh = sinon.fake(); + const fakeRefresh = sinon.fake(); sinon.replace( mdbTestExtension.testExtensionController._explorerController, 'refresh', - mockExplorerControllerRefresh + fakeRefresh ); - await vscode.commands.executeCommand('mdb.refreshSchema', mockTreeItem); + await vscode.commands.executeCommand('mdb.refreshSchema', testTreeItem); assert( - !mockTreeItem.cacheIsUpToDate, + !testTreeItem.cacheIsUpToDate, 'Expected schema field cache to be not up to date.' ); assert( - mockExplorerControllerRefresh.called === true, + fakeRefresh.called === true, 'Expected explorer controller refresh to be called.' ); }); test('mdb.refreshIndexes command should reset its cache and call to refresh the explorer controller', async () => { - const mockTreeItem = new IndexListTreeItem( + const testTreeItem = new IndexListTreeItem( 'zebraWearwolf', 'giraffeVampire', {} as DataService, @@ -532,27 +529,27 @@ suite('MDBExtensionController Test Suite', function () { ); // Set cached. - mockTreeItem.cacheIsUpToDate = true; + testTreeItem.cacheIsUpToDate = true; - const mockExplorerControllerRefresh = sinon.fake(); + const fakeRefresh = sinon.fake(); sinon.replace( mdbTestExtension.testExtensionController._explorerController, 'refresh', - mockExplorerControllerRefresh + fakeRefresh ); - await vscode.commands.executeCommand('mdb.refreshIndexes', mockTreeItem); + await vscode.commands.executeCommand('mdb.refreshIndexes', testTreeItem); assert( - !mockTreeItem.cacheIsUpToDate, + !testTreeItem.cacheIsUpToDate, 'Expected schema field cache to be not up to date.' ); assert( - mockExplorerControllerRefresh.called === true, + fakeRefresh.called === true, 'Expected explorer controller refresh to be called.' ); }); test('mdb.addDatabase should create a MongoDB playground with create collection template', async () => { - const mockTreeItem = new ConnectionTreeItem( + const testTreeItem = new ConnectionTreeItem( 'tasty_sandwhich', vscode.TreeItemCollapsibleState.None, false, @@ -560,7 +557,7 @@ suite('MDBExtensionController Test Suite', function () { false, {} ); - await vscode.commands.executeCommand('mdb.addDatabase', mockTreeItem); + await vscode.commands.executeCommand('mdb.addDatabase', testTreeItem); const content = fakeCreatePlaygroundFileWithContent.firstCall.args[0]; assert(content.includes('// Create a new database.')); @@ -569,14 +566,14 @@ suite('MDBExtensionController Test Suite', function () { }); test('mdb.addCollection should create a MongoDB playground with create collection template', async () => { - const mockTreeItem = new DatabaseTreeItem( + const testTreeItem = new DatabaseTreeItem( 'iceCreamDB', {}, false, false, {} ); - await vscode.commands.executeCommand('mdb.addCollection', mockTreeItem); + await vscode.commands.executeCommand('mdb.addCollection', testTreeItem); const content = fakeCreatePlaygroundFileWithContent.firstCall.args[0]; assert(content.includes('// The current database to use.')); @@ -612,10 +609,10 @@ suite('MDBExtensionController Test Suite', function () { }); test('mdb.createPlayground should create a MongoDB playground with default template', async () => { - const mockGetConfiguration = sinon.fake.returns({ + const fakeGetConfiguration = sinon.fake.returns({ get: () => true, }); - sinon.replace(vscode.workspace, 'getConfiguration', mockGetConfiguration); + sinon.replace(vscode.workspace, 'getConfiguration', fakeGetConfiguration); await vscode.commands.executeCommand('mdb.createPlayground'); const content = fakeCreatePlaygroundFileWithContent.firstCall.args[0]; @@ -623,10 +620,10 @@ suite('MDBExtensionController Test Suite', function () { }); test('mdb.createPlayground command should create a MongoDB playground without template', async () => { - const mockGetConfiguration = sinon.fake.returns({ + const fakeGetConfiguration = sinon.fake.returns({ get: () => false, }); - sinon.replace(vscode.workspace, 'getConfiguration', mockGetConfiguration); + sinon.replace(vscode.workspace, 'getConfiguration', fakeGetConfiguration); await vscode.commands.executeCommand('mdb.createPlayground'); const content = fakeCreatePlaygroundFileWithContent.firstCall.args[0]; @@ -634,7 +631,7 @@ suite('MDBExtensionController Test Suite', function () { }); test('mdb.addDatabase command fails when disconnecting', async () => { - const mockTreeItem = new ConnectionTreeItem( + const testTreeItem = new ConnectionTreeItem( 'tasty_sandwhich', vscode.TreeItemCollapsibleState.None, false, @@ -642,21 +639,21 @@ suite('MDBExtensionController Test Suite', function () { false, {} ); - const mockInputBoxResolves: any = sinon.stub(); - mockInputBoxResolves.onCall(0).resolves('theDbName'); - mockInputBoxResolves.onCall(1).resolves('theCollectionName'); - sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); + const inputBoxResolvesStub = sinon.stub(); + inputBoxResolvesStub.onCall(0).resolves('theDbName'); + inputBoxResolvesStub.onCall(1).resolves('theCollectionName'); + sinon.replace(vscode.window, 'showInputBox', inputBoxResolvesStub); - const mockIsDisconnecting = sinon.fake.returns(true); + const fakeIsDisconnecting = sinon.fake.returns(true); sinon.replace( mdbTestExtension.testExtensionController._connectionController, 'isDisconnecting', - mockIsDisconnecting + fakeIsDisconnecting ); const addDatabaseSucceeded = await vscode.commands.executeCommand( 'mdb.addDatabase', - mockTreeItem + testTreeItem ); assert( addDatabaseSucceeded === false, @@ -666,13 +663,13 @@ suite('MDBExtensionController Test Suite', function () { const expectedMessage = 'Unable to add database: currently disconnecting.'; assert( - fakeVscodeErrorMessage.firstCall.args[0] === expectedMessage, - `Expected the error message "${expectedMessage}" to be shown when attempting to add a database while disconnecting, found "${fakeVscodeErrorMessage.firstCall.args[0]}"` + showErrorMessageStub.firstCall.args[0] === expectedMessage, + `Expected the error message "${expectedMessage}" to be shown when attempting to add a database while disconnecting, found "${showErrorMessageStub.firstCall.args[0]}"` ); }); test('mdb.addDatabase command fails when connecting', async () => { - const mockTreeItem = new ConnectionTreeItem( + const testTreeItem = new ConnectionTreeItem( 'tasty_sandwhich', vscode.TreeItemCollapsibleState.None, false, @@ -680,21 +677,21 @@ suite('MDBExtensionController Test Suite', function () { false, {} ); - const mockInputBoxResolves: any = sinon.stub(); - mockInputBoxResolves.onCall(0).resolves('theDbName'); - mockInputBoxResolves.onCall(1).resolves('theCollectionName'); - sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); + const inputBoxResolvesStub = sinon.stub(); + inputBoxResolvesStub.onCall(0).resolves('theDbName'); + inputBoxResolvesStub.onCall(1).resolves('theCollectionName'); + sinon.replace(vscode.window, 'showInputBox', inputBoxResolvesStub); - const mockIsConnecting = sinon.fake.returns(true); + const fakeIsConnecting = sinon.fake.returns(true); sinon.replace( mdbTestExtension.testExtensionController._connectionController, 'isConnecting', - mockIsConnecting + fakeIsConnecting ); const addDatabaseSucceeded = await vscode.commands.executeCommand( 'mdb.addDatabase', - mockTreeItem + testTreeItem ); assert( addDatabaseSucceeded === false, @@ -703,33 +700,33 @@ suite('MDBExtensionController Test Suite', function () { const expectedMessage = 'Unable to add database: currently connecting.'; assert( - fakeVscodeErrorMessage.firstCall.args[0] === expectedMessage, - `Expected the error message "${expectedMessage}" to be shown when attempting to add a database while disconnecting, found "${fakeVscodeErrorMessage.firstCall.args[0]}"` + showErrorMessageStub.firstCall.args[0] === expectedMessage, + `Expected the error message "${expectedMessage}" to be shown when attempting to add a database while disconnecting, found "${showErrorMessageStub.firstCall.args[0]}"` ); }); test('mdb.addCollection command fails when disconnecting', async () => { - const mockTreeItem = new DatabaseTreeItem( + const testTreeItem = new DatabaseTreeItem( 'iceCreamDB', {}, false, false, {} ); - const mockInputBoxResolves: any = sinon.stub(); - mockInputBoxResolves.onCall(0).resolves('mintChocolateChips'); - sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); + const inputBoxResolvesStub = sinon.stub(); + inputBoxResolvesStub.onCall(0).resolves('mintChocolateChips'); + sinon.replace(vscode.window, 'showInputBox', inputBoxResolvesStub); - const mockIsDisconnecting = sinon.fake.returns(true); + const fakeIsDisconnecting = sinon.fake.returns(true); sinon.replace( mdbTestExtension.testExtensionController._connectionController, 'isDisconnecting', - mockIsDisconnecting + fakeIsDisconnecting ); const addCollectionSucceeded = await vscode.commands.executeCommand( 'mdb.addCollection', - mockTreeItem + testTreeItem ); assert( addCollectionSucceeded === false, @@ -738,8 +735,8 @@ suite('MDBExtensionController Test Suite', function () { const expectedMessage = 'Unable to add collection: currently disconnecting.'; assert( - fakeVscodeErrorMessage.firstCall.args[0] === expectedMessage, - `Expected "${expectedMessage}" when adding a database to a not connected connection, recieved "${fakeVscodeErrorMessage.firstCall.args[0]}"` + showErrorMessageStub.firstCall.args[0] === expectedMessage, + `Expected "${expectedMessage}" when adding a database to a not connected connection, recieved "${showErrorMessageStub.firstCall.args[0]}"` ); }); @@ -760,9 +757,9 @@ suite('MDBExtensionController Test Suite', function () { null ); - const mockInputBoxResolves: any = sinon.stub(); - mockInputBoxResolves.onCall(0).resolves('testColName'); - sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); + const inputBoxResolvesStub = sinon.stub(); + inputBoxResolvesStub.onCall(0).resolves('testColName'); + sinon.replace(vscode.window, 'showInputBox', inputBoxResolvesStub); const successfullyDropped = await vscode.commands.executeCommand( 'mdb.dropCollection', @@ -787,9 +784,9 @@ suite('MDBExtensionController Test Suite', function () { false, null ); - const mockInputBoxResolves: any = sinon.stub(); - mockInputBoxResolves.onCall(0).resolves('doesntExistColName'); - sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); + const inputBoxResolvesStub = sinon.stub(); + inputBoxResolvesStub.onCall(0).resolves('doesntExistColName'); + sinon.replace(vscode.window, 'showInputBox', inputBoxResolvesStub); const successfullyDropped = await vscode.commands.executeCommand( 'mdb.dropCollection', @@ -802,8 +799,8 @@ suite('MDBExtensionController Test Suite', function () { const expectedMessage = 'Drop collection failed: ns not found'; assert( - fakeVscodeErrorMessage.firstCall.args[0] === expectedMessage, - `Expected "${expectedMessage}" when dropping a collection that doesn't exist, recieved "${fakeVscodeErrorMessage.firstCall.args[0]}"` + showErrorMessageStub.firstCall.args[0] === expectedMessage, + `Expected "${expectedMessage}" when dropping a collection that doesn't exist, recieved "${showErrorMessageStub.firstCall.args[0]}"` ); await testConnectionController.disconnect(); testConnectionController.clearAllConnections(); @@ -818,9 +815,9 @@ suite('MDBExtensionController Test Suite', function () { false, null ); - const mockInputBoxResolves: any = sinon.stub(); - mockInputBoxResolves.onCall(0).resolves('apple'); - sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); + const inputBoxResolvesStub = sinon.stub(); + inputBoxResolvesStub.onCall(0).resolves('apple'); + sinon.replace(vscode.window, 'showInputBox', inputBoxResolvesStub); const successfullyDropped = await vscode.commands.executeCommand( 'mdb.dropCollection', @@ -841,9 +838,9 @@ suite('MDBExtensionController Test Suite', function () { false, null ); - const mockInputBoxResolves: any = sinon.stub(); - mockInputBoxResolves.onCall(0).resolves(/* Return undefined. */); - sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); + const inputBoxResolvesStub = sinon.stub(); + inputBoxResolvesStub.onCall(0).resolves(/* Return undefined. */); + sinon.replace(vscode.window, 'showInputBox', inputBoxResolvesStub); const successfullyDropped = await vscode.commands.executeCommand( 'mdb.dropCollection', @@ -870,9 +867,9 @@ suite('MDBExtensionController Test Suite', function () { {} ); - const mockInputBoxResolves: any = sinon.stub(); - mockInputBoxResolves.onCall(0).resolves('iMissTangerineAltoids'); - sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); + const inputBoxResolvesStub = sinon.stub(); + inputBoxResolvesStub.onCall(0).resolves('iMissTangerineAltoids'); + sinon.replace(vscode.window, 'showInputBox', inputBoxResolvesStub); const successfullyDropped = await vscode.commands.executeCommand( 'mdb.dropDatabase', @@ -896,9 +893,9 @@ suite('MDBExtensionController Test Suite', function () { false, {} ); - const mockInputBoxResolves: any = sinon.stub(); - mockInputBoxResolves.onCall(0).resolves('narnia____a'); - sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); + const inputBoxResolvesStub = sinon.stub(); + inputBoxResolvesStub.onCall(0).resolves('narnia____a'); + sinon.replace(vscode.window, 'showInputBox', inputBoxResolvesStub); const successfullyDropped = await vscode.commands.executeCommand( 'mdb.dropDatabase', @@ -909,7 +906,7 @@ suite('MDBExtensionController Test Suite', function () { 'Expected the drop database command handler to return a successful boolean response' ); assert( - fakeVscodeErrorMessage.called === false, + showErrorMessageStub.called === false, 'Expected no error messages' ); }); @@ -922,9 +919,9 @@ suite('MDBExtensionController Test Suite', function () { false, {} ); - const mockInputBoxResolves: any = sinon.stub(); - mockInputBoxResolves.onCall(0).resolves('apple'); - sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); + const inputBoxResolvesStub = sinon.stub(); + inputBoxResolvesStub.onCall(0).resolves('apple'); + sinon.replace(vscode.window, 'showInputBox', inputBoxResolvesStub); const successfullyDropped = await vscode.commands.executeCommand( 'mdb.dropDatabase', @@ -944,9 +941,9 @@ suite('MDBExtensionController Test Suite', function () { false, {} ); - const mockInputBoxResolves: any = sinon.stub(); - mockInputBoxResolves.onCall(0).resolves(/* Return undefined. */); - sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); + const inputBoxResolvesStub = sinon.stub(); + inputBoxResolvesStub.onCall(0).resolves(/* Return undefined. */); + sinon.replace(vscode.window, 'showInputBox', inputBoxResolvesStub); const successfullyDropped = await vscode.commands.executeCommand( 'mdb.dropDatabase', @@ -967,7 +964,7 @@ suite('MDBExtensionController Test Suite', function () { storageLocation: StorageLocation.NONE, }; - const mockTreeItem = new ConnectionTreeItem( + const testTreeItem = new ConnectionTreeItem( 'blueBerryPancakesAndTheSmellOfBacon', vscode.TreeItemCollapsibleState.None, false, @@ -976,13 +973,13 @@ suite('MDBExtensionController Test Suite', function () { {} ); - const mockInputBoxResolves: any = sinon.stub(); - mockInputBoxResolves.onCall(0).resolves(/* Return undefined. */); - sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); + const inputBoxResolvesStub = sinon.stub(); + inputBoxResolvesStub.onCall(0).resolves(/* Return undefined. */); + sinon.replace(vscode.window, 'showInputBox', inputBoxResolvesStub); const successfullyRenamed = await vscode.commands.executeCommand( 'mdb.renameConnection', - mockTreeItem + testTreeItem ); assert( successfullyRenamed === false, @@ -1005,7 +1002,7 @@ suite('MDBExtensionController Test Suite', function () { storageLocation: StorageLocation.NONE, }; - const mockTreeItem = new ConnectionTreeItem( + const testTreeItem = new ConnectionTreeItem( 'blueBerryPancakesAndTheSmellOfBacon', vscode.TreeItemCollapsibleState.None, false, @@ -1013,13 +1010,13 @@ suite('MDBExtensionController Test Suite', function () { false, {} ); - const mockInputBoxResolves: any = sinon.stub(); - mockInputBoxResolves.onCall(0).resolves('orange juice'); - sinon.replace(vscode.window, 'showInputBox', mockInputBoxResolves); + const inputBoxResolvesStub = sinon.stub(); + inputBoxResolvesStub.onCall(0).resolves('orange juice'); + sinon.replace(vscode.window, 'showInputBox', inputBoxResolvesStub); const successfullyRenamed = await vscode.commands.executeCommand( 'mdb.renameConnection', - mockTreeItem + testTreeItem ); assert.strictEqual(successfullyRenamed, true); assert.strictEqual( @@ -1038,12 +1035,12 @@ suite('MDBExtensionController Test Suite', function () { $time: '12345', }, }; - const mockGet = sinon.fake.returns('pancakes'); + const fakeGet = sinon.fake.returns('pancakes'); sinon.replace( mdbTestExtension.testExtensionController._editorsController ._documentIdStore, 'get', - mockGet + fakeGet ); const activeTextEditor = mockTextEditor; @@ -1064,15 +1061,15 @@ suite('MDBExtensionController Test Suite', function () { () => activeTextEditor ); - const mockGetActiveDataService = sinon.fake.returns({ + const fakeGetActiveDataService = sinon.fake.returns({ find: () => { return Promise.resolve([mockDocument]); }, findOneAndReplace: ( namespace: string, - filter: object, - replacement: object, - options: object, + filter: Filter, + replacement: Document, + options: FindOneAndReplaceOptions, callback: (error: Error | null, result: object) => void ) => { mockDocument.name = 'something sweet'; @@ -1083,7 +1080,7 @@ suite('MDBExtensionController Test Suite', function () { sinon.replace( mdbTestExtension.testExtensionController._connectionController, 'getActiveDataService', - mockGetActiveDataService + fakeGetActiveDataService ); const documentItem = new DocumentTreeItem( @@ -1097,22 +1094,22 @@ suite('MDBExtensionController Test Suite', function () { 'mdb.openMongoDBDocumentFromTree', documentItem ); - assert(mockOpenTextDocument.firstCall.args[0].path.includes('.json')); + assert(openTextDocumentStub.firstCall.args[0].path.includes('.json')); assert.strictEqual( - mockOpenTextDocument.firstCall.args[0].scheme, + openTextDocumentStub.firstCall.args[0].scheme, 'VIEW_DOCUMENT_SCHEME' ); assert( - mockOpenTextDocument.firstCall.args[0].query.includes('documentId=') + openTextDocumentStub.firstCall.args[0].query.includes('documentId=') ); assert( - mockOpenTextDocument.firstCall.args[0].query.includes('connectionId=') + openTextDocumentStub.firstCall.args[0].query.includes('connectionId=') ); assert( - mockOpenTextDocument.firstCall.args[0].query.includes('source=treeview') + openTextDocumentStub.firstCall.args[0].query.includes('source=treeview') ); assert( - mockOpenTextDocument.firstCall.args[0].query.includes( + openTextDocumentStub.firstCall.args[0].query.includes( 'namespace=waffle.house' ) ); @@ -1124,7 +1121,7 @@ suite('MDBExtensionController Test Suite', function () { "The document was saved successfully to 'waffle.house'"; assert.strictEqual( - fakeShowInformationMessage.firstCall.args[0], + showInformationMessageStub.firstCall.args[0], expectedMessage ); }); @@ -1144,19 +1141,19 @@ suite('MDBExtensionController Test Suite', function () { {} as DataService, () => Promise.resolve() ); - const mockFetchDocument = sinon.fake.resolves(null); + const fakeFetchDocument = sinon.fake.resolves(null); sinon.replace( mdbTestExtension.testExtensionController._editorsController ._mongoDBDocumentService, 'fetchDocument', - mockFetchDocument + fakeFetchDocument ); await vscode.commands.executeCommand( 'mdb.openMongoDBDocumentFromTree', documentItem ); assert.strictEqual( - mockFetchDocument.firstCall.args[0].source, + fakeFetchDocument.firstCall.args[0].source, 'treeview' ); }); @@ -1169,19 +1166,19 @@ suite('MDBExtensionController Test Suite', function () { namespace: 'db.coll', connectionId: null, }; - const mockFetchDocument = sinon.fake.resolves(null); + const fakeFetchDocument = sinon.fake.resolves(null); sinon.replace( mdbTestExtension.testExtensionController._editorsController ._mongoDBDocumentService, 'fetchDocument', - mockFetchDocument + fakeFetchDocument ); await vscode.commands.executeCommand( 'mdb.openMongoDBDocumentFromCodeLens', documentItem ); assert.strictEqual( - mockFetchDocument.firstCall.args[0].source, + fakeFetchDocument.firstCall.args[0].source, 'playground' ); }); @@ -1194,12 +1191,12 @@ suite('MDBExtensionController Test Suite', function () { $time: '12345', }, }; - const mockGet = sinon.fake.returns('pancakes'); + const fakeGet = sinon.fake.returns('pancakes'); sinon.replace( mdbTestExtension.testExtensionController._editorsController ._documentIdStore, 'get', - mockGet + fakeGet ); sandbox.replaceGetter( vscode.window, @@ -1222,16 +1219,16 @@ suite('MDBExtensionController Test Suite', function () { } as unknown as typeof vscode.window.activeTextEditor) ); - const mockReplaceDocument = sinon.fake.resolves(null); + const fakeReplaceDocument = sinon.fake.resolves(null); sinon.replace( mdbTestExtension.testExtensionController._editorsController ._mongoDBDocumentService, 'replaceDocument', - mockReplaceDocument + fakeReplaceDocument ); await vscode.commands.executeCommand('mdb.saveMongoDBDocument'); assert.strictEqual( - mockReplaceDocument.firstCall.args[0].source, + fakeReplaceDocument.firstCall.args[0].source, 'treeview' ); }); @@ -1244,12 +1241,12 @@ suite('MDBExtensionController Test Suite', function () { $time: '12345', }, }; - const mockGet = sinon.fake.returns('pancakes'); + const fakeGet = sinon.fake.returns('pancakes'); sinon.replace( mdbTestExtension.testExtensionController._editorsController ._documentIdStore, 'get', - mockGet + fakeGet ); sandbox.replaceGetter( vscode.window, @@ -1272,72 +1269,72 @@ suite('MDBExtensionController Test Suite', function () { } as unknown as typeof vscode.window.activeTextEditor) ); - const mockReplaceDocument = sinon.fake.resolves(null); + const fakeReplaceDocument = sinon.fake.resolves(null); sinon.replace( mdbTestExtension.testExtensionController._editorsController ._mongoDBDocumentService, 'replaceDocument', - mockReplaceDocument + fakeReplaceDocument ); await vscode.commands.executeCommand('mdb.saveMongoDBDocument'); assert.strictEqual( - mockReplaceDocument.firstCall.args[0].source, + fakeReplaceDocument.firstCall.args[0].source, 'playground' ); }); test('mdb.runSelectedPlaygroundBlocks runs selected playgroundB blocks once', async () => { - const mockRunSelectedPlaygroundBlocks = sinon.fake(); + const fakeRunSelectedPlaygroundBlocks = sinon.fake(); sinon.replace( mdbTestExtension.testExtensionController._playgroundController, 'runSelectedPlaygroundBlocks', - mockRunSelectedPlaygroundBlocks + fakeRunSelectedPlaygroundBlocks ); await vscode.commands.executeCommand('mdb.runSelectedPlaygroundBlocks'); assert( - mockRunSelectedPlaygroundBlocks.calledOnce, + fakeRunSelectedPlaygroundBlocks.calledOnce, 'Expected "runSelectedPlaygroundBlocks" to be called on the playground controller.' ); }); test('mdb.runAllPlaygroundBlocks runs all playgroundB blocks once', async () => { - const mockRunAllPlaygroundBlocks = sinon.fake(); + const fakeRunAllPlaygroundBlocks = sinon.fake(); sinon.replace( mdbTestExtension.testExtensionController._playgroundController, 'runAllPlaygroundBlocks', - mockRunAllPlaygroundBlocks + fakeRunAllPlaygroundBlocks ); await vscode.commands.executeCommand('mdb.runAllPlaygroundBlocks'); assert( - mockRunAllPlaygroundBlocks.calledOnce, + fakeRunAllPlaygroundBlocks.calledOnce, 'Expected "runAllPlaygroundBlocks" to be called on the playground controller.' ); }); test('mdb.changeActiveConnection changes the active connection once', async () => { - const mockChangeActiveConnection = sinon.fake(); + const fakeChangeActiveConnection = sinon.fake(); sinon.replace( mdbTestExtension.testExtensionController._connectionController, 'changeActiveConnection', - mockChangeActiveConnection + fakeChangeActiveConnection ); await vscode.commands.executeCommand('mdb.changeActiveConnection'); assert( - mockChangeActiveConnection.calledOnce, + fakeChangeActiveConnection.calledOnce, 'Expected "changeActiveConnection" to be called on the playground controller.' ); }); test('mdb.refreshPlaygrounds refreshes the playgrounds explorer once', async () => { - const mockRefreshPlaygrounds = sinon.fake(); + const fakeRefresh = sinon.fake(); sinon.replace( mdbTestExtension.testExtensionController._playgroundsExplorer, 'refresh', - mockRefreshPlaygrounds + fakeRefresh ); await vscode.commands.executeCommand('mdb.refreshPlaygrounds'); assert( - mockRefreshPlaygrounds.calledOnce, + fakeRefresh.calledOnce, 'Expected "refreshPlaygrounds" to be called on the playground controller.' ); }); @@ -1354,7 +1351,7 @@ suite('MDBExtensionController Test Suite', function () { const findStub = sinon.stub(); findStub.resolves([mockDocument]); - const mockDataService = { + const dataServiceStub = { find: (namespace: string) => { namespaceUsed = namespace; return Promise.resolve([mockDocument]); @@ -1364,21 +1361,21 @@ suite('MDBExtensionController Test Suite', function () { mockDocument, 'waffle.house', 0, - mockDataService, + dataServiceStub, () => Promise.resolve() ); - const mockCopyToClipboard = sinon.fake(); + const fakeWriteText = sinon.fake(); sinon.replaceGetter(vscode.env, 'clipboard', () => ({ - writeText: mockCopyToClipboard, + writeText: fakeWriteText, readText: sinon.fake(), })); await vscode.commands.executeCommand( 'mdb.copyDocumentContentsFromTreeView', documentTreeItem ); - assert.strictEqual(mockCopyToClipboard.called, true); + assert.strictEqual(fakeWriteText.called, true); assert.strictEqual( - mockCopyToClipboard.firstCall.args[0], + fakeWriteText.firstCall.args[0], `{ "_id": "pancakes", "time": { @@ -1396,7 +1393,7 @@ suite('MDBExtensionController Test Suite', function () { objectIdField: new ObjectId('57e193d7a9cc81b4027498b2'), }; let namespaceUsed = ''; - const mockDataService = { + const dataServiceStub = { find: (namespace: string) => { namespaceUsed = namespace; return Promise.resolve([mockDocument]); @@ -1406,22 +1403,22 @@ suite('MDBExtensionController Test Suite', function () { mockDocument, 'waffle.house', 0, - mockDataService, + dataServiceStub, () => Promise.resolve() ); - const mockCreatePlaygroundForCloneDocument = sinon.fake(); + const fakeCreatePlaygroundForCloneDocument = sinon.fake(); sinon.replace( mdbTestExtension.testExtensionController._playgroundController, 'createPlaygroundForCloneDocument', - mockCreatePlaygroundForCloneDocument + fakeCreatePlaygroundForCloneDocument ); await vscode.commands.executeCommand( 'mdb.cloneDocumentFromTreeView', documentTreeItem ); - assert.strictEqual(mockCreatePlaygroundForCloneDocument.calledOnce, true); + assert.strictEqual(fakeCreatePlaygroundForCloneDocument.calledOnce, true); assert.strictEqual( - mockCreatePlaygroundForCloneDocument.firstCall.args[0], + fakeCreatePlaygroundForCloneDocument.firstCall.args[0], `{ _id: 'pancakes', time: ISODate('3001-01-01T05:00:00.000Z'), @@ -1429,11 +1426,11 @@ suite('MDBExtensionController Test Suite', function () { }` ); assert.strictEqual( - mockCreatePlaygroundForCloneDocument.firstCall.args[1], + fakeCreatePlaygroundForCloneDocument.firstCall.args[1], 'waffle' ); assert.strictEqual( - mockCreatePlaygroundForCloneDocument.firstCall.args[2], + fakeCreatePlaygroundForCloneDocument.firstCall.args[2], 'house' ); assert.strictEqual(namespaceUsed, 'waffle.house'); @@ -1451,26 +1448,26 @@ suite('MDBExtensionController Test Suite', function () { false, null ); - const mockCreatePlaygroundForInsertDocument = sinon.fake(); + const fakeCreatePlaygroundForInsertDocument = sinon.fake(); sinon.replace( mdbTestExtension.testExtensionController._playgroundController, 'createPlaygroundForInsertDocument', - mockCreatePlaygroundForInsertDocument + fakeCreatePlaygroundForInsertDocument ); await vscode.commands.executeCommand( 'mdb.insertDocumentFromTreeView', collectionTreeItem ); assert.strictEqual( - mockCreatePlaygroundForInsertDocument.calledOnce, + fakeCreatePlaygroundForInsertDocument.calledOnce, true ); assert.strictEqual( - mockCreatePlaygroundForInsertDocument.firstCall.args[0], + fakeCreatePlaygroundForInsertDocument.firstCall.args[0], 'plants' ); assert.strictEqual( - mockCreatePlaygroundForInsertDocument.firstCall.args[1], + fakeCreatePlaygroundForInsertDocument.firstCall.args[1], 'pineapple' ); }); @@ -1483,11 +1480,11 @@ suite('MDBExtensionController Test Suite', function () { }, }; let calledDelete = false; - const mockDataService = { + const dataServiceStub = { deleteOne: ( namespace: string, - _id: any, - options: object, + filter: Filter, + options: DeleteOptions, callback: ( error: Error | undefined, result: { deletedCount: number } @@ -1503,7 +1500,7 @@ suite('MDBExtensionController Test Suite', function () { mockDocument, 'waffle.house', 0, - mockDataService, + dataServiceStub, () => Promise.resolve() ); const result = await vscode.commands.executeCommand( @@ -1515,7 +1512,7 @@ suite('MDBExtensionController Test Suite', function () { }); test('mdb.deleteDocumentFromTreeView deletes a document after confirmation', async () => { - fakeShowInformationMessage.resolves('Yes'); + showInformationMessageStub.resolves('Yes'); const mockDocument = { _id: 'pancakes', @@ -1525,17 +1522,17 @@ suite('MDBExtensionController Test Suite', function () { }; let namespaceUsed = ''; let _idUsed; - const mockDataService = { + const dataServiceStub = { deleteOne: ( namespace: string, - query: any, - options: object, + filter: Filter, + options: DeleteOptions, callback: ( error: Error | undefined, result: { deletedCount: number } ) => void ) => { - _idUsed = query; + _idUsed = filter; namespaceUsed = namespace; callback(undefined, { deletedCount: 1, @@ -1546,7 +1543,7 @@ suite('MDBExtensionController Test Suite', function () { mockDocument, 'waffle.house', 0, - mockDataService, + dataServiceStub, () => Promise.resolve() ); const result = await vscode.commands.executeCommand( @@ -1560,150 +1557,134 @@ suite('MDBExtensionController Test Suite', function () { assert.strictEqual(result, true); }); - suite( - 'when a user hasnt been shown the initial overview page yet and they have no connections saved', - () => { - let mockVSCodeExecuteCommand: SinonSpy; - let mockStorageControllerUpdate: SinonSpy; + suite('with mock execute command', function () { + let executeCommandStub: SinonStub; - beforeEach(() => { - mockVSCodeExecuteCommand = sinon.fake.resolves(undefined); - sinon.replace( - vscode.commands, - 'executeCommand', - mockVSCodeExecuteCommand - ); - sinon.replace( - mdbTestExtension.testExtensionController._storageController, - 'get', - sinon.fake.returns(false) - ); - sinon.replace( - mdbTestExtension.testExtensionController._storageController, - 'hasSavedConnections', - sinon.fake.returns(false) - ); + beforeEach(() => { + executeCommandStub = sinon.stub(vscode.commands, 'executeCommand'); + }); - mockStorageControllerUpdate = sinon.fake.resolves(undefined); - sinon.replace( - mdbTestExtension.testExtensionController._storageController, - 'update', - mockStorageControllerUpdate - ); + afterEach(() => { + sinon.restore(); + }); - void mdbTestExtension.testExtensionController.showOverviewPageIfRecentlyInstalled(); - }); + suite( + 'when a user hasnt been shown the initial overview page yet and they have no connections saved', + () => { + let fakeUpdate: SinonSpy; + + beforeEach(() => { + sinon.replace( + mdbTestExtension.testExtensionController._storageController, + 'get', + sinon.fake.returns(false) + ); + sinon.replace( + mdbTestExtension.testExtensionController._storageController, + 'hasSavedConnections', + sinon.fake.returns(false) + ); + + fakeUpdate = sinon.fake.resolves(undefined); + sinon.replace( + mdbTestExtension.testExtensionController._storageController, + 'update', + fakeUpdate + ); + + void mdbTestExtension.testExtensionController.showOverviewPageIfRecentlyInstalled(); + }); - afterEach(() => { - sinon.restore(); - }); + afterEach(() => { + sinon.restore(); + }); - test('they are shown the overview page', () => { - assert(mockVSCodeExecuteCommand.called); - assert.strictEqual( - mockVSCodeExecuteCommand.firstCall.args[0], - 'mdb.openOverviewPage' - ); - assert.strictEqual( - mockVSCodeExecuteCommand.firstCall.args[0], - EXTENSION_COMMANDS.MDB_OPEN_OVERVIEW_PAGE - ); - }); + test('they are shown the overview page', () => { + assert(executeCommandStub.called); + assert.strictEqual( + executeCommandStub.firstCall.args[0], + 'mdb.openOverviewPage' + ); + assert.strictEqual( + executeCommandStub.firstCall.args[0], + EXTENSION_COMMANDS.MDB_OPEN_OVERVIEW_PAGE + ); + }); - test("it sets that they've been shown the overview page", () => { - assert(mockStorageControllerUpdate.called); - assert.strictEqual( - mockStorageControllerUpdate.firstCall.args[0], - StorageVariables.GLOBAL_HAS_BEEN_SHOWN_INITIAL_VIEW - ); - assert.strictEqual( - mockStorageControllerUpdate.firstCall.args[0], - 'GLOBAL_HAS_BEEN_SHOWN_INITIAL_VIEW' - ); - assert.strictEqual( - mockStorageControllerUpdate.firstCall.args[1], - true - ); - }); - } - ); + test("it sets that they've been shown the overview page", () => { + assert(fakeUpdate.called); + assert.strictEqual( + fakeUpdate.firstCall.args[0], + StorageVariables.GLOBAL_HAS_BEEN_SHOWN_INITIAL_VIEW + ); + assert.strictEqual( + fakeUpdate.firstCall.args[0], + 'GLOBAL_HAS_BEEN_SHOWN_INITIAL_VIEW' + ); + assert.strictEqual(fakeUpdate.firstCall.args[1], true); + }); + } + ); + + suite( + 'when a user hasnt been shown the initial overview page yet and they have connections saved', + () => { + let fakeUpdate: SinonSpy; + + beforeEach(() => { + sinon.replace( + mdbTestExtension.testExtensionController._storageController, + 'get', + sinon.fake.returns(undefined) + ); + sinon.replace( + mdbTestExtension.testExtensionController._storageController, + 'hasSavedConnections', + sinon.fake.returns(true) + ); + fakeUpdate = sinon.fake.resolves(undefined); + sinon.replace( + mdbTestExtension.testExtensionController._storageController, + 'update', + fakeUpdate + ); + + void mdbTestExtension.testExtensionController.showOverviewPageIfRecentlyInstalled(); + }); - suite( - 'when a user hasnt been shown the initial overview page yet and they have connections saved', - () => { - let mockVSCodeExecuteCommand: SinonSpy; - let mockStorageControllerUpdate: SinonSpy; + test('they are not shown the overview page', () => { + assert(!executeCommandStub.called); + }); + test("it sets that they've been shown the overview page", () => { + assert(fakeUpdate.called); + assert.strictEqual( + fakeUpdate.firstCall.args[0], + StorageVariables.GLOBAL_HAS_BEEN_SHOWN_INITIAL_VIEW + ); + assert.strictEqual( + fakeUpdate.firstCall.args[0], + 'GLOBAL_HAS_BEEN_SHOWN_INITIAL_VIEW' + ); + assert.strictEqual(fakeUpdate.firstCall.args[1], true); + }); + } + ); + + suite('when a user has been shown the initial overview page', () => { beforeEach(() => { - mockVSCodeExecuteCommand = sinon.fake.resolves(undefined); - sinon.replace( - vscode.commands, - 'executeCommand', - mockVSCodeExecuteCommand - ); sinon.replace( mdbTestExtension.testExtensionController._storageController, 'get', - sinon.fake.returns(undefined) - ); - sinon.replace( - mdbTestExtension.testExtensionController._storageController, - 'hasSavedConnections', sinon.fake.returns(true) ); - mockStorageControllerUpdate = sinon.fake.resolves(undefined); - sinon.replace( - mdbTestExtension.testExtensionController._storageController, - 'update', - mockStorageControllerUpdate - ); void mdbTestExtension.testExtensionController.showOverviewPageIfRecentlyInstalled(); }); test('they are not shown the overview page', () => { - assert(!mockVSCodeExecuteCommand.called); - }); - - test("it sets that they've been shown the overview page", () => { - assert(mockStorageControllerUpdate.called); - assert.strictEqual( - mockStorageControllerUpdate.firstCall.args[0], - StorageVariables.GLOBAL_HAS_BEEN_SHOWN_INITIAL_VIEW - ); - assert.strictEqual( - mockStorageControllerUpdate.firstCall.args[0], - 'GLOBAL_HAS_BEEN_SHOWN_INITIAL_VIEW' - ); - assert.strictEqual( - mockStorageControllerUpdate.firstCall.args[1], - true - ); + assert(!executeCommandStub.called); }); - } - ); - - suite('when a user has been shown the initial overview page', () => { - let mockVSCodeExecuteCommand: SinonSpy; - - beforeEach(() => { - sinon.replace( - mdbTestExtension.testExtensionController._storageController, - 'get', - sinon.fake.returns(true) - ); - mockVSCodeExecuteCommand = sinon.fake.resolves(undefined); - sinon.replace( - vscode.commands, - 'executeCommand', - mockVSCodeExecuteCommand - ); - - void mdbTestExtension.testExtensionController.showOverviewPageIfRecentlyInstalled(); - }); - - test('they are not shown the overview page', () => { - assert(!mockVSCodeExecuteCommand.called); }); }); }); diff --git a/src/test/suite/snippets/stageAutocompleter.test.ts b/src/test/suite/snippets/stageAutocompleter.test.ts index 0b25840b4..6b5ea6d09 100644 --- a/src/test/suite/snippets/stageAutocompleter.test.ts +++ b/src/test/suite/snippets/stageAutocompleter.test.ts @@ -44,7 +44,7 @@ const STAGE_LABELS = [ suite('Stage Autocompleter Test Suite', () => { test('checks that stage-autocompleter.json exists and includes JSON with prefix, body and description', () => { - const properties: any = {}; + const properties: { prefix: string, body: string, description: string } | {} = {}; STAGE_LABELS.forEach((prop: string) => { properties[prop] = { diff --git a/src/test/suite/storage/storageController.test.ts b/src/test/suite/storage/storageController.test.ts index 395bceddc..0bcfeb347 100644 --- a/src/test/suite/storage/storageController.test.ts +++ b/src/test/suite/storage/storageController.test.ts @@ -6,17 +6,17 @@ import StorageController, { StorageVariables, StorageLocation, } from '../../../storage/storageController'; -import { TestExtensionContext } from '../stubs'; +import { ExtensionContextStub } from '../stubs'; suite('Storage Controller Test Suite', () => { test('getting a variable gets it from the global context store', () => { - const testExtensionContext = new TestExtensionContext(); - testExtensionContext._globalState = { + const extensionContextStub = new ExtensionContextStub(); + extensionContextStub._globalState = { [StorageVariables.GLOBAL_SAVED_CONNECTIONS]: { collOne: { name: 'this_gonna_get_saved' }, }, }; - const testStorageController = new StorageController(testExtensionContext); + const testStorageController = new StorageController(extensionContextStub); const testVal = testStorageController.get( StorageVariables.GLOBAL_SAVED_CONNECTIONS, StorageLocation.GLOBAL @@ -28,13 +28,13 @@ suite('Storage Controller Test Suite', () => { }); test('getting a variable from the workspace state gets it from the workspace context store', () => { - const testExtensionContext = new TestExtensionContext(); - testExtensionContext._workspaceState = { + const extensionContextStub = new ExtensionContextStub(); + extensionContextStub._workspaceState = { [StorageVariables.WORKSPACE_SAVED_CONNECTIONS]: { collTwo: { name: 'i_cant_believe_its_gonna_save_this' }, }, }; - const testStorageController = new StorageController(testExtensionContext); + const testStorageController = new StorageController(extensionContextStub); const testVal = testStorageController.get( StorageVariables.WORKSPACE_SAVED_CONNECTIONS, StorageLocation.WORKSPACE @@ -46,8 +46,8 @@ suite('Storage Controller Test Suite', () => { }); test('addNewConnectionToGlobalStore adds the connection to preexisting connections on the global storage', () => { - const testExtensionContext = new TestExtensionContext(); - testExtensionContext._globalState = { + const extensionContextStub = new ExtensionContextStub(); + extensionContextStub._globalState = { [StorageVariables.GLOBAL_SAVED_CONNECTIONS]: { conn1: { id: 'conn1', @@ -57,7 +57,7 @@ suite('Storage Controller Test Suite', () => { }, }, }; - const testStorageController = new StorageController(testExtensionContext); + const testStorageController = new StorageController(extensionContextStub); void testStorageController.saveConnectionToStore({ id: 'conn2', name: 'saved2', @@ -87,8 +87,8 @@ suite('Storage Controller Test Suite', () => { }); test('addNewConnectionToWorkspaceStore adds the connection to preexisting connections on the workspace store', () => { - const testExtensionContext = new TestExtensionContext(); - testExtensionContext._workspaceState = { + const extensionContextStub = new ExtensionContextStub(); + extensionContextStub._workspaceState = { [StorageVariables.WORKSPACE_SAVED_CONNECTIONS]: { conn1: { id: 'conn1', @@ -98,7 +98,7 @@ suite('Storage Controller Test Suite', () => { }, }, }; - const testStorageController = new StorageController(testExtensionContext); + const testStorageController = new StorageController(extensionContextStub); void testStorageController.saveConnectionToStore({ id: 'conn2', name: 'saved2', @@ -132,9 +132,9 @@ suite('Storage Controller Test Suite', () => { }); suite('for a new user that does not have anonymousId or userId', () => { - const testExtensionContext = new TestExtensionContext(); - testExtensionContext._globalState = {}; - const testStorageController = new StorageController(testExtensionContext); + const extensionContextStub = new ExtensionContextStub(); + extensionContextStub._globalState = {}; + const testStorageController = new StorageController(extensionContextStub); test('getUserIdentity adds anonymousId to the global storage and returns it to telemetry', () => { const userIdentity = testStorageController.getUserIdentity(); @@ -148,9 +148,9 @@ suite('Storage Controller Test Suite', () => { }); suite('for an old user that does not have anonymousId but has userId', () => { - const testExtensionContext = new TestExtensionContext(); - testExtensionContext._globalState = {}; - const testStorageController = new StorageController(testExtensionContext); + const extensionContextStub = new ExtensionContextStub(); + extensionContextStub._globalState = {}; + const testStorageController = new StorageController(extensionContextStub); const id = uuidv4(); before(async () => { @@ -174,8 +174,8 @@ suite('Storage Controller Test Suite', () => { }); test('when there are saved workspace connections, hasSavedConnections returns true', () => { - const testExtensionContext = new TestExtensionContext(); - testExtensionContext._workspaceState = { + const extensionContextStub = new ExtensionContextStub(); + extensionContextStub._workspaceState = { [StorageVariables.WORKSPACE_SAVED_CONNECTIONS]: { conn1: { id: 'conn1', @@ -183,13 +183,13 @@ suite('Storage Controller Test Suite', () => { }, }, }; - const testStorageController = new StorageController(testExtensionContext); + const testStorageController = new StorageController(extensionContextStub); assert(testStorageController.hasSavedConnections()); }); test('when there are saved global connections, hasSavedConnections returns true', () => { - const testExtensionContext = new TestExtensionContext(); - testExtensionContext._globalState = { + const extensionContextStub = new ExtensionContextStub(); + extensionContextStub._globalState = { [StorageVariables.GLOBAL_SAVED_CONNECTIONS]: { conn1: { id: 'conn1', @@ -197,14 +197,14 @@ suite('Storage Controller Test Suite', () => { }, }, }; - const testStorageController = new StorageController(testExtensionContext); + const testStorageController = new StorageController(extensionContextStub); assert(testStorageController.hasSavedConnections()); }); test('when there are no saved connections, hasSavedConnections returns false', () => { - const testExtensionContext = new TestExtensionContext(); - testExtensionContext._globalState = {}; - const testStorageController = new StorageController(testExtensionContext); + const extensionContextStub = new ExtensionContextStub(); + extensionContextStub._globalState = {}; + const testStorageController = new StorageController(extensionContextStub); assert(!testStorageController.hasSavedConnections()); }); }); diff --git a/src/test/suite/stubbableMdbExtension.ts b/src/test/suite/stubbableMdbExtension.ts index e991eb1e0..05677739e 100644 --- a/src/test/suite/stubbableMdbExtension.ts +++ b/src/test/suite/stubbableMdbExtension.ts @@ -1,5 +1,5 @@ import MDBExtensionController from '../../mdbExtensionController'; -import { TestExtensionContext } from './stubs'; +import { ExtensionContextStub } from './stubs'; // This interface has the instance of the extension we use for testing. // This should be used for integration tests and higher level extension @@ -7,6 +7,6 @@ import { TestExtensionContext } from './stubs'; // eslint-disable-next-line @typescript-eslint/no-namespace export namespace mdbTestExtension { - export let testExtensionContext: TestExtensionContext; + export let extensionContextStub: ExtensionContextStub; export let testExtensionController: MDBExtensionController; } diff --git a/src/test/suite/stubs.ts b/src/test/suite/stubs.ts index b04aa784c..f5df7a1fc 100644 --- a/src/test/suite/stubs.ts +++ b/src/test/suite/stubs.ts @@ -1,7 +1,13 @@ import * as vscode from 'vscode'; -import { CancellationTokenSource } from 'vscode-languageclient/node'; +import type { + CancellationTokenSource, + ServerOptions, + LanguageClientOptions, +} from 'vscode-languageclient/node'; +import { LanguageClient, TransportKind } from 'vscode-languageclient/node'; import { Duplex } from 'stream'; import path = require('path'); +import type { Document, Filter, FindOptions } from 'mongodb'; import { StorageController } from '../../storage'; @@ -12,7 +18,7 @@ import { } from '../../types/playgroundType'; // Bare mock of the extension context for vscode. -class TestExtensionContext implements vscode.ExtensionContext { +class ExtensionContextStub implements vscode.ExtensionContext { globalStoragePath: string; logPath: string; subscriptions: { dispose(): any }[]; @@ -45,7 +51,7 @@ class TestExtensionContext implements vscode.ExtensionContext { keys: (): readonly string[] => { return []; }, - get: (key: string): any => { + get: (key: string): T | undefined => { return this._workspaceState[key]; }, update: (key: string, value: any): Thenable => { @@ -59,7 +65,7 @@ class TestExtensionContext implements vscode.ExtensionContext { keys: (): readonly string[] => { return []; }, - get: (key: string): any => { + get: (key: string): T | undefined => { return this._globalState[key]; }, update: (key: string, value: any): Thenable => { @@ -132,7 +138,7 @@ const mockDatabases = { }, }; const mockDatabaseNames = Object.keys(mockDatabases); -const mockDocuments: any[] = []; +const mockDocuments: { _id: string }[] = []; const numberOfDocumentsToMock = 25; for (let i = 0; i < numberOfDocumentsToMock; i++) { mockDocuments.push({ @@ -151,7 +157,7 @@ class DataServiceStub { return Promise.resolve(mockDatabases[databaseName].collections); } - find(namespace: string, filter: any, options: any) { + find(namespace: string, filter: Filter, options: FindOptions) { return Promise.resolve(mockDocuments.slice(0, options.limit)); } @@ -224,20 +230,82 @@ const mockTextEditor = { hide: () => {}, }; -class MockLanguageServerController { - _context: TestExtensionContext; +class LanguageServerControllerStub { + _context: ExtensionContextStub; _storageController?: StorageController; _source?: CancellationTokenSource; _isExecutingInProgress: boolean; - _client: any; + _client: LanguageClient; constructor( - context: TestExtensionContext, + context: ExtensionContextStub, storageController: StorageController ) { this._context = context; this._storageController = storageController; - this._client = null; + + const module = path.join( + __dirname, + '..', + '..', + '..', + 'dist', + 'languageServer.js' + ); + const debugOptions = { execArgv: ['--nolazy', '--inspect=6012'] }; + + const serverOptions: ServerOptions = { + run: { module: '', transport: TransportKind.ipc }, + debug: { + module, + /* runtime: 'node.exe', */ transport: TransportKind.ipc, + options: debugOptions, + }, + }; + + const clientOptions: LanguageClientOptions = { + documentSelector: [ + { language: 'bat' }, + { language: 'bat', notebook: '*' }, + { scheme: 'file', pattern: '**/.vscode/test.txt' }, + ], + synchronize: { + configurationSection: 'testbed', + // fileEvents: workspace.createFileSystemWatcher('**/*'), + }, + diagnosticCollectionName: 'markers', + initializationOptions: 'Chris it gets passed to the server', + progressOnInitialization: true, + stdioEncoding: 'utf8', + // uriConverters: { + // code2Protocol: (value: Uri) => { + // return `vscode-${value.toString()}` + // }, + // protocol2Code: (value: string) => { + // return Uri.parse(value.substring(7)) + // } + // }, + middleware: { + didOpen: (document, next) => { + return next(document); + }, + }, + diagnosticPullOptions: { + onTabs: true, + onChange: true, + match: (selector, resource) => { + const fsPath = resource.fsPath; + return path.extname(fsPath) === '.bat'; + }, + }, + }; + + this._client = new LanguageClient( + 'test', + 'Test', + serverOptions, + clientOptions + ); this._isExecutingInProgress = false; } @@ -286,7 +354,7 @@ class MockLanguageServerController { } } -class TestStream extends Duplex { +class StreamStub extends Duplex { _write(chunk: string, _encoding: string, done: () => void) { this.emit('data', chunk); done(); @@ -303,7 +371,7 @@ export { mockDatabases, mockVSCodeTextDocument, DataServiceStub, - TestExtensionContext, - MockLanguageServerController, - TestStream, + ExtensionContextStub, + LanguageServerControllerStub, + StreamStub, }; diff --git a/src/test/suite/telemetry/connectionTelemetry.test.ts b/src/test/suite/telemetry/connectionTelemetry.test.ts index 5af6a48f3..0b5323fe5 100644 --- a/src/test/suite/telemetry/connectionTelemetry.test.ts +++ b/src/test/suite/telemetry/connectionTelemetry.test.ts @@ -14,7 +14,7 @@ const TEST_DATABASE_URI = 'mongodb://localhost:27018'; suite('ConnectionTelemetry Controller Test Suite', function () { suite('with mock data service', function () { this.timeout(8000); - let mockDataService: DataService; + let dataServiceStub: DataService; before(() => { const getConnectionStringStub = sinon.stub(); @@ -32,7 +32,7 @@ suite('ConnectionTelemetry Controller Test Suite', function () { host: {}, } as unknown as Awaited>); - mockDataService = { + dataServiceStub = { getConnectionString: getConnectionStringStub, instance: instanceStub, } as Pick< @@ -50,7 +50,7 @@ suite('ConnectionTelemetry Controller Test Suite', function () { test('it returns is_used_connect_screen true when the connection type is form', async () => { const instanceTelemetry = await connectionTelemetry.getConnectionTelemetryProperties( - mockDataService, + dataServiceStub, ConnectionTypes.CONNECTION_FORM ); @@ -62,7 +62,7 @@ suite('ConnectionTelemetry Controller Test Suite', function () { test('it returns is_used_command_palette true when the connection type is string', async () => { const instanceTelemetry = await connectionTelemetry.getConnectionTelemetryProperties( - mockDataService, + dataServiceStub, ConnectionTypes.CONNECTION_STRING ); @@ -74,7 +74,7 @@ suite('ConnectionTelemetry Controller Test Suite', function () { test('it returns is_used_saved_connection true when the connection type is id', async () => { const instanceTelemetry = await connectionTelemetry.getConnectionTelemetryProperties( - mockDataService, + dataServiceStub, ConnectionTypes.CONNECTION_ID ); @@ -86,7 +86,7 @@ suite('ConnectionTelemetry Controller Test Suite', function () { test('it has is_localhost false for a remote connection', async () => { const instanceTelemetry = await connectionTelemetry.getConnectionTelemetryProperties( - mockDataService, + dataServiceStub, ConnectionTypes.CONNECTION_STRING ); @@ -96,7 +96,7 @@ suite('ConnectionTelemetry Controller Test Suite', function () { test('it has a default is atlas false', async () => { const instanceTelemetry = await connectionTelemetry.getConnectionTelemetryProperties( - mockDataService, + dataServiceStub, ConnectionTypes.CONNECTION_STRING ); @@ -106,7 +106,7 @@ suite('ConnectionTelemetry Controller Test Suite', function () { test('it has a default driver auth mechanism undefined', async () => { const instanceTelemetry = await connectionTelemetry.getConnectionTelemetryProperties( - mockDataService, + dataServiceStub, ConnectionTypes.CONNECTION_STRING ); diff --git a/src/test/suite/telemetry/telemetryService.test.ts b/src/test/suite/telemetry/telemetryService.test.ts index 59af504ff..c44181f8e 100644 --- a/src/test/suite/telemetry/telemetryService.test.ts +++ b/src/test/suite/telemetry/telemetryService.test.ts @@ -6,6 +6,7 @@ import type { DataService } from 'mongodb-data-service'; import { config } from 'dotenv'; import { resolve } from 'path'; import sinon from 'sinon'; +import type { SinonSpy } from 'sinon'; import sinonChai from 'sinon-chai'; import SegmentAnalytics from 'analytics-node'; @@ -28,20 +29,20 @@ config({ path: resolve(__dirname, '../../../../.env') }); suite('Telemetry Controller Test Suite', () => { const testTelemetryService = mdbTestExtension.testExtensionController._telemetryService; - let mockDataService: DataService; + let dataServiceStub: DataService; - let mockTrackNewConnection: sinon.SinonSpy; - let mockTrackCommandRun: sinon.SinonSpy; - let mockTrackPlaygroundCodeExecuted: sinon.SinonSpy; - let mockTrackPlaygroundLoadedMethod: sinon.SinonSpy; - let mockTrack: sinon.SinonSpy; + let fakeTrackNewConnection: SinonSpy; + let fakeTrackCommandRun: SinonSpy; + let fakeTrackPlaygroundCodeExecuted: SinonSpy; + let fakeTrackPlaygroundLoadedMethod: SinonSpy; + let fakeTrack: SinonSpy; beforeEach(() => { - mockTrackNewConnection = sinon.fake.resolves(true); - mockTrackCommandRun = sinon.fake(); - mockTrackPlaygroundCodeExecuted = sinon.fake(); - mockTrackPlaygroundLoadedMethod = sinon.fake(); - mockTrack = sinon.fake(); + fakeTrackNewConnection = sinon.fake.resolves(true); + fakeTrackCommandRun = sinon.fake(); + fakeTrackPlaygroundCodeExecuted = sinon.fake(); + fakeTrackPlaygroundLoadedMethod = sinon.fake(); + fakeTrack = sinon.fake(); const instanceStub = sinon.stub(); instanceStub.resolves({ @@ -50,26 +51,26 @@ suite('Telemetry Controller Test Suite', () => { genuineMongoDB: {}, host: {}, } as unknown as Awaited>); - mockDataService = { + dataServiceStub = { instance: instanceStub, } as Pick as unknown as DataService; sinon.replace( mdbTestExtension.testExtensionController._telemetryService, 'trackCommandRun', - mockTrackCommandRun + fakeTrackCommandRun ); sinon.replace( mdbTestExtension.testExtensionController._playgroundController ._telemetryService, 'trackPlaygroundCodeExecuted', - mockTrackPlaygroundCodeExecuted + fakeTrackPlaygroundCodeExecuted ); sinon.replace( mdbTestExtension.testExtensionController._playgroundController ._telemetryService, 'trackPlaygroundLoaded', - mockTrackPlaygroundLoadedMethod + fakeTrackPlaygroundLoadedMethod ); sinon.replace( mdbTestExtension.testExtensionController._languageServerController, @@ -97,6 +98,7 @@ suite('Telemetry Controller Test Suite', () => { 'getMongoClientConnectionOptions', sinon.fake.returns('mongodb://localhost') ); + sinon.stub(vscode.window, 'showErrorMessage'); }); afterEach(() => { @@ -120,70 +122,70 @@ suite('Telemetry Controller Test Suite', () => { test('track command run event', async () => { await vscode.commands.executeCommand('mdb.addConnection'); - sinon.assert.calledWith(mockTrackCommandRun, 'mdb.addConnection'); + sinon.assert.calledWith(fakeTrackCommandRun, 'mdb.addConnection'); }); test('track new connection event when connecting via connection string', () => { - const mockConnectionController = + const testConnectionController = mdbTestExtension.testExtensionController._connectionController; sinon.replace( mdbTestExtension.testExtensionController._telemetryService, 'trackNewConnection', - mockTrackNewConnection + fakeTrackNewConnection ); - mockConnectionController.sendTelemetry( - mockDataService, + testConnectionController.sendTelemetry( + dataServiceStub, ConnectionTypes.CONNECTION_STRING ); sinon.assert.calledWith( - mockTrackNewConnection, + fakeTrackNewConnection, sinon.match.any, sinon.match(ConnectionTypes.CONNECTION_STRING) ); }); test('track new connection event when connecting via connection form', () => { - const mockConnectionController = + const testConnectionController = mdbTestExtension.testExtensionController._connectionController; sinon.replace( mdbTestExtension.testExtensionController._telemetryService, 'trackNewConnection', - mockTrackNewConnection + fakeTrackNewConnection ); - mockConnectionController.sendTelemetry( - mockDataService, + testConnectionController.sendTelemetry( + dataServiceStub, ConnectionTypes.CONNECTION_FORM ); sinon.assert.calledWith( - mockTrackNewConnection, + fakeTrackNewConnection, sinon.match.any, sinon.match(ConnectionTypes.CONNECTION_FORM) ); }); test('track new connection event when connecting via saved connection', () => { - const mockConnectionController = + const testConnectionController = mdbTestExtension.testExtensionController._connectionController; sinon.replace( mdbTestExtension.testExtensionController._telemetryService, 'trackNewConnection', - mockTrackNewConnection + fakeTrackNewConnection ); - mockConnectionController.sendTelemetry( - mockDataService, + testConnectionController.sendTelemetry( + dataServiceStub, ConnectionTypes.CONNECTION_ID ); sinon.assert.calledWith( - mockTrackNewConnection, + fakeTrackNewConnection, sinon.match.any, sinon.match(ConnectionTypes.CONNECTION_ID) ); @@ -192,23 +194,23 @@ suite('Telemetry Controller Test Suite', () => { test('track document saved form a tree-view event', () => { const source = DocumentSource.DOCUMENT_SOURCE_TREEVIEW; - sinon.replace(testTelemetryService, 'track', mockTrack); + sinon.replace(testTelemetryService, 'track', fakeTrack); testTelemetryService.trackDocumentUpdated(source, true); sinon.assert.calledWith( - mockTrack, + fakeTrack, sinon.match('Document Updated'), sinon.match({ source, success: true }) ); }); test('track document opened form playground results', async () => { - const mockTrackDocumentOpenedInEditor = sinon.fake(); + const fakeTrackDocumentOpenedInEditor = sinon.fake(); sinon.replace( mdbTestExtension.testExtensionController._telemetryService, 'trackDocumentOpenedInEditor', - mockTrackDocumentOpenedInEditor + fakeTrackDocumentOpenedInEditor ); await vscode.commands.executeCommand( @@ -222,18 +224,16 @@ suite('Telemetry Controller Test Suite', () => { } ); - expect(mockTrackDocumentOpenedInEditor.firstCall.firstArg).to.be.equal( + expect(fakeTrackDocumentOpenedInEditor.firstCall.firstArg).to.be.equal( 'playground' ); }); test('track playground code executed event', async () => { - const mockPlaygroundController = + const testPlaygroundController = mdbTestExtension.testExtensionController._playgroundController; - - await mockPlaygroundController._evaluate('show dbs'); - - sinon.assert.called(mockTrackPlaygroundCodeExecuted); + await testPlaygroundController._evaluate('show dbs'); + sinon.assert.called(fakeTrackPlaygroundCodeExecuted); }); test('track playground loaded event', async () => { @@ -241,18 +241,14 @@ suite('Telemetry Controller Test Suite', () => { __dirname, '../../../../src/test/fixture/testSaving.mongodb' ); - await vscode.workspace.openTextDocument(vscode.Uri.file(docPath)); - - sinon.assert.called(mockTrackPlaygroundLoadedMethod); + sinon.assert.called(fakeTrackPlaygroundLoadedMethod); }); test('track playground saved event', () => { - sinon.replace(testTelemetryService, 'track', mockTrack); - + sinon.replace(testTelemetryService, 'track', fakeTrack); testTelemetryService.trackPlaygroundSaved(); - - sinon.assert.calledWith(mockTrack); + sinon.assert.calledWith(fakeTrack); }); test('track adds extension version to event properties when there are no event properties', () => { @@ -283,6 +279,7 @@ suite('Telemetry Controller Test Suite', () => { '_isTelemetryFeatureEnabled', sinon.fake.returns(true) ); + const fakeSegmentTrack = sinon.fake.yields(null); sinon.replace(testTelemetryService, '_segmentAnalytics', { track: fakeSegmentTrack, @@ -294,7 +291,6 @@ suite('Telemetry Controller Test Suite', () => { const telemetryEvent: SegmentProperties = fakeSegmentTrack.firstCall.args[0]; - expect(telemetryEvent.properties).to.deep.equal({ extension_version: version, source: DocumentSource.DOCUMENT_SOURCE_PLAYGROUND, @@ -336,7 +332,6 @@ suite('Telemetry Controller Test Suite', () => { await mdbTestExtension.testExtensionController._playgroundController._transpile(); const telemetryArgs = fakeSegmentTrack.firstCall.args[0]; - expect(telemetryArgs).to.deep.equal({ language, with_import_statements: false, @@ -379,7 +374,6 @@ suite('Telemetry Controller Test Suite', () => { await mdbTestExtension.testExtensionController._playgroundController._transpile(); const telemetryArgs = fakeSegmentTrack.firstCall.args[0]; - expect(telemetryArgs).to.deep.equal({ language, num_stages: 1, @@ -401,7 +395,6 @@ suite('Telemetry Controller Test Suite', () => { }, }; const type = testTelemetryService.getPlaygroundResultType(res); - expect(type).to.deep.equal('aggregation'); }); @@ -416,7 +409,6 @@ suite('Telemetry Controller Test Suite', () => { }, }; const type = testTelemetryService.getPlaygroundResultType(res); - expect(type).to.deep.equal('other'); }); @@ -431,7 +423,6 @@ suite('Telemetry Controller Test Suite', () => { }, }; const type = testTelemetryService.getPlaygroundResultType(res); - expect(type).to.deep.equal('other'); }); @@ -446,7 +437,6 @@ suite('Telemetry Controller Test Suite', () => { }, }; const type = testTelemetryService.getPlaygroundResultType(res); - expect(type).to.deep.equal('query'); }); @@ -461,7 +451,6 @@ suite('Telemetry Controller Test Suite', () => { }, }; const type = testTelemetryService.getPlaygroundResultType(res); - expect(type).to.deep.equal('other'); }); @@ -476,7 +465,6 @@ suite('Telemetry Controller Test Suite', () => { }, }; const type = testTelemetryService.getPlaygroundResultType(res); - expect(type).to.deep.equal('delete'); }); @@ -491,7 +479,6 @@ suite('Telemetry Controller Test Suite', () => { }, }; const type = testTelemetryService.getPlaygroundResultType(res); - expect(type).to.deep.equal('insert'); }); @@ -506,7 +493,6 @@ suite('Telemetry Controller Test Suite', () => { }, }; const type = testTelemetryService.getPlaygroundResultType(res); - expect(type).to.deep.equal('insert'); }); @@ -521,7 +507,6 @@ suite('Telemetry Controller Test Suite', () => { }, }; const type = testTelemetryService.getPlaygroundResultType(res); - expect(type).to.deep.equal('other'); }); @@ -536,7 +521,6 @@ suite('Telemetry Controller Test Suite', () => { }, }; const type = testTelemetryService.getPlaygroundResultType(res); - expect(type).to.deep.equal('other'); }); @@ -551,7 +535,6 @@ suite('Telemetry Controller Test Suite', () => { }, }; const type = testTelemetryService.getPlaygroundResultType(res); - expect(type).to.deep.equal('other'); }); @@ -566,7 +549,6 @@ suite('Telemetry Controller Test Suite', () => { }, }; const type = testTelemetryService.getPlaygroundResultType(res); - expect(type).to.deep.equal('update'); }); @@ -581,7 +563,6 @@ suite('Telemetry Controller Test Suite', () => { }, }; const type = testTelemetryService.getPlaygroundResultType(res); - expect(type).to.deep.equal('other'); }); }); diff --git a/src/test/suite/utils/linkHelper.test.ts b/src/test/suite/utils/linkHelper.test.ts index a7aebb104..cc7d2e601 100644 --- a/src/test/suite/utils/linkHelper.test.ts +++ b/src/test/suite/utils/linkHelper.test.ts @@ -67,19 +67,19 @@ suite('Open Link Test Suite', () => { }); test('handles errors', (done) => { - class MockedServer extends EventEmitter { + class EventEmitterStub extends EventEmitter { listen() {} } - const mockedServer: any = new MockedServer(); - const stubCreateServer: any = sinon + const eventEmitterStub: any = new EventEmitterStub(); + const createServerStub: any = sinon .stub(http, 'createServer') - .returns(mockedServer); + .returns(eventEmitterStub); openLink('https://mongodb.com', 4321).catch((e) => { expect(e.message).to.equal('some error'); - stubCreateServer.restore(); + createServerStub.restore(); done(); }); - mockedServer.emit('error', new Error('some error')); + eventEmitterStub.emit('error', new Error('some error')); }); test('does not allow insecure connections', (done) => { diff --git a/src/test/suite/views/webview-app/components/connect-form/general-tab/host.test.tsx b/src/test/suite/views/webview-app/components/connect-form/general-tab/host.test.tsx index bcd8ae83e..5f4ab6bae 100644 --- a/src/test/suite/views/webview-app/components/connect-form/general-tab/host.test.tsx +++ b/src/test/suite/views/webview-app/components/connect-form/general-tab/host.test.tsx @@ -1,7 +1,8 @@ import assert from 'assert'; import { shallow, ShallowWrapper } from 'enzyme'; import * as React from 'react'; -import * as sinon from 'sinon'; +import sinon from 'sinon'; +import type { SinonSpy } from 'sinon'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faMinus, faPlus } from '@fortawesome/free-solid-svg-icons'; @@ -88,8 +89,8 @@ describe('Host Component Test Suite', () => { }); describe('when add host is clicked', () => { - let fakeSetReplicaSet: sinon.SinonSpy; - let fakeUpdateHosts: sinon.SinonSpy; + let fakeSetReplicaSet: SinonSpy; + let fakeUpdateHosts: SinonSpy; beforeEach(() => { fakeSetReplicaSet = sinon.fake.returns(undefined); @@ -195,7 +196,7 @@ describe('Host Component Test Suite', () => { }); describe('when remove host is clicked', () => { - let fakeUpdateHosts: sinon.SinonSpy; + let fakeUpdateHosts: SinonSpy; beforeEach(() => { fakeUpdateHosts = sinon.fake.returns(undefined); diff --git a/src/test/suite/views/webviewController.test.ts b/src/test/suite/views/webviewController.test.ts index fc5c48ff6..0cfd848e4 100644 --- a/src/test/suite/views/webviewController.test.ts +++ b/src/test/suite/views/webviewController.test.ts @@ -10,7 +10,7 @@ import { MESSAGE_TYPES } from '../../../views/webview-app/extension-app-message- import { StatusView } from '../../../views'; import { StorageController } from '../../../storage'; import TelemetryService from '../../../telemetry/telemetryService'; -import { TestExtensionContext } from '../stubs'; +import { ExtensionContextStub } from '../stubs'; import { TEST_DATABASE_URI } from '../dbTestHelper'; import WebviewController, { getWebviewContent, @@ -48,7 +48,7 @@ suite('Webview Test Suite', () => { ); void testWebviewController.openWebview( - mdbTestExtension.testExtensionContext + mdbTestExtension.extensionContextStub ); assert(fakeVSCodeCreateWebviewPanel.called); @@ -71,17 +71,17 @@ suite('Webview Test Suite', () => { }); } - const fakeWebview: any = { + const webviewStub: any = { asWebviewUri: (jsUri) => { return jsUri; }, }; - const extensionPath = mdbTestExtension.testExtensionContext.extensionPath; + const extensionPath = mdbTestExtension.extensionContextStub.extensionPath; const htmlString = getWebviewContent({ extensionPath, telemetryUserId: '', - webview: fakeWebview, + webview: webviewStub, }); assert(htmlString.includes('dist/webviewApp.js')); @@ -101,7 +101,7 @@ suite('Webview Test Suite', () => { }, }; - const extensionPath = mdbTestExtension.testExtensionContext.extensionPath; + const extensionPath = mdbTestExtension.extensionContextStub.extensionPath; const htmlString = getWebviewContent({ extensionPath, telemetryUserId: 'MOCK_ANONYMOU_ID', @@ -116,14 +116,14 @@ suite('Webview Test Suite', () => { }); test('web view listens for a connect message and adds the connection', (done) => { - const testExtensionContext = new TestExtensionContext(); - const testStorageController = new StorageController(testExtensionContext); + const extensionContextStub = new ExtensionContextStub(); + const testStorageController = new StorageController(extensionContextStub); const testTelemetryService = new TelemetryService( testStorageController, - testExtensionContext + extensionContextStub ); const testConnectionController = new ConnectionController( - new StatusView(testExtensionContext), + new StatusView(extensionContextStub), testStorageController, testTelemetryService ); @@ -165,7 +165,7 @@ suite('Webview Test Suite', () => { ); void testWebviewController.openWebview( - mdbTestExtension.testExtensionContext + mdbTestExtension.extensionContextStub ); assert( @@ -185,14 +185,14 @@ suite('Webview Test Suite', () => { }); test('web view sends a successful connect result on a successful connection', (done) => { - const testExtensionContext = new TestExtensionContext(); - const testStorageController = new StorageController(testExtensionContext); + const extensionContextStub = new ExtensionContextStub(); + const testStorageController = new StorageController(extensionContextStub); const testTelemetryService = new TelemetryService( testStorageController, - testExtensionContext + extensionContextStub ); const testConnectionController = new ConnectionController( - new StatusView(testExtensionContext), + new StatusView(extensionContextStub), testStorageController, testTelemetryService ); @@ -234,7 +234,7 @@ suite('Webview Test Suite', () => { ); void testWebviewController.openWebview( - mdbTestExtension.testExtensionContext + mdbTestExtension.extensionContextStub ); assert( @@ -254,14 +254,14 @@ suite('Webview Test Suite', () => { }); test('web view sends an unsuccessful connect result on an unsuccessful connection', (done) => { - const testExtensionContext = new TestExtensionContext(); - const testStorageController = new StorageController(testExtensionContext); + const extensionContextStub = new ExtensionContextStub(); + const testStorageController = new StorageController(extensionContextStub); const testTelemetryService = new TelemetryService( testStorageController, - testExtensionContext + extensionContextStub ); const testConnectionController = new ConnectionController( - new StatusView(testExtensionContext), + new StatusView(extensionContextStub), testStorageController, testTelemetryService ); @@ -297,7 +297,7 @@ suite('Webview Test Suite', () => { ); void testWebviewController.openWebview( - mdbTestExtension.testExtensionContext + mdbTestExtension.extensionContextStub ); // Mock a connection call. @@ -313,14 +313,14 @@ suite('Webview Test Suite', () => { test('web view sends an unsuccessful connect result on an attempt that is overridden', function (done) { this.timeout(5000); - const testExtensionContext = new TestExtensionContext(); - const testStorageController = new StorageController(testExtensionContext); + const extensionContextStub = new ExtensionContextStub(); + const testStorageController = new StorageController(extensionContextStub); const testTelemetryService = new TelemetryService( testStorageController, - testExtensionContext + extensionContextStub ); const testConnectionController = new ConnectionController( - new StatusView(testExtensionContext), + new StatusView(extensionContextStub), testStorageController, testTelemetryService ); @@ -357,7 +357,7 @@ suite('Webview Test Suite', () => { testTelemetryService ); void testWebviewController.openWebview( - mdbTestExtension.testExtensionContext + mdbTestExtension.extensionContextStub ); // Mock a connection call. @@ -378,14 +378,14 @@ suite('Webview Test Suite', () => { }); test('web view opens file picker on file picker request', (done) => { - const testExtensionContext = new TestExtensionContext(); - const testStorageController = new StorageController(testExtensionContext); + const extensionContextStub = new ExtensionContextStub(); + const testStorageController = new StorageController(extensionContextStub); const testTelemetryService = new TelemetryService( testStorageController, - testExtensionContext + extensionContextStub ); const testConnectionController = new ConnectionController( - new StatusView(testExtensionContext), + new StatusView(extensionContextStub), testStorageController, testTelemetryService ); @@ -427,7 +427,7 @@ suite('Webview Test Suite', () => { ); void testWebviewController.openWebview( - mdbTestExtension.testExtensionContext + mdbTestExtension.extensionContextStub ); // Mock a connection call. @@ -438,14 +438,14 @@ suite('Webview Test Suite', () => { }); test('web view returns file name on file picker request', (done) => { - const testExtensionContext = new TestExtensionContext(); - const testStorageController = new StorageController(testExtensionContext); + const extensionContextStub = new ExtensionContextStub(); + const testStorageController = new StorageController(extensionContextStub); const testTelemetryService = new TelemetryService( testStorageController, - testExtensionContext + extensionContextStub ); const testConnectionController = new ConnectionController( - new StatusView(testExtensionContext), + new StatusView(extensionContextStub), testStorageController, testTelemetryService ); @@ -494,7 +494,7 @@ suite('Webview Test Suite', () => { ); void testWebviewController.openWebview( - mdbTestExtension.testExtensionContext + mdbTestExtension.extensionContextStub ); messageReceived({ @@ -504,14 +504,14 @@ suite('Webview Test Suite', () => { }); test('web view runs the "connectWithURI" command when open connection string input is recieved', (done) => { - const testExtensionContext = new TestExtensionContext(); - const testStorageController = new StorageController(testExtensionContext); + const extensionContextStub = new ExtensionContextStub(); + const testStorageController = new StorageController(extensionContextStub); const testTelemetryService = new TelemetryService( testStorageController, - testExtensionContext + extensionContextStub ); const testConnectionController = new ConnectionController( - new StatusView(testExtensionContext), + new StatusView(extensionContextStub), testStorageController, testTelemetryService ); @@ -544,7 +544,7 @@ suite('Webview Test Suite', () => { ); void testWebviewController.openWebview( - mdbTestExtension.testExtensionContext + mdbTestExtension.extensionContextStub ); messageReceived({ @@ -562,14 +562,14 @@ suite('Webview Test Suite', () => { }); test('webview returns the connection status on a connection status request', (done) => { - const testExtensionContext = new TestExtensionContext(); - const testStorageController = new StorageController(testExtensionContext); + const extensionContextStub = new ExtensionContextStub(); + const testStorageController = new StorageController(extensionContextStub); const testTelemetryService = new TelemetryService( testStorageController, - testExtensionContext + extensionContextStub ); const testConnectionController = new ConnectionController( - new StatusView(testExtensionContext), + new StatusView(extensionContextStub), testStorageController, testTelemetryService ); @@ -605,7 +605,7 @@ suite('Webview Test Suite', () => { ); void testWebviewController.openWebview( - mdbTestExtension.testExtensionContext + mdbTestExtension.extensionContextStub ); // Mock a connection status request call. @@ -615,14 +615,14 @@ suite('Webview Test Suite', () => { }); test('webview returns the connection status on a connection status request', (done) => { - const testExtensionContext = new TestExtensionContext(); - const testStorageController = new StorageController(testExtensionContext); + const extensionContextStub = new ExtensionContextStub(); + const testStorageController = new StorageController(extensionContextStub); const testTelemetryService = new TelemetryService( testStorageController, - testExtensionContext + extensionContextStub ); const testConnectionController = new ConnectionController( - new StatusView(testExtensionContext), + new StatusView(extensionContextStub), testStorageController, testTelemetryService ); @@ -659,7 +659,7 @@ suite('Webview Test Suite', () => { ); void testWebviewController.openWebview( - mdbTestExtension.testExtensionContext + mdbTestExtension.extensionContextStub ); void testConnectionController @@ -673,14 +673,14 @@ suite('Webview Test Suite', () => { }); test('calls to rename the active connection when a rename active connection message is passed', async () => { - const testExtensionContext = new TestExtensionContext(); - const testStorageController = new StorageController(testExtensionContext); + const extensionContextStub = new ExtensionContextStub(); + const testStorageController = new StorageController(extensionContextStub); const testTelemetryService = new TelemetryService( testStorageController, - testExtensionContext + extensionContextStub ); const testConnectionController = new ConnectionController( - new StatusView(testExtensionContext), + new StatusView(extensionContextStub), testStorageController, testTelemetryService ); @@ -718,7 +718,7 @@ suite('Webview Test Suite', () => { ); void testWebviewController.openWebview( - mdbTestExtension.testExtensionContext + mdbTestExtension.extensionContextStub ); await testConnectionController.addNewConnectionStringAndConnect( @@ -740,11 +740,11 @@ suite('Webview Test Suite', () => { }); suite('with a rendered webview', () => { - const testExtensionContext = new TestExtensionContext(); - const testStorageController = new StorageController(testExtensionContext); + const extensionContextStub = new ExtensionContextStub(); + const testStorageController = new StorageController(extensionContextStub); const testTelemetryService = new TelemetryService( testStorageController, - testExtensionContext + extensionContextStub ); let testConnectionController; @@ -755,7 +755,7 @@ suite('Webview Test Suite', () => { beforeEach(() => { testConnectionController = new ConnectionController( - new StatusView(testExtensionContext), + new StatusView(extensionContextStub), testStorageController, testTelemetryService ); @@ -784,7 +784,7 @@ suite('Webview Test Suite', () => { testTelemetryService ); - testWebviewController.openWebview(mdbTestExtension.testExtensionContext); + testWebviewController.openWebview(mdbTestExtension.extensionContextStub); }); test('it should handle opening trusted links', () => { From 74a9d1e31782d3254ff505a2a5e9ee4af1a5e384 Mon Sep 17 00:00:00 2001 From: Alena Khineika Date: Wed, 1 Mar 2023 17:54:47 +0100 Subject: [PATCH 33/36] refactor: command palette clean up --- package.json | 44 +++++++------------ src/commands/index.ts | 6 +-- src/connectionController.ts | 12 +++++ src/mdbExtensionController.ts | 9 +--- src/test/suite/extension.test.ts | 3 +- src/test/suite/mdbExtensionController.test.ts | 4 +- 6 files changed, 34 insertions(+), 44 deletions(-) diff --git a/package.json b/package.json index 187963ed4..cd32d89a8 100644 --- a/package.json +++ b/package.json @@ -108,7 +108,7 @@ }, { "view": "mongoDBPlaygroundsExplorer", - "contents": "No '.mongodb' playground files found in the workspace.\n[Create New Playground](command:mdb.createNewPlaygroundFromPlaygroundExplorer)" + "contents": "No MongoDB playground files found in the workspace.\n[Create New Playground](command:mdb.createNewPlaygroundFromTreeView)" } ], "languages": [ @@ -175,10 +175,6 @@ "command": "mdb.createPlayground", "title": "MongoDB: Create MongoDB Playground" }, - { - "command": "mdb.refreshPlaygrounds", - "title": "MongoDB: Refresh Playgrounds List" - }, { "command": "mdb.refreshPlaygroundsFromTreeView", "title": "Refresh", @@ -187,16 +183,12 @@ "dark": "images/dark/refresh.svg" } }, - { - "command": "mdb.createNewPlaygroundFromViewAction", - "title": "Create MongoDB Playground" - }, { "command": "mdb.createNewPlaygroundFromOverviewPage", "title": "Create MongoDB Playground" }, { - "command": "mdb.createNewPlaygroundFromPlaygroundExplorer", + "command": "mdb.createNewPlaygroundFromTreeView", "title": "Create MongoDB Playground", "icon": { "light": "images/light/add.svg", @@ -296,7 +288,7 @@ } }, { - "command": "mdb.openPlaygroundFromTreeItem", + "command": "mdb.openPlaygroundFromTreeView", "title": "Open Playground" }, { @@ -407,11 +399,7 @@ "menus": { "view/title": [ { - "command": "mdb.createNewPlaygroundFromViewAction", - "when": "view == mongoDBPlaygroundsExplorer" - }, - { - "command": "mdb.createNewPlaygroundFromPlaygroundExplorer", + "command": "mdb.createNewPlaygroundFromTreeView", "when": "view == mongoDBPlaygroundsExplorer", "group": "navigation@1" }, @@ -476,7 +464,7 @@ "group": "5@2" }, { - "command": "mdb.openPlaygroundFromTreeItem", + "command": "mdb.openPlaygroundFromTreeView", "when": "view == mongoDBPlaygroundsExplorer && viewItem == playgroundsTreeItem", "group": "1@1" }, @@ -630,6 +618,10 @@ } ], "commandPalette": [ + { + "command": "mdb.disconnect", + "when": "mdb.connectedToMongoDB == true" + }, { "command": "mdb.saveMongoDBDocument", "when": "editorLangId == json" @@ -644,23 +636,23 @@ }, { "command": "mdb.exportToRuby", - "when": "mdb.isPlayground == true" + "when": "mdb.isPlayground == true && connectedToMongoDB == true" }, { "command": "mdb.exportToPython", - "when": "mdb.isPlayground == true" + "when": "mdb.isPlayground == true && connectedToMongoDB == true" }, { "command": "mdb.exportToJava", - "when": "mdb.isPlayground == true" + "when": "mdb.isPlayground == true && connectedToMongoDB == true" }, { "command": "mdb.exportToCsharp", - "when": "mdb.isPlayground == true" + "when": "mdb.isPlayground == true && connectedToMongoDB == true" }, { "command": "mdb.exportToNode", - "when": "mdb.isPlayground == true" + "when": "mdb.isPlayground == true && connectedToMongoDB == true" }, { "command": "mdb.refreshPlaygroundsFromTreeView", @@ -678,16 +670,12 @@ "command": "mdb.addConnectionWithURI", "when": "false" }, - { - "command": "mdb.createNewPlaygroundFromViewAction", - "when": "false" - }, { "command": "mdb.createNewPlaygroundFromOverviewPage", "when": "false" }, { - "command": "mdb.createNewPlaygroundFromPlaygroundExplorer", + "command": "mdb.createNewPlaygroundFromTreeView", "when": "false" }, { @@ -715,7 +703,7 @@ "when": "false" }, { - "command": "mdb.openPlaygroundFromTreeItem", + "command": "mdb.openPlaygroundFromTreeView", "when": "false" }, { diff --git a/src/commands/index.ts b/src/commands/index.ts index 38f53e7be..41788dd97 100644 --- a/src/commands/index.ts +++ b/src/commands/index.ts @@ -26,7 +26,6 @@ enum EXTENSION_COMMANDS { MDB_SAVE_MONGODB_DOCUMENT = 'mdb.saveMongoDBDocument', MDB_CHANGE_ACTIVE_CONNECTION = 'mdb.changeActiveConnection', - MDB_REFRESH_PLAYGROUNDS = 'mdb.refreshPlaygrounds', MDB_CODELENS_SHOW_MORE_DOCUMENTS = 'mdb.codeLens.showMoreDocumentsClicked', @@ -34,10 +33,9 @@ enum EXTENSION_COMMANDS { MDB_ADD_CONNECTION = 'mdb.addConnection', MDB_ADD_CONNECTION_WITH_URI = 'mdb.addConnectionWithURI', MDB_REFRESH_PLAYGROUNDS_FROM_TREE_VIEW = 'mdb.refreshPlaygroundsFromTreeView', - MDB_OPEN_PLAYGROUND_FROM_TREE_VIEW = 'mdb.openPlaygroundFromTreeItem', + MDB_OPEN_PLAYGROUND_FROM_TREE_VIEW = 'mdb.openPlaygroundFromTreeView', MDB_CONNECT_TO_CONNECTION_TREE_VIEW = 'mdb.connectToConnectionTreeItem', - MDB_CREATE_PLAYGROUND_FROM_VIEW_ACTION = 'mdb.createNewPlaygroundFromViewAction', - MDB_CREATE_PLAYGROUND_FROM_PLAYGROUND_EXPLORER = 'mdb.createNewPlaygroundFromPlaygroundExplorer', + MDB_CREATE_PLAYGROUND_FROM_TREE_VIEW = 'mdb.createNewPlaygroundFromTreeView', MDB_DISCONNECT_FROM_CONNECTION_TREE_VIEW = 'mdb.disconnectFromConnectionTreeItem', MDB_REFRESH_CONNECTION = 'mdb.refreshConnection', MDB_COPY_CONNECTION_STRING = 'mdb.copyConnectionString', diff --git a/src/connectionController.ts b/src/connectionController.ts index bf2e3378b..7ceba13f8 100644 --- a/src/connectionController.ts +++ b/src/connectionController.ts @@ -491,6 +491,12 @@ export default class ConnectionController { // Send metrics to Segment this.sendTelemetry(dataService, connectionType); + void vscode.commands.executeCommand( + 'setContext', + 'mdb.connectedToMongoDB', + true + ); + return { successfullyConnected: true, connectionErrorMessage: '', @@ -570,6 +576,12 @@ export default class ConnectionController { await this._activeDataService.disconnect(); void vscode.window.showInformationMessage('MongoDB disconnected.'); this._activeDataService = null; + + void vscode.commands.executeCommand( + 'setContext', + 'mdb.connectedToMongoDB', + false + ); } catch (error) { // Show an error, however we still reset the active connection to free up the extension. void vscode.window.showErrorMessage( diff --git a/src/mdbExtensionController.ts b/src/mdbExtensionController.ts index 0f9c2d2ba..665490224 100644 --- a/src/mdbExtensionController.ts +++ b/src/mdbExtensionController.ts @@ -196,9 +196,6 @@ export default class MDBExtensionController implements vscode.Disposable { EXTENSION_COMMANDS.MDB_RUN_ALL_OR_SELECTED_PLAYGROUND_BLOCKS, () => this._playgroundController.runAllOrSelectedPlaygroundBlocks() ); - this.registerCommand(EXTENSION_COMMANDS.MDB_REFRESH_PLAYGROUNDS, () => - this._playgroundsExplorer.refresh() - ); // ------ EXPORT TO LANGUAGE ------ // this.registerCommand(EXTENSION_COMMANDS.MDB_EXPORT_TO_PYTHON, () => @@ -546,11 +543,7 @@ export default class MDBExtensionController implements vscode.Disposable { } ); this.registerCommand( - EXTENSION_COMMANDS.MDB_CREATE_PLAYGROUND_FROM_VIEW_ACTION, - () => this._playgroundController.createPlayground() - ); - this.registerCommand( - EXTENSION_COMMANDS.MDB_CREATE_PLAYGROUND_FROM_PLAYGROUND_EXPLORER, + EXTENSION_COMMANDS.MDB_CREATE_PLAYGROUND_FROM_TREE_VIEW, () => this._playgroundController.createPlayground() ); this.registerCommand( diff --git a/src/test/suite/extension.test.ts b/src/test/suite/extension.test.ts index 2be4de6bd..97be06fd7 100644 --- a/src/test/suite/extension.test.ts +++ b/src/test/suite/extension.test.ts @@ -25,8 +25,7 @@ suite('Extension Test Suite', () => { 'mdb.openMongoDBShell', 'mdb.createPlayground', 'mdb.createNewPlaygroundFromOverviewPage', - 'mdb.createNewPlaygroundFromPlaygroundExplorer', - 'mdb.createNewPlaygroundFromViewAction', + 'mdb.createNewPlaygroundFromTreeView', // Tree view commands. 'mdb.addConnection', diff --git a/src/test/suite/mdbExtensionController.test.ts b/src/test/suite/mdbExtensionController.test.ts index 7aedd5de6..d434ef67f 100644 --- a/src/test/suite/mdbExtensionController.test.ts +++ b/src/test/suite/mdbExtensionController.test.ts @@ -1325,14 +1325,14 @@ suite('MDBExtensionController Test Suite', function () { ); }); - test('mdb.refreshPlaygrounds refreshes the playgrounds explorer once', async () => { + test('mdb.refreshPlaygroundsFromTreeView refreshes the playgrounds explorer once', async () => { const fakeRefresh = sinon.fake(); sinon.replace( mdbTestExtension.testExtensionController._playgroundsExplorer, 'refresh', fakeRefresh ); - await vscode.commands.executeCommand('mdb.refreshPlaygrounds'); + await vscode.commands.executeCommand('mdb.refreshPlaygroundsFromTreeView'); assert( fakeRefresh.calledOnce, 'Expected "refreshPlaygrounds" to be called on the playground controller.' From 320a863f0da615307ce89f7f11989608cf1422c5 Mon Sep 17 00:00:00 2001 From: Alena Khineika Date: Wed, 1 Mar 2023 18:29:30 +0100 Subject: [PATCH 34/36] refactor: stub status view --- .../suite/commands/launchMongoShell.test.ts | 20 +++---- src/test/suite/connectionController.test.ts | 22 +++---- .../activeConnectionCodeLensProvider.test.ts | 32 +++++----- .../collectionDocumentsProvider.test.ts | 59 ++++++------------- .../editors/mongoDBDocumentService.test.ts | 22 ++----- .../editors/playgroundController.test.ts | 6 +- .../editors/playgroundResultProvider.test.ts | 15 +---- src/test/suite/mdbExtensionController.test.ts | 4 +- 8 files changed, 70 insertions(+), 110 deletions(-) diff --git a/src/test/suite/commands/launchMongoShell.test.ts b/src/test/suite/commands/launchMongoShell.test.ts index 301143dbe..5ba79ecdd 100644 --- a/src/test/suite/commands/launchMongoShell.test.ts +++ b/src/test/suite/commands/launchMongoShell.test.ts @@ -12,19 +12,19 @@ suite('Commands Test Suite', () => { mdbTestExtension.testExtensionController._connectionController; let showErrorMessageStub: SinonStub; - let fakeGetMongoClientConnectionOptions: SinonStub; - let fakeIsCurrentlyConnected: SinonStub; + let getMongoClientConnectionOptionsStub: SinonStub; + let isCurrentlyConnectedStub: SinonStub; let createTerminalStub: SinonStub; let sendTextStub: SinonSpy; beforeEach(() => { sinon.stub(vscode.window, 'showInformationMessage'); showErrorMessageStub = sinon.stub(vscode.window, 'showErrorMessage'); - fakeGetMongoClientConnectionOptions = sinon.stub( + getMongoClientConnectionOptionsStub = sinon.stub( testConnectionController, 'getMongoClientConnectionOptions' ); - fakeIsCurrentlyConnected = sinon.stub( + isCurrentlyConnectedStub = sinon.stub( testConnectionController, 'isCurrentlyConnected' ); @@ -68,11 +68,11 @@ suite('Commands Test Suite', () => { const expectedDriverUrl = 'mongodb://localhost:27018/?readPreference=primary&ssl=false'; - fakeGetMongoClientConnectionOptions.returns({ + getMongoClientConnectionOptionsStub.returns({ url: 'mongodb://localhost:27018/?readPreference=primary&ssl=false', options: {}, }); - fakeIsCurrentlyConnected.returns(true); + isCurrentlyConnectedStub.returns(true); await launchMongoShell(testConnectionController); @@ -105,12 +105,12 @@ suite('Commands Test Suite', () => { const expectedDriverUrl = 'mongodb://localhost:27018/?readPreference=primary&ssl=false'; - fakeGetMongoClientConnectionOptions.returns({ + getMongoClientConnectionOptionsStub.returns({ url: 'mongodb://localhost:27018/?readPreference=primary&ssl=false', options: {}, }); - fakeIsCurrentlyConnected.returns(true); + isCurrentlyConnectedStub.returns(true); await launchMongoShell(testConnectionController); assert(createTerminalStub.called); @@ -145,12 +145,12 @@ suite('Commands Test Suite', () => { const expectedDriverUrl = 'mongodb://localhost:27018/?readPreference=primary&ssl=false'; - fakeGetMongoClientConnectionOptions.returns({ + getMongoClientConnectionOptionsStub.returns({ url: 'mongodb://localhost:27018/?readPreference=primary&ssl=false', options: {}, }); - fakeIsCurrentlyConnected.returns(true); + isCurrentlyConnectedStub.returns(true); await launchMongoShell(testConnectionController); assert(createTerminalStub.called); diff --git a/src/test/suite/connectionController.test.ts b/src/test/suite/connectionController.test.ts index 64d603200..99455effc 100644 --- a/src/test/suite/connectionController.test.ts +++ b/src/test/suite/connectionController.test.ts @@ -909,14 +909,14 @@ suite('Connection Controller Test Suite', function () { sshTunnelPort: 22, }, }; - const mockSaveConnection = sinon.fake.resolves({ + const fakeSaveConnection = sinon.fake.resolves({ id: 'fb210b47-f85d-4823-8552-aa6d7825156b', }); sinon.replace( testConnectionController._storageController, 'saveConnection', - mockSaveConnection + fakeSaveConnection ); await testConnectionController._migratePreviouslySavedConnection( @@ -924,7 +924,7 @@ suite('Connection Controller Test Suite', function () { ); const connectionString = - mockSaveConnection.firstCall.args[0].connectionOptions?.connectionString; + fakeSaveConnection.firstCall.args[0].connectionOptions?.connectionString; assert.strictEqual(connectionString.includes(TEST_USER_USERNAME), true); assert.strictEqual(connectionString.includes(TEST_USER_PASSWORD), false); @@ -953,7 +953,7 @@ suite('Connection Controller Test Suite', function () { sshTunnelPort: 22, }, }; - const mockMigratePreviouslySavedConnection = sinon.fake.resolves({ + const fakeMigratePreviouslySavedConnection = sinon.fake.resolves({ id: '1d700f37-ba57-4568-9552-0ea23effea89', name: 'localhost:27017', storageLocation: 'GLOBAL', @@ -966,14 +966,14 @@ suite('Connection Controller Test Suite', function () { sinon.replace( testConnectionController, '_migratePreviouslySavedConnection', - mockMigratePreviouslySavedConnection + fakeMigratePreviouslySavedConnection ); await testConnectionController._getConnectionInfoWithSecrets( oldSavedConnectionInfo ); - assert.strictEqual(mockMigratePreviouslySavedConnection.called, true); + assert.strictEqual(fakeMigratePreviouslySavedConnection.called, true); }); test('_getConnectionInfoWithSecrets does not run a migration for new connections', async () => { @@ -995,12 +995,12 @@ suite('Connection Controller Test Suite', function () { assert.strictEqual(connections.length, 1); - const mockMigratePreviouslySavedConnection = sinon.fake(); + const fakeMigratePreviouslySavedConnection = sinon.fake(); sinon.replace( testConnectionController, '_migratePreviouslySavedConnection', - mockMigratePreviouslySavedConnection + fakeMigratePreviouslySavedConnection ); const newSavedConnectionInfoWithSecrets = @@ -1009,14 +1009,14 @@ suite('Connection Controller Test Suite', function () { ); assert.deepStrictEqual(newSavedConnectionInfoWithSecrets, connectionInfo); - assert.strictEqual(mockMigratePreviouslySavedConnection.called, false); + assert.strictEqual(fakeMigratePreviouslySavedConnection.called, false); }); test('addNewConnectionStringAndConnect saves connection without secrets to the global storage', async () => { - const mockConnect = sinon.fake.resolves({ + const fakeConnect = sinon.fake.resolves({ successfullyConnected: true, }); - sinon.replace(testConnectionController, '_connect', mockConnect); + sinon.replace(testConnectionController, '_connect', fakeConnect); await vscode.workspace .getConfiguration('mdb.connectionSaving') diff --git a/src/test/suite/editors/activeConnectionCodeLensProvider.test.ts b/src/test/suite/editors/activeConnectionCodeLensProvider.test.ts index 2f26a9519..4db748d79 100644 --- a/src/test/suite/editors/activeConnectionCodeLensProvider.test.ts +++ b/src/test/suite/editors/activeConnectionCodeLensProvider.test.ts @@ -32,15 +32,15 @@ suite('Active Connection CodeLens Provider Test Suite', () => { const testCodeLensProvider = new ActiveConnectionCodeLensProvider( testConnectionController ); - const testShowQuickPick = sinon.fake(); + const fakeShowQuickPick = sinon.fake(); beforeEach(() => { testCodeLensProvider.setActiveTextEditor( vscode.window.activeTextEditor ); - sinon.replace(vscode.window, 'showQuickPick', testShowQuickPick); - const testIsPlayground = sinon.fake.returns(true); - sinon.replace(testCodeLensProvider, 'isPlayground', testIsPlayground); + sinon.replace(vscode.window, 'showQuickPick', fakeShowQuickPick); + const fakeIsPlayground = sinon.fake.returns(true); + sinon.replace(testCodeLensProvider, 'isPlayground', fakeIsPlayground); }); afterEach(() => { @@ -82,12 +82,12 @@ suite('Active Connection CodeLens Provider Test Suite', () => { genuineMongoDB: {}, host: {}, } as unknown as Awaited>); - const testActiveDataService = { + const activeDataServiceStub = { find: findStub, instance: instanceStub, } as Pick as unknown as DataService; - testConnectionController.setActiveDataService(testActiveDataService); + testConnectionController.setActiveDataService(activeDataServiceStub); beforeEach(() => { testCodeLensProvider.setActiveTextEditor( @@ -98,8 +98,8 @@ suite('Active Connection CodeLens Provider Test Suite', () => { 'getActiveConnectionName', sinon.fake.returns('fakeName') ); - const testIsPlayground = sinon.fake.returns(true); - sinon.replace(testCodeLensProvider, 'isPlayground', testIsPlayground); + const fakeIsPlayground = sinon.fake.returns(true); + sinon.replace(testCodeLensProvider, 'isPlayground', fakeIsPlayground); }); afterEach(() => { @@ -133,12 +133,12 @@ suite('Active Connection CodeLens Provider Test Suite', () => { const testCodeLensProvider = new ActiveConnectionCodeLensProvider( testConnectionController ); - const testShowQuickPick = sinon.fake(); + const fakeShowQuickPick = sinon.fake(); beforeEach(() => { - sinon.replace(vscode.window, 'showQuickPick', testShowQuickPick); - const testIsPlayground = sinon.fake.returns(false); - sinon.replace(testCodeLensProvider, 'isPlayground', testIsPlayground); + sinon.replace(vscode.window, 'showQuickPick', fakeShowQuickPick); + const fakeIsPlayground = sinon.fake.returns(false); + sinon.replace(testCodeLensProvider, 'isPlayground', fakeIsPlayground); }); afterEach(() => { @@ -176,11 +176,11 @@ suite('Active Connection CodeLens Provider Test Suite', () => { genuineMongoDB: {}, host: {}, } as unknown as Awaited>); - const testActiveDataService = { + const activeDataServiceStub = { find: findStub, instance: instanceStub, } as Pick as unknown as DataService; - testConnectionController.setActiveDataService(testActiveDataService); + testConnectionController.setActiveDataService(activeDataServiceStub); beforeEach(() => { sinon.replace( @@ -188,8 +188,8 @@ suite('Active Connection CodeLens Provider Test Suite', () => { 'getActiveConnectionName', sinon.fake.returns('fakeName') ); - const testIsPlayground = sinon.fake.returns(false); - sinon.replace(testCodeLensProvider, 'isPlayground', testIsPlayground); + const fakeIsPlayground = sinon.fake.returns(false); + sinon.replace(testCodeLensProvider, 'isPlayground', fakeIsPlayground); }); afterEach(() => { diff --git a/src/test/suite/editors/collectionDocumentsProvider.test.ts b/src/test/suite/editors/collectionDocumentsProvider.test.ts index a52fc3519..2fcfa13d9 100644 --- a/src/test/suite/editors/collectionDocumentsProvider.test.ts +++ b/src/test/suite/editors/collectionDocumentsProvider.test.ts @@ -74,11 +74,13 @@ suite('Collection Documents Provider Test Suite', () => { ); const operationId = testQueryStore.createNewOperation(); - const uri = vscode.Uri.parse( `scheme:Results: filename.json?namespace=my-favorite-fruit-is.pineapple&operationId=${operationId}` ); + sinon.stub(testCollectionViewProvider._statusView, 'showMessage'); + sinon.stub(testCollectionViewProvider._statusView, 'hideMessage'); + const documents = await testCollectionViewProvider.provideTextDocumentContent(uri); assert.strictEqual( @@ -130,11 +132,13 @@ suite('Collection Documents Provider Test Suite', () => { ); const operationId = testQueryStore.createNewOperation(); - const uri = vscode.Uri.parse( `scheme:Results: filename.json?namespace=test.test&operationId=${operationId}` ); + sinon.stub(testCollectionViewProvider._statusView, 'showMessage'); + sinon.stub(testCollectionViewProvider._statusView, 'hideMessage'); + const documents = await testCollectionViewProvider.provideTextDocumentContent(uri); assert.strictEqual( @@ -178,6 +182,9 @@ suite('Collection Documents Provider Test Suite', () => { `scheme:Results: filename.json?namespace=vostok.mercury&operationId=${operationId}` ); + sinon.stub(testCollectionViewProvider._statusView, 'showMessage'); + sinon.stub(testCollectionViewProvider._statusView, 'hideMessage'); + await testCollectionViewProvider.provideTextDocumentContent(uri); assert( testQueryStore.operations[operationId].hasMoreDocumentsToShow === false, @@ -219,27 +226,23 @@ suite('Collection Documents Provider Test Suite', () => { ); const operationId = testQueryStore.createNewOperation(); - const uri = vscode.Uri.parse( `scheme:Results: filename.json?namespace=aaaaaaaa&operationId=${operationId}` ); - const fakeShowMessage = sinon.fake(); - sinon.replace(testStatusView, 'showMessage', fakeShowMessage); - - const fakeHideMessage = sinon.fake(); - sinon.replace(testStatusView, 'hideMessage', fakeHideMessage); + const showMessageStub = sinon.stub(testStatusView, 'showMessage'); + const hideMessageStub = sinon.stub(testStatusView, 'hideMessage'); mockActiveDataService.find = () => { - assert(fakeShowMessage.called); - assert(!fakeHideMessage.called); - assert(fakeShowMessage.firstCall.args[0] === 'Fetching documents...'); + assert(showMessageStub.called); + assert(!hideMessageStub.called); + assert(showMessageStub.firstCall.args[0] === 'Fetching documents...'); return Promise.resolve([{ field: 'aaaaaaaaaaaaaaaaa' }]); }; await testCollectionViewProvider.provideTextDocumentContent(uri); - assert(fakeHideMessage.called); + assert(hideMessageStub.called); }); test('provideTextDocumentContent sets different code lenses for different namespaces from the same connection', async () => { @@ -276,20 +279,8 @@ suite('Collection Documents Provider Test Suite', () => { 'getActiveDataService', fakeGetActiveDataService ); - - const fakeShowMessage = sinon.fake(); - sinon.replace( - testCollectionViewProvider._statusView, - 'showMessage', - fakeShowMessage - ); - - const fakeHideMessage = sinon.fake(); - sinon.replace( - testCollectionViewProvider._statusView, - 'hideMessage', - fakeHideMessage - ); + sinon.stub(testCollectionViewProvider._statusView, 'showMessage'); + sinon.stub(testCollectionViewProvider._statusView, 'hideMessage'); const connectionId = '1c8c2b06-fbfb-40b7-bd8a-bd1f8333a487'; const fakeActiveConnectionId = sinon.fake.returns(connectionId); @@ -478,20 +469,8 @@ suite('Collection Documents Provider Test Suite', () => { 'getActiveDataService', fakeGetActiveDataService ); - - const fakeShowMessage = sinon.fake(); - sinon.replace( - testCollectionViewProvider._statusView, - 'showMessage', - fakeShowMessage - ); - - const fakeHideMessage = sinon.fake(); - sinon.replace( - testCollectionViewProvider._statusView, - 'hideMessage', - fakeHideMessage - ); + sinon.stub(testCollectionViewProvider._statusView, 'showMessage'); + sinon.stub(testCollectionViewProvider._statusView, 'hideMessage'); const firstConnectionId = '1c8c2b06-fbfb-40b7-bd8a-bd1f8333a487'; const secondConnectionId = '333c2b06-hhhh-40b7-bd8a-bd1f8333a896'; diff --git a/src/test/suite/editors/mongoDBDocumentService.test.ts b/src/test/suite/editors/mongoDBDocumentService.test.ts index 102210690..cd9a07784 100644 --- a/src/test/suite/editors/mongoDBDocumentService.test.ts +++ b/src/test/suite/editors/mongoDBDocumentService.test.ts @@ -77,12 +77,8 @@ suite('MongoDB Document Service Test Suite', () => { 'getActiveDataService', fakeGetActiveDataService ); - - const fakeShowMessage = sinon.fake(); - sinon.replace(testStatusView, 'showMessage', fakeShowMessage); - - const fakeHideMessage = sinon.fake(); - sinon.replace(testStatusView, 'hideMessage', fakeHideMessage); + sinon.stub(testStatusView, 'showMessage'); + sinon.stub(testStatusView, 'hideMessage'); await testMongoDBDocumentService.replaceDocument({ namespace, @@ -121,11 +117,8 @@ suite('MongoDB Document Service Test Suite', () => { fakeGetActiveConnectionId ); - const fakeShowMessage = sinon.fake(); - sinon.replace(testStatusView, 'showMessage', fakeShowMessage); - - const fakeHideMessage = sinon.fake(); - sinon.replace(testStatusView, 'hideMessage', fakeHideMessage); + sinon.stub(testStatusView, 'showMessage'); + sinon.stub(testStatusView, 'hideMessage'); const result = await testMongoDBDocumentService.fetchDocument({ namespace, @@ -233,11 +226,8 @@ suite('MongoDB Document Service Test Suite', () => { fakeGetSavedConnectionName ); - const fakeShowMessage = sinon.fake(); - sinon.replace(testStatusView, 'showMessage', fakeShowMessage); - - const fakeHideMessage = sinon.fake(); - sinon.replace(testStatusView, 'hideMessage', fakeHideMessage); + sinon.stub(testStatusView, 'showMessage'); + sinon.stub(testStatusView, 'hideMessage'); try { await testMongoDBDocumentService.fetchDocument({ diff --git a/src/test/suite/editors/playgroundController.test.ts b/src/test/suite/editors/playgroundController.test.ts index 00ee5f3c6..8e999cec0 100644 --- a/src/test/suite/editors/playgroundController.test.ts +++ b/src/test/suite/editors/playgroundController.test.ts @@ -344,13 +344,13 @@ suite('Playground Controller Test Suite', function () { }); test('it shows an error message and restarts, and connects the language server when an error occurs in executeAll (out of memory can cause this)', async () => { - const mockConnectionDisposedError = new Error( + const fakeConnectionDisposedError = new Error( 'Pending response rejected since connection got disposed' ); - (mockConnectionDisposedError as any).code = -32097; + (fakeConnectionDisposedError as any).code = -32097; sinon .stub(languageServerControllerStub, 'executeAll') - .rejects(mockConnectionDisposedError); + .rejects(fakeConnectionDisposedError); const stubStartLanguageServer = sinon .stub(languageServerControllerStub, 'startLanguageServer') diff --git a/src/test/suite/editors/playgroundResultProvider.test.ts b/src/test/suite/editors/playgroundResultProvider.test.ts index 39847be68..11cd49dd6 100644 --- a/src/test/suite/editors/playgroundResultProvider.test.ts +++ b/src/test/suite/editors/playgroundResultProvider.test.ts @@ -378,19 +378,8 @@ suite('Playground Result Provider Test Suite', () => { }, } as unknown as DataService); - const fakeShowMessage = sinon.fake(); - sinon.replace( - testCollectionViewProvider._statusView, - 'showMessage', - fakeShowMessage - ); - - const fakeHideMessage = sinon.fake(); - sinon.replace( - testCollectionViewProvider._statusView, - 'hideMessage', - fakeHideMessage - ); + sinon.stub(testCollectionViewProvider._statusView, 'showMessage'); + sinon.stub(testCollectionViewProvider._statusView, 'hideMessage'); const operationId = testCollectionViewProvider._operationsStore.createNewOperation(); diff --git a/src/test/suite/mdbExtensionController.test.ts b/src/test/suite/mdbExtensionController.test.ts index d434ef67f..a22d7c2cb 100644 --- a/src/test/suite/mdbExtensionController.test.ts +++ b/src/test/suite/mdbExtensionController.test.ts @@ -1332,7 +1332,9 @@ suite('MDBExtensionController Test Suite', function () { 'refresh', fakeRefresh ); - await vscode.commands.executeCommand('mdb.refreshPlaygroundsFromTreeView'); + await vscode.commands.executeCommand( + 'mdb.refreshPlaygroundsFromTreeView' + ); assert( fakeRefresh.calledOnce, 'Expected "refreshPlaygrounds" to be called on the playground controller.' From 3e717e32c266695f927ac56da87c52e2bb0abed9 Mon Sep 17 00:00:00 2001 From: Alena Khineika Date: Wed, 1 Mar 2023 19:32:10 +0100 Subject: [PATCH 35/36] test: use sandbox instead of directly using sinon --- .../suite/commands/launchMongoShell.test.ts | 35 +-- src/test/suite/connectionController.test.ts | 35 +-- .../activeConnectionCodeLensProvider.test.ts | 124 ++++---- .../collectionDocumentsProvider.test.ts | 45 ++- .../editDocumentCodeLensProvider.test.ts | 9 +- .../suite/editors/editorsController.test.ts | 5 +- .../editors/mongoDBDocumentService.test.ts | 58 ++-- .../editors/playgroundController.test.ts | 101 +++---- .../editors/playgroundResultProvider.test.ts | 17 +- ...aygroundSelectedCodeActionProvider.test.ts | 22 +- .../suite/explorer/connectionTreeItem.test.ts | 12 +- .../suite/explorer/explorerController.test.ts | 15 +- src/test/suite/explorer/helpExplorer.test.ts | 18 +- .../suite/explorer/indexListTreeItem.test.ts | 5 +- .../suite/explorer/schemaTreeItem.test.ts | 14 +- .../language/languageServerController.test.ts | 13 +- src/test/suite/mdbExtensionController.test.ts | 275 +++++++++--------- .../telemetry/connectionTelemetry.test.ts | 12 +- src/test/suite/utils/linkHelper.test.ts | 21 +- 19 files changed, 407 insertions(+), 429 deletions(-) diff --git a/src/test/suite/commands/launchMongoShell.test.ts b/src/test/suite/commands/launchMongoShell.test.ts index 5ba79ecdd..63a0e040c 100644 --- a/src/test/suite/commands/launchMongoShell.test.ts +++ b/src/test/suite/commands/launchMongoShell.test.ts @@ -17,19 +17,21 @@ suite('Commands Test Suite', () => { let createTerminalStub: SinonStub; let sendTextStub: SinonSpy; + const sandbox = sinon.createSandbox(); + beforeEach(() => { - sinon.stub(vscode.window, 'showInformationMessage'); - showErrorMessageStub = sinon.stub(vscode.window, 'showErrorMessage'); - getMongoClientConnectionOptionsStub = sinon.stub( + sandbox.stub(vscode.window, 'showInformationMessage'); + showErrorMessageStub = sandbox.stub(vscode.window, 'showErrorMessage'); + getMongoClientConnectionOptionsStub = sandbox.stub( testConnectionController, 'getMongoClientConnectionOptions' ); - isCurrentlyConnectedStub = sinon.stub( + isCurrentlyConnectedStub = sandbox.stub( testConnectionController, 'isCurrentlyConnected' ); - createTerminalStub = sinon.stub(vscode.window, 'createTerminal'); - sendTextStub = sinon.stub(); + createTerminalStub = sandbox.stub(vscode.window, 'createTerminal'); + sendTextStub = sandbox.stub(); createTerminalStub.returns({ sendText: sendTextStub, show: () => {}, @@ -37,23 +39,16 @@ suite('Commands Test Suite', () => { }); afterEach(async () => { - sinon.restore(); - await testConnectionController.disconnect(); testConnectionController.clearAllConnections(); + sandbox.restore(); }); suite('bash env shell', () => { - const sandbox = sinon.createSandbox(); - beforeEach(() => { sandbox.replaceGetter(vscode.env, 'shell', () => 'bash'); }); - afterEach(() => { - sandbox.restore(); - }); - test('openMongoDBShell should show an error message when not connected', async () => { const expectedMessage = 'You need to be connected before launching the MongoDB Shell.'; @@ -91,16 +86,10 @@ suite('Commands Test Suite', () => { }); suite('Windows powershell env shell', () => { - const sandbox = sinon.createSandbox(); - beforeEach(() => { sandbox.replaceGetter(vscode.env, 'shell', () => 'powershell.exe'); }); - afterEach(() => { - sandbox.restore(); - }); - test('powershell openMongoDBShell should open a terminal with the active connection driver url', async () => { const expectedDriverUrl = 'mongodb://localhost:27018/?readPreference=primary&ssl=false'; @@ -131,16 +120,10 @@ suite('Commands Test Suite', () => { }); suite('Windows cmd env shell', () => { - const sandbox = sinon.createSandbox(); - beforeEach(() => { sandbox.replaceGetter(vscode.env, 'shell', () => 'cmd.exe'); }); - afterEach(() => { - sandbox.restore(); - }); - test('windows cmd openMongoDBShell should open a terminal with the active connection driver url', async () => { const expectedDriverUrl = 'mongodb://localhost:27018/?readPreference=primary&ssl=false'; diff --git a/src/test/suite/connectionController.test.ts b/src/test/suite/connectionController.test.ts index 99455effc..b93e4d90e 100644 --- a/src/test/suite/connectionController.test.ts +++ b/src/test/suite/connectionController.test.ts @@ -52,10 +52,11 @@ suite('Connection Controller Test Suite', function () { testTelemetryService ); let showErrorMessageStub: SinonStub; + const sandbox = sinon.createSandbox(); beforeEach(() => { - sinon.stub(vscode.window, 'showInformationMessage'); - showErrorMessageStub = sinon.stub(vscode.window, 'showErrorMessage'); + sandbox.stub(vscode.window, 'showInformationMessage'); + showErrorMessageStub = sandbox.stub(vscode.window, 'showErrorMessage'); }); afterEach(async () => { @@ -66,7 +67,7 @@ suite('Connection Controller Test Suite', function () { await testConnectionController.disconnect(); testConnectionController.clearAllConnections(); - sinon.restore(); + sandbox.restore(); }); test('it connects to mongodb', async () => { @@ -176,7 +177,7 @@ suite('Connection Controller Test Suite', function () { assert.strictEqual(succesfullyConnected, true); let wasSetToConnectingWhenDisconnecting = false; - sinon.replace(testConnectionController, 'disconnect', () => { + sandbox.replace(testConnectionController, 'disconnect', () => { wasSetToConnectingWhenDisconnecting = true; return Promise.resolve(true); @@ -542,9 +543,9 @@ suite('Connection Controller Test Suite', function () { const connectionId = testConnectionController.getActiveConnectionId() || 'zz'; - const inputBoxResolvesStub = sinon.stub(); + const inputBoxResolvesStub = sandbox.stub(); inputBoxResolvesStub.onCall(0).resolves('new connection name'); - sinon.replace(vscode.window, 'showInputBox', inputBoxResolvesStub); + sandbox.replace(vscode.window, 'showInputBox', inputBoxResolvesStub); const renameSuccess = await testConnectionController.renameConnection( connectionId @@ -601,9 +602,9 @@ suite('Connection Controller Test Suite', function () { assert.strictEqual(connections[connectionIds[0]].name, 'localhost:27018'); assert.strictEqual(connections[connectionIds[1]].name, 'localhost:27018'); - const inputBoxResolvesStub = sinon.stub(); + const inputBoxResolvesStub = sandbox.stub(); inputBoxResolvesStub.onCall(0).resolves('Lynx'); - sinon.replace(vscode.window, 'showInputBox', inputBoxResolvesStub); + sandbox.replace(vscode.window, 'showInputBox', inputBoxResolvesStub); const renameSuccess = await testConnectionController.renameConnection( connectionIds[0] @@ -758,7 +759,7 @@ suite('Connection Controller Test Suite', function () { storageLocation: StorageLocation.NONE, }; - sinon.replace( + sandbox.replace( testConnectionController, '_connectWithDataService', async (connectionOptions) => { @@ -909,11 +910,11 @@ suite('Connection Controller Test Suite', function () { sshTunnelPort: 22, }, }; - const fakeSaveConnection = sinon.fake.resolves({ + const fakeSaveConnection = sandbox.fake.resolves({ id: 'fb210b47-f85d-4823-8552-aa6d7825156b', }); - sinon.replace( + sandbox.replace( testConnectionController._storageController, 'saveConnection', fakeSaveConnection @@ -953,7 +954,7 @@ suite('Connection Controller Test Suite', function () { sshTunnelPort: 22, }, }; - const fakeMigratePreviouslySavedConnection = sinon.fake.resolves({ + const fakeMigratePreviouslySavedConnection = sandbox.fake.resolves({ id: '1d700f37-ba57-4568-9552-0ea23effea89', name: 'localhost:27017', storageLocation: 'GLOBAL', @@ -963,7 +964,7 @@ suite('Connection Controller Test Suite', function () { }, }); - sinon.replace( + sandbox.replace( testConnectionController, '_migratePreviouslySavedConnection', fakeMigratePreviouslySavedConnection @@ -995,9 +996,9 @@ suite('Connection Controller Test Suite', function () { assert.strictEqual(connections.length, 1); - const fakeMigratePreviouslySavedConnection = sinon.fake(); + const fakeMigratePreviouslySavedConnection = sandbox.fake(); - sinon.replace( + sandbox.replace( testConnectionController, '_migratePreviouslySavedConnection', fakeMigratePreviouslySavedConnection @@ -1013,10 +1014,10 @@ suite('Connection Controller Test Suite', function () { }); test('addNewConnectionStringAndConnect saves connection without secrets to the global storage', async () => { - const fakeConnect = sinon.fake.resolves({ + const fakeConnect = sandbox.fake.resolves({ successfullyConnected: true, }); - sinon.replace(testConnectionController, '_connect', fakeConnect); + sandbox.replace(testConnectionController, '_connect', fakeConnect); await vscode.workspace .getConfiguration('mdb.connectionSaving') diff --git a/src/test/suite/editors/activeConnectionCodeLensProvider.test.ts b/src/test/suite/editors/activeConnectionCodeLensProvider.test.ts index 4db748d79..0be49ac33 100644 --- a/src/test/suite/editors/activeConnectionCodeLensProvider.test.ts +++ b/src/test/suite/editors/activeConnectionCodeLensProvider.test.ts @@ -23,6 +23,8 @@ suite('Active Connection CodeLens Provider Test Suite', () => { const testStatusView = new StatusView(extensionContextStub); suite('the MongoDB playground in JS', () => { + const sandbox = sinon.createSandbox(); + suite('user is not connected', () => { const testConnectionController = new ConnectionController( testStatusView, @@ -32,19 +34,19 @@ suite('Active Connection CodeLens Provider Test Suite', () => { const testCodeLensProvider = new ActiveConnectionCodeLensProvider( testConnectionController ); - const fakeShowQuickPick = sinon.fake(); + const fakeShowQuickPick = sandbox.fake(); beforeEach(() => { testCodeLensProvider.setActiveTextEditor( vscode.window.activeTextEditor ); - sinon.replace(vscode.window, 'showQuickPick', fakeShowQuickPick); - const fakeIsPlayground = sinon.fake.returns(true); - sinon.replace(testCodeLensProvider, 'isPlayground', fakeIsPlayground); + sandbox.replace(vscode.window, 'showQuickPick', fakeShowQuickPick); + const fakeIsPlayground = sandbox.fake.returns(true); + sandbox.replace(testCodeLensProvider, 'isPlayground', fakeIsPlayground); }); afterEach(() => { - sinon.restore(); + sandbox.restore(); }); test('show disconnected message in code lenses', () => { @@ -69,41 +71,38 @@ suite('Active Connection CodeLens Provider Test Suite', () => { const testCodeLensProvider = new ActiveConnectionCodeLensProvider( testConnectionController ); - const findStub = sinon.stub(); - findStub.resolves([ - { - field: 'Text message', - }, - ]); - const instanceStub = sinon.stub(); - instanceStub.resolves({ - dataLake: {}, - build: {}, - genuineMongoDB: {}, - host: {}, - } as unknown as Awaited>); - const activeDataServiceStub = { - find: findStub, - instance: instanceStub, - } as Pick as unknown as DataService; - - testConnectionController.setActiveDataService(activeDataServiceStub); beforeEach(() => { + const findStub = sandbox.stub(); + findStub.resolves([ + { + field: 'Text message', + }, + ]); + const instanceStub = sandbox.stub(); + instanceStub.resolves({ + dataLake: {}, + build: {}, + genuineMongoDB: {}, + host: {}, + } as unknown as Awaited>); + const activeDataServiceStub = { + find: findStub, + instance: instanceStub, + } as Pick as unknown as DataService; + + testConnectionController.setActiveDataService(activeDataServiceStub); + testCodeLensProvider.setActiveTextEditor( vscode.window.activeTextEditor ); - sinon.replace( + sandbox.replace( testConnectionController, 'getActiveConnectionName', - sinon.fake.returns('fakeName') + sandbox.fake.returns('fakeName') ); - const fakeIsPlayground = sinon.fake.returns(true); - sinon.replace(testCodeLensProvider, 'isPlayground', fakeIsPlayground); - }); - - afterEach(() => { - sinon.restore(); + const fakeIsPlayground = sandbox.fake.returns(true); + sandbox.replace(testCodeLensProvider, 'isPlayground', fakeIsPlayground); }); test('show active connection in code lenses', () => { @@ -124,6 +123,8 @@ suite('Active Connection CodeLens Provider Test Suite', () => { }); suite('the regular JS file', () => { + const sandbox = sinon.createSandbox(); + suite('user is not connected', () => { const testConnectionController = new ConnectionController( testStatusView, @@ -133,16 +134,16 @@ suite('Active Connection CodeLens Provider Test Suite', () => { const testCodeLensProvider = new ActiveConnectionCodeLensProvider( testConnectionController ); - const fakeShowQuickPick = sinon.fake(); + const fakeShowQuickPick = sandbox.fake(); beforeEach(() => { - sinon.replace(vscode.window, 'showQuickPick', fakeShowQuickPick); - const fakeIsPlayground = sinon.fake.returns(false); - sinon.replace(testCodeLensProvider, 'isPlayground', fakeIsPlayground); + sandbox.replace(vscode.window, 'showQuickPick', fakeShowQuickPick); + const fakeIsPlayground = sandbox.fake.returns(false); + sandbox.replace(testCodeLensProvider, 'isPlayground', fakeIsPlayground); }); afterEach(() => { - sinon.restore(); + sandbox.restore(); }); test('show not show the active connection code lenses', () => { @@ -163,37 +164,32 @@ suite('Active Connection CodeLens Provider Test Suite', () => { testConnectionController ); - const findStub = sinon.stub(); - findStub.resolves([ - { - field: 'Text message', - }, - ]); - const instanceStub = sinon.stub(); - instanceStub.resolves({ - dataLake: {}, - build: {}, - genuineMongoDB: {}, - host: {}, - } as unknown as Awaited>); - const activeDataServiceStub = { - find: findStub, - instance: instanceStub, - } as Pick as unknown as DataService; - testConnectionController.setActiveDataService(activeDataServiceStub); - beforeEach(() => { - sinon.replace( + const findStub = sandbox.stub(); + findStub.resolves([ + { + field: 'Text message', + }, + ]); + const instanceStub = sandbox.stub(); + instanceStub.resolves({ + dataLake: {}, + build: {}, + genuineMongoDB: {}, + host: {}, + } as unknown as Awaited>); + const activeDataServiceStub = { + find: findStub, + instance: instanceStub, + } as Pick as unknown as DataService; + testConnectionController.setActiveDataService(activeDataServiceStub); + sandbox.replace( testConnectionController, 'getActiveConnectionName', - sinon.fake.returns('fakeName') + sandbox.fake.returns('fakeName') ); - const fakeIsPlayground = sinon.fake.returns(false); - sinon.replace(testCodeLensProvider, 'isPlayground', fakeIsPlayground); - }); - - afterEach(() => { - sinon.restore(); + const fakeIsPlayground = sandbox.fake.returns(false); + sandbox.replace(testCodeLensProvider, 'isPlayground', fakeIsPlayground); }); test('show not show the active connection code lensess', () => { diff --git a/src/test/suite/editors/collectionDocumentsProvider.test.ts b/src/test/suite/editors/collectionDocumentsProvider.test.ts index 2fcfa13d9..afc368500 100644 --- a/src/test/suite/editors/collectionDocumentsProvider.test.ts +++ b/src/test/suite/editors/collectionDocumentsProvider.test.ts @@ -39,16 +39,15 @@ suite('Collection Documents Provider Test Suite', () => { const sandbox = sinon.createSandbox(); beforeEach(() => { - sinon.stub(vscode.window, 'showInformationMessage'); + sandbox.stub(vscode.window, 'showInformationMessage'); }); afterEach(() => { sandbox.restore(); - sinon.restore(); }); test('provideTextDocumentContent parses uri and return documents in the form of a string from a find call', async () => { - const findStub = sinon.stub(); + const findStub = sandbox.stub(); findStub.resolves([{ field: 'Declaration of Independence' }]); const testDataService = { find: findStub, @@ -78,8 +77,8 @@ suite('Collection Documents Provider Test Suite', () => { `scheme:Results: filename.json?namespace=my-favorite-fruit-is.pineapple&operationId=${operationId}` ); - sinon.stub(testCollectionViewProvider._statusView, 'showMessage'); - sinon.stub(testCollectionViewProvider._statusView, 'hideMessage'); + sandbox.stub(testCollectionViewProvider._statusView, 'showMessage'); + sandbox.stub(testCollectionViewProvider._statusView, 'hideMessage'); const documents = await testCollectionViewProvider.provideTextDocumentContent(uri); @@ -106,7 +105,7 @@ suite('Collection Documents Provider Test Suite', () => { }, ]; - const findStub = sinon.stub(); + const findStub = sandbox.stub(); findStub.resolves(mockDocuments); const testDataService = { find: findStub, @@ -136,8 +135,8 @@ suite('Collection Documents Provider Test Suite', () => { `scheme:Results: filename.json?namespace=test.test&operationId=${operationId}` ); - sinon.stub(testCollectionViewProvider._statusView, 'showMessage'); - sinon.stub(testCollectionViewProvider._statusView, 'hideMessage'); + sandbox.stub(testCollectionViewProvider._statusView, 'showMessage'); + sandbox.stub(testCollectionViewProvider._statusView, 'hideMessage'); const documents = await testCollectionViewProvider.provideTextDocumentContent(uri); @@ -149,7 +148,7 @@ suite('Collection Documents Provider Test Suite', () => { }); test('provideTextDocumentContent sets hasMoreDocumentsToShow to false when there arent more documents', async () => { - const findStub = sinon.stub(); + const findStub = sandbox.stub(); findStub.resolves([{ field: 'Apollo' }, { field: 'Gemini ' }]); const testDataService = { find: findStub, @@ -182,8 +181,8 @@ suite('Collection Documents Provider Test Suite', () => { `scheme:Results: filename.json?namespace=vostok.mercury&operationId=${operationId}` ); - sinon.stub(testCollectionViewProvider._statusView, 'showMessage'); - sinon.stub(testCollectionViewProvider._statusView, 'hideMessage'); + sandbox.stub(testCollectionViewProvider._statusView, 'showMessage'); + sandbox.stub(testCollectionViewProvider._statusView, 'hideMessage'); await testCollectionViewProvider.provideTextDocumentContent(uri); assert( @@ -230,8 +229,8 @@ suite('Collection Documents Provider Test Suite', () => { `scheme:Results: filename.json?namespace=aaaaaaaa&operationId=${operationId}` ); - const showMessageStub = sinon.stub(testStatusView, 'showMessage'); - const hideMessageStub = sinon.stub(testStatusView, 'hideMessage'); + const showMessageStub = sandbox.stub(testStatusView, 'showMessage'); + const hideMessageStub = sandbox.stub(testStatusView, 'hideMessage'); mockActiveDataService.find = () => { assert(showMessageStub.called); @@ -269,22 +268,22 @@ suite('Collection Documents Provider Test Suite', () => { const documents: { _id: string; name?: string; price?: number }[] = [ { _id: '5ea8745ee4811fafe8b65ecb', name: 'nothing5' }, ]; - const fakeGetActiveDataService = sinon.fake.returns({ + const fakeGetActiveDataService = sandbox.fake.returns({ find: () => { return Promise.resolve(documents); }, }); - sinon.replace( + sandbox.replace( testCollectionViewProvider._connectionController, 'getActiveDataService', fakeGetActiveDataService ); - sinon.stub(testCollectionViewProvider._statusView, 'showMessage'); - sinon.stub(testCollectionViewProvider._statusView, 'hideMessage'); + sandbox.stub(testCollectionViewProvider._statusView, 'showMessage'); + sandbox.stub(testCollectionViewProvider._statusView, 'hideMessage'); const connectionId = '1c8c2b06-fbfb-40b7-bd8a-bd1f8333a487'; - const fakeActiveConnectionId = sinon.fake.returns(connectionId); - sinon.replace( + const fakeActiveConnectionId = sandbox.fake.returns(connectionId); + sandbox.replace( testCollectionViewProvider._connectionController, 'getActiveConnectionId', fakeActiveConnectionId @@ -459,18 +458,18 @@ suite('Collection Documents Provider Test Suite', () => { const documents: { _id: string; location?: string; district?: string }[] = [ { _id: '5ea8745ee4811fafe8b65ecb', location: 'alexanderplatz' }, ]; - const fakeGetActiveDataService = sinon.fake.returns({ + const fakeGetActiveDataService = sandbox.fake.returns({ find: () => { return Promise.resolve(documents); }, }); - sinon.replace( + sandbox.replace( testCollectionViewProvider._connectionController, 'getActiveDataService', fakeGetActiveDataService ); - sinon.stub(testCollectionViewProvider._statusView, 'showMessage'); - sinon.stub(testCollectionViewProvider._statusView, 'hideMessage'); + sandbox.stub(testCollectionViewProvider._statusView, 'showMessage'); + sandbox.stub(testCollectionViewProvider._statusView, 'hideMessage'); const firstConnectionId = '1c8c2b06-fbfb-40b7-bd8a-bd1f8333a487'; const secondConnectionId = '333c2b06-hhhh-40b7-bd8a-bd1f8333a896'; diff --git a/src/test/suite/editors/editDocumentCodeLensProvider.test.ts b/src/test/suite/editors/editDocumentCodeLensProvider.test.ts index 2ec2c0eb3..748e96bf9 100644 --- a/src/test/suite/editors/editDocumentCodeLensProvider.test.ts +++ b/src/test/suite/editors/editDocumentCodeLensProvider.test.ts @@ -31,7 +31,6 @@ suite('Edit Document Code Lens Provider Test Suite', () => { afterEach(() => { sandbox.restore(); - sinon.restore(); }); test('provideCodeLenses returns an empty array if codeLensesInfo is empty', () => { @@ -60,8 +59,8 @@ suite('Edit Document Code Lens Provider Test Suite', () => { source: DocumentSource.DOCUMENT_SOURCE_PLAYGROUND, }; - const fakeActiveConnectionId = sinon.fake.returns('tasty_sandwhich'); - sinon.replace( + const fakeActiveConnectionId = sandbox.fake.returns('tasty_sandwhich'); + sandbox.replace( testCodeLensProvider._connectionController, 'getActiveConnectionId', fakeActiveConnectionId @@ -94,8 +93,8 @@ suite('Edit Document Code Lens Provider Test Suite', () => { source: DocumentSource.DOCUMENT_SOURCE_PLAYGROUND, }; - const fakeActiveConnectionId = sinon.fake.returns('tasty_sandwhich'); - sinon.replace( + const fakeActiveConnectionId = sandbox.fake.returns('tasty_sandwhich'); + sandbox.replace( testCodeLensProvider._connectionController, 'getActiveConnectionId', fakeActiveConnectionId diff --git a/src/test/suite/editors/editorsController.test.ts b/src/test/suite/editors/editorsController.test.ts index 22366cc72..d001cbca6 100644 --- a/src/test/suite/editors/editorsController.test.ts +++ b/src/test/suite/editors/editorsController.test.ts @@ -19,13 +19,12 @@ suite('Editors Controller Test Suite', () => { let showErrorMessageStub: SinonStub; beforeEach(() => { - sinon.stub(vscode.window, 'showInformationMessage'); - showErrorMessageStub = sinon.stub(vscode.window, 'showErrorMessage'); + sandbox.stub(vscode.window, 'showInformationMessage'); + showErrorMessageStub = sandbox.stub(vscode.window, 'showErrorMessage'); }); afterEach(() => { sandbox.restore(); - sinon.restore(); }); suite('#getFileDisplayNameForDocumentId', () => { diff --git a/src/test/suite/editors/mongoDBDocumentService.test.ts b/src/test/suite/editors/mongoDBDocumentService.test.ts index cd9a07784..68948e02c 100644 --- a/src/test/suite/editors/mongoDBDocumentService.test.ts +++ b/src/test/suite/editors/mongoDBDocumentService.test.ts @@ -36,12 +36,14 @@ suite('MongoDB Document Service Test Suite', () => { testTelemetryService ); + const sandbox = sinon.createSandbox(); + beforeEach(() => { - sinon.stub(vscode.window, 'showErrorMessage'); + sandbox.stub(vscode.window, 'showErrorMessage'); }); afterEach(() => { - sinon.restore(); + sandbox.restore(); }); test('replaceDocument calls findOneAndReplace and saves a document when connected', async () => { @@ -52,14 +54,14 @@ suite('MongoDB Document Service Test Suite', () => { const newDocument = { _id: '123', price: 5000 }; const source = DocumentSource.DOCUMENT_SOURCE_TREEVIEW; - const fakeActiveConnectionId = sinon.fake.returns('tasty_sandwhich'); - sinon.replace( + const fakeActiveConnectionId = sandbox.fake.returns('tasty_sandwhich'); + sandbox.replace( testConnectionController, 'getActiveConnectionId', fakeActiveConnectionId ); - const fakeGetActiveDataService = sinon.fake.returns({ + const fakeGetActiveDataService = sandbox.fake.returns({ findOneAndReplace: ( namespace: string, filter: object, @@ -72,13 +74,13 @@ suite('MongoDB Document Service Test Suite', () => { return callback(null, document); }, }); - sinon.replace( + sandbox.replace( testConnectionController, 'getActiveDataService', fakeGetActiveDataService ); - sinon.stub(testStatusView, 'showMessage'); - sinon.stub(testStatusView, 'hideMessage'); + sandbox.stub(testStatusView, 'showMessage'); + sandbox.stub(testStatusView, 'hideMessage'); await testMongoDBDocumentService.replaceDocument({ namespace, @@ -99,26 +101,26 @@ suite('MongoDB Document Service Test Suite', () => { const documents = [{ _id: '123' }]; const source = DocumentSource.DOCUMENT_SOURCE_PLAYGROUND; - const fakeGetActiveDataService = sinon.fake.returns({ + const fakeGetActiveDataService = sandbox.fake.returns({ find: () => { return Promise.resolve([{ _id: '123' }]); }, }); - sinon.replace( + sandbox.replace( testConnectionController, 'getActiveDataService', fakeGetActiveDataService ); - const fakeGetActiveConnectionId = sinon.fake.returns(connectionId); - sinon.replace( + const fakeGetActiveConnectionId = sandbox.fake.returns(connectionId); + sandbox.replace( testConnectionController, 'getActiveConnectionId', fakeGetActiveConnectionId ); - sinon.stub(testStatusView, 'showMessage'); - sinon.stub(testStatusView, 'hideMessage'); + sandbox.stub(testStatusView, 'showMessage'); + sandbox.stub(testStatusView, 'hideMessage'); const result = await testMongoDBDocumentService.fetchDocument({ namespace, @@ -138,15 +140,15 @@ suite('MongoDB Document Service Test Suite', () => { const newDocument = { _id: '123', price: 5000 }; const source = DocumentSource.DOCUMENT_SOURCE_TREEVIEW; - const fakeActiveConnectionId = sinon.fake.returns(null); - sinon.replace( + const fakeActiveConnectionId = sandbox.fake.returns(null); + sandbox.replace( testConnectionController, 'getActiveConnectionId', fakeActiveConnectionId ); - const fakeGetSavedConnectionName = sinon.fake.returns('tasty_sandwhich'); - sinon.replace( + const fakeGetSavedConnectionName = sandbox.fake.returns('tasty_sandwhich'); + sandbox.replace( testConnectionController, 'getSavedConnectionName', fakeGetSavedConnectionName @@ -175,15 +177,15 @@ suite('MongoDB Document Service Test Suite', () => { const newDocument = { _id: '123', price: 5000 }; const source = DocumentSource.DOCUMENT_SOURCE_PLAYGROUND; - const fakeActiveConnectionId = sinon.fake.returns('berlin.coctails'); - sinon.replace( + const fakeActiveConnectionId = sandbox.fake.returns('berlin.coctails'); + sandbox.replace( testConnectionController, 'getActiveConnectionId', fakeActiveConnectionId ); - const fakeGetSavedConnectionName = sinon.fake.returns('tasty_sandwhich'); - sinon.replace( + const fakeGetSavedConnectionName = sandbox.fake.returns('tasty_sandwhich'); + sandbox.replace( testConnectionController, 'getSavedConnectionName', fakeGetSavedConnectionName @@ -212,22 +214,22 @@ suite('MongoDB Document Service Test Suite', () => { const line = 1; const source = DocumentSource.DOCUMENT_SOURCE_PLAYGROUND; - const fakeGetActiveConnectionId = sinon.fake.returns('345'); - sinon.replace( + const fakeGetActiveConnectionId = sandbox.fake.returns('345'); + sandbox.replace( testConnectionController, 'getActiveConnectionId', fakeGetActiveConnectionId ); - const fakeGetSavedConnectionName = sinon.fake.returns('tasty_sandwhich'); - sinon.replace( + const fakeGetSavedConnectionName = sandbox.fake.returns('tasty_sandwhich'); + sandbox.replace( testConnectionController, 'getSavedConnectionName', fakeGetSavedConnectionName ); - sinon.stub(testStatusView, 'showMessage'); - sinon.stub(testStatusView, 'hideMessage'); + sandbox.stub(testStatusView, 'showMessage'); + sandbox.stub(testStatusView, 'hideMessage'); try { await testMongoDBDocumentService.fetchDocument({ diff --git a/src/test/suite/editors/playgroundController.test.ts b/src/test/suite/editors/playgroundController.test.ts index 8e999cec0..a9816f775 100644 --- a/src/test/suite/editors/playgroundController.test.ts +++ b/src/test/suite/editors/playgroundController.test.ts @@ -81,44 +81,43 @@ suite('Playground Controller Test Suite', function () { let showErrorMessageStub: SinonStub; beforeEach(() => { - showErrorMessageStub = sinon.stub(vscode.window, 'showErrorMessage'); + showErrorMessageStub = sandbox.stub(vscode.window, 'showErrorMessage'); }); afterEach(() => { sandbox.restore(); - sinon.restore(); }); suite('passing connection details to service provider', () => { let fakeConnectToServiceProvider: SinonSpy; beforeEach(async () => { - const fakeGetActiveConnectionName = sinon.fake.returns('fakeName'); + const fakeGetActiveConnectionName = sandbox.fake.returns('fakeName'); const mockActiveDataService = { getMongoClientConnectionOptions: () => ({ url: 'mongodb://username@ldaphost:27017/?authMechanism=MONGODB-X509&readPreference=primary&appname=mongodb-vscode+0.0.0-dev.0&ssl=true&authSource=%24external&tlsAllowInvalidCertificates=true&tlsAllowInvalidHostnames=true&tlsCAFile=./path/to/ca&tlsCertificateKeyFile=./path/to/cert', options: { monitorCommands: true }, }), } as DataService; - const fakeGetActiveConnectionId = sinon.fake.returns('pineapple'); - fakeConnectToServiceProvider = sinon.fake.resolves(undefined); + const fakeGetActiveConnectionId = sandbox.fake.returns('pineapple'); + fakeConnectToServiceProvider = sandbox.fake.resolves(undefined); - sinon.replace( + sandbox.replace( testPlaygroundController._connectionController, 'getActiveConnectionName', fakeGetActiveConnectionName ); - sinon.replace( + sandbox.replace( testPlaygroundController._connectionController, 'getActiveConnectionId', fakeGetActiveConnectionId ); - sinon.replace( + sandbox.replace( testPlaygroundController._languageServerController, 'connectToServiceProvider', fakeConnectToServiceProvider ); - sinon.stub(vscode.window, 'showInformationMessage'); + sandbox.stub(vscode.window, 'showInformationMessage'); testPlaygroundController._connectionController.setActiveDataService( mockActiveDataService @@ -126,10 +125,6 @@ suite('Playground Controller Test Suite', function () { await testPlaygroundController._connectToServiceProvider(); }); - afterEach(() => { - sinon.restore(); - }); - test('it should pass the active connection id to the language server for connecting', () => { expect( ( @@ -163,16 +158,12 @@ suite('Playground Controller Test Suite', function () { testPlaygroundController._activeTextEditor = undefined; beforeEach(() => { - showInformationMessageStub = sinon.stub( + showInformationMessageStub = sandbox.stub( vscode.window, 'showInformationMessage' ); }); - afterEach(() => { - sinon.restore(); - }); - test('run all playground tells to open a playground file', async () => { const expectedMessage = 'Please open a MongoDB playground file before running it.'; @@ -212,7 +203,7 @@ suite('Playground Controller Test Suite', function () { languageId: 'javascript', uri: documentUri, getText: () => "use('dbName');", - lineAt: sinon.fake.returns({ text: "use('dbName');" }), + lineAt: sandbox.fake.returns({ text: "use('dbName');" }), }, selections: [ new vscode.Selection( @@ -226,26 +217,18 @@ suite('Playground Controller Test Suite', function () { testPlaygroundController._activeTextEditor = mockActiveTestEditor as vscode.TextEditor; testPlaygroundController._selectedText = undefined; - sinon.stub(vscode.window, 'showInformationMessage'); - }); - - afterEach(() => { - sinon.restore(); + sandbox.stub(vscode.window, 'showInformationMessage'); }); suite('user is not connected', () => { beforeEach(() => { - sinon.replace( + sandbox.replace( testPlaygroundController._connectionController, 'isCurrentlyConnected', - sinon.fake.returns(false) + sandbox.fake.returns(false) ); }); - afterEach(() => { - sinon.restore(); - }); - test('run all playground blocks shows please connect to a database error', async () => { const expectedMessage = 'Please connect to a database before running a playground.'; @@ -280,44 +263,40 @@ suite('Playground Controller Test Suite', function () { let showTextDocumentStub: SinonStub; beforeEach(async () => { - const fakeGetActiveConnectionName = sinon.fake.returns('fakeName'); - const fakeGetActiveDataService = sinon.fake.returns({ + const fakeGetActiveConnectionName = sandbox.fake.returns('fakeName'); + const fakeGetActiveDataService = sandbox.fake.returns({ getMongoClientConnectionOptions: () => ({ url: TEST_DATABASE_URI, options: {}, }), }); - const fakeGetActiveConnectionId = sinon.fake.returns('pineapple'); + const fakeGetActiveConnectionId = sandbox.fake.returns('pineapple'); - sinon.replace( + sandbox.replace( testPlaygroundController._connectionController, 'getActiveConnectionName', fakeGetActiveConnectionName ); - sinon.replace( + sandbox.replace( testPlaygroundController._connectionController, 'isCurrentlyConnected', - sinon.fake.returns(true) + sandbox.fake.returns(true) ); - sinon.replace( + sandbox.replace( testPlaygroundController._connectionController, 'getActiveDataService', fakeGetActiveDataService ); - sinon.replace( + sandbox.replace( testPlaygroundController._connectionController, 'getActiveConnectionId', fakeGetActiveConnectionId ); - showTextDocumentStub = sinon.stub(vscode.window, 'showTextDocument'); + showTextDocumentStub = sandbox.stub(vscode.window, 'showTextDocument'); await testPlaygroundController._connectToServiceProvider(); }); - afterEach(() => { - sinon.restore(); - }); - test('keep a playground in focus after running it', async () => { await testPlaygroundController._showResultAsVirtualDocument(); @@ -328,10 +307,10 @@ suite('Playground Controller Test Suite', function () { }); test('close cancelation modal when a playground is canceled', async () => { - sinon.replace( + sandbox.replace( testPlaygroundController, '_evaluate', - sinon.fake.rejects(false) + sandbox.fake.rejects(false) ); const result = @@ -344,13 +323,13 @@ suite('Playground Controller Test Suite', function () { }); test('it shows an error message and restarts, and connects the language server when an error occurs in executeAll (out of memory can cause this)', async () => { - const fakeConnectionDisposedError = new Error( + const mockConnectionDisposedError = new Error( 'Pending response rejected since connection got disposed' ); - (fakeConnectionDisposedError as any).code = -32097; + (mockConnectionDisposedError).code = -32097; sinon .stub(languageServerControllerStub, 'executeAll') - .rejects(fakeConnectionDisposedError); + .rejects(mockConnectionDisposedError); const stubStartLanguageServer = sinon .stub(languageServerControllerStub, 'startLanguageServer') @@ -455,31 +434,27 @@ suite('Playground Controller Test Suite', function () { let showInformationMessageStub: SinonStub; beforeEach(() => { - showInformationMessageStub = sinon.stub( + showInformationMessageStub = sandbox.stub( vscode.window, 'showInformationMessage' ); }); - afterEach(() => { - sinon.restore(); - }); - test('show a confirmation message if mdb.confirmRunAll is true', async () => { showInformationMessageStub.resolves('Yes'); - const fakeEvaluateWithCancelModal = sinon.fake.resolves({ + const fakeEvaluateWithCancelModal = sandbox.fake.resolves({ outputLines: [], result: '123', }); - sinon.replace( + sandbox.replace( testPlaygroundController, '_evaluateWithCancelModal', fakeEvaluateWithCancelModal ); - const fakeOpenPlaygroundResult = sinon.fake(); - sinon.replace( + const fakeOpenPlaygroundResult = sandbox.fake(); + sandbox.replace( testPlaygroundController, '_openPlaygroundResult', fakeOpenPlaygroundResult @@ -488,7 +463,7 @@ suite('Playground Controller Test Suite', function () { const result = await testPlaygroundController.runAllPlaygroundBlocks(); expect(result).to.be.equal(true); - sinon.assert.called(showInformationMessageStub); + sandbox.assert.called(showInformationMessageStub); }); test('do not show a confirmation message if mdb.confirmRunAll is false', async () => { @@ -498,18 +473,18 @@ suite('Playground Controller Test Suite', function () { .getConfiguration('mdb') .update('confirmRunAll', false); - const fakeEvaluateWithCancelModal = sinon.fake.resolves({ + const fakeEvaluateWithCancelModal = sandbox.fake.resolves({ outputLines: [], result: '123', }); - sinon.replace( + sandbox.replace( testPlaygroundController, '_evaluateWithCancelModal', fakeEvaluateWithCancelModal ); - const fakeOpenPlaygroundResult = sinon.fake(); - sinon.replace( + const fakeOpenPlaygroundResult = sandbox.fake(); + sandbox.replace( testPlaygroundController, '_openPlaygroundResult', fakeOpenPlaygroundResult @@ -518,7 +493,7 @@ suite('Playground Controller Test Suite', function () { const result = await testPlaygroundController.runAllPlaygroundBlocks(); expect(result).to.be.equal(true); - sinon.assert.notCalled(showInformationMessageStub); + sandbox.assert.notCalled(showInformationMessageStub); }); test('do not run a playground if user selected No in the confirmation message', async () => { diff --git a/src/test/suite/editors/playgroundResultProvider.test.ts b/src/test/suite/editors/playgroundResultProvider.test.ts index 11cd49dd6..89f68487c 100644 --- a/src/test/suite/editors/playgroundResultProvider.test.ts +++ b/src/test/suite/editors/playgroundResultProvider.test.ts @@ -39,7 +39,6 @@ suite('Playground Result Provider Test Suite', () => { afterEach(() => { sandbox.restore(); - sinon.restore(); }); test('constructor sets default playground result', () => { @@ -218,8 +217,8 @@ suite('Playground Result Provider Test Suite', () => { language: 'json', }; - const fakeUpdateCodeLensesForPlayground = sinon.fake(); - sinon.replace( + const fakeUpdateCodeLensesForPlayground = sandbox.fake(); + sandbox.replace( testPlaygroundResultViewProvider._editDocumentCodeLensProvider, 'updateCodeLensesForPlayground', fakeUpdateCodeLensesForPlayground @@ -252,8 +251,8 @@ suite('Playground Result Provider Test Suite', () => { language: 'json', }; - const fakeUpdateCodeLensesForPlayground = sinon.fake(); - sinon.replace( + const fakeUpdateCodeLensesForPlayground = sandbox.fake(); + sandbox.replace( testPlaygroundResultViewProvider._editDocumentCodeLensProvider, 'updateCodeLensesForPlayground', fakeUpdateCodeLensesForPlayground @@ -299,8 +298,8 @@ suite('Playground Result Provider Test Suite', () => { }; const connectionId = '1c8c2b06-fbfb-40b7-bd8a-bd1f8333a487'; - const fakeActiveConnectionId = sinon.fake.returns(connectionId); - sinon.replace( + const fakeActiveConnectionId = sandbox.fake.returns(connectionId); + sandbox.replace( testConnectionController, 'getActiveConnectionId', fakeActiveConnectionId @@ -378,8 +377,8 @@ suite('Playground Result Provider Test Suite', () => { }, } as unknown as DataService); - sinon.stub(testCollectionViewProvider._statusView, 'showMessage'); - sinon.stub(testCollectionViewProvider._statusView, 'hideMessage'); + sandbox.stub(testCollectionViewProvider._statusView, 'showMessage'); + sandbox.stub(testCollectionViewProvider._statusView, 'hideMessage'); const operationId = testCollectionViewProvider._operationsStore.createNewOperation(); diff --git a/src/test/suite/editors/playgroundSelectedCodeActionProvider.test.ts b/src/test/suite/editors/playgroundSelectedCodeActionProvider.test.ts index 66d969bf0..33b1cf52a 100644 --- a/src/test/suite/editors/playgroundSelectedCodeActionProvider.test.ts +++ b/src/test/suite/editors/playgroundSelectedCodeActionProvider.test.ts @@ -29,14 +29,15 @@ suite('Playground Selected CodeAction Provider Test Suite', function () { suite('the MongoDB playground in JS', () => { const testCodeActionProvider = new PlaygroundSelectedCodeActionProvider(); + const sandbox = sinon.createSandbox(); beforeEach(async () => { - sinon.replace( + sandbox.replace( mdbTestExtension.testExtensionController, '_languageServerController', new LanguageServerController(extensionContextStub) ); - sinon.stub(vscode.window, 'showInformationMessage'); + sandbox.stub(vscode.window, 'showInformationMessage'); await mdbTestExtension.testExtensionController._connectionController.addNewConnectionStringAndConnect( TEST_DATABASE_URI @@ -65,8 +66,8 @@ suite('Playground Selected CodeAction Provider Test Suite', function () { testExplorerController ); - const fakeOpenPlaygroundResult = sinon.fake(); - sinon.replace( + const fakeOpenPlaygroundResult = sandbox.fake(); + sandbox.replace( mdbTestExtension.testExtensionController._playgroundController, '_openPlaygroundResult', fakeOpenPlaygroundResult @@ -79,8 +80,8 @@ suite('Playground Selected CodeAction Provider Test Suite', function () { await mdbTestExtension.testExtensionController._languageServerController.startLanguageServer(); await mdbTestExtension.testExtensionController._playgroundController._connectToServiceProvider(); - const fakeIsPlayground = sinon.fake.returns(true); - sinon.replace(testCodeActionProvider, 'isPlayground', fakeIsPlayground); + const fakeIsPlayground = sandbox.fake.returns(true); + sandbox.replace(testCodeActionProvider, 'isPlayground', fakeIsPlayground); }); afterEach(async () => { @@ -92,7 +93,7 @@ suite('Playground Selected CodeAction Provider Test Suite', function () { .update('confirmRunAll', true); await mdbTestExtension.testExtensionController._connectionController.disconnect(); mdbTestExtension.testExtensionController._connectionController.clearAllConnections(); - sinon.restore(); + sandbox.restore(); }); test('returns undefined when text is not selected', () => { @@ -472,14 +473,15 @@ suite('Playground Selected CodeAction Provider Test Suite', function () { suite('the regular JS file', () => { const testCodeActionProvider = new PlaygroundSelectedCodeActionProvider(); + const sandbox = sinon.createSandbox(); beforeEach(() => { - const fakeIsPlayground = sinon.fake.returns(false); - sinon.replace(testCodeActionProvider, 'isPlayground', fakeIsPlayground); + const fakeIsPlayground = sandbox.fake.returns(false); + sandbox.replace(testCodeActionProvider, 'isPlayground', fakeIsPlayground); }); afterEach(() => { - sinon.restore(); + sandbox.restore(); }); test('returns undefined when text is not selected', () => { diff --git a/src/test/suite/explorer/connectionTreeItem.test.ts b/src/test/suite/explorer/connectionTreeItem.test.ts index 0ffc3919a..391115fa6 100644 --- a/src/test/suite/explorer/connectionTreeItem.test.ts +++ b/src/test/suite/explorer/connectionTreeItem.test.ts @@ -39,6 +39,7 @@ suite('ConnectionTreeItem Test Suite', () => { suite('#getChildren', () => { let testConnectionTreeItem: ConnectionTreeItem; + const sandbox = sinon.createSandbox(); beforeEach(() => { testConnectionTreeItem = new ConnectionTreeItem( @@ -52,11 +53,11 @@ suite('ConnectionTreeItem Test Suite', () => { }); afterEach(() => { - sinon.restore(); + sandbox.restore(); }); test('returns database tree items with the databases', async () => { - sinon.replace( + sandbox.replace( mdbTestExtension.testExtensionController._connectionController, 'getActiveDataService', () => new DataServiceStub() as unknown as DataService @@ -70,7 +71,7 @@ suite('ConnectionTreeItem Test Suite', () => { }); test('when listDatabases errors it wraps it in a nice message', async () => { - sinon.replace( + sandbox.replace( mdbTestExtension.testExtensionController._connectionController, 'getActiveDataService', () => @@ -96,6 +97,7 @@ suite('ConnectionTreeItem Test Suite', () => { suite('#listDatabases', () => { let testConnectionTreeItem: ConnectionTreeItem; + const sandbox = sinon.createSandbox(); beforeEach(() => { testConnectionTreeItem = new ConnectionTreeItem( @@ -109,11 +111,11 @@ suite('ConnectionTreeItem Test Suite', () => { }); afterEach(() => { - sinon.restore(); + sandbox.restore(); }); test('returns a list of database names', async () => { - sinon.replace( + sandbox.replace( mdbTestExtension.testExtensionController._connectionController, 'getActiveDataService', () => new DataServiceStub() as unknown as DataService diff --git a/src/test/suite/explorer/explorerController.test.ts b/src/test/suite/explorer/explorerController.test.ts index 41dda9c57..3257b8c6c 100644 --- a/src/test/suite/explorer/explorerController.test.ts +++ b/src/test/suite/explorer/explorerController.test.ts @@ -17,6 +17,7 @@ suite('Explorer Controller Test Suite', function () { // Longer timeout, sometimes it takes a few seconds for vscode to // load the extension before running tests. this.timeout(10000); + const sandbox = sinon.createSandbox(); beforeEach(async () => { // Don't save connections on default. @@ -26,8 +27,8 @@ suite('Explorer Controller Test Suite', function () { 'defaultConnectionSavingLocation', DefaultSavingLocations['Session Only'] ); - sinon.stub(vscode.window, 'showInformationMessage'); - sinon.stub(vscode.window, 'showErrorMessage'); + sandbox.stub(vscode.window, 'showInformationMessage'); + sandbox.stub(vscode.window, 'showErrorMessage'); }); afterEach(async () => { @@ -41,8 +42,8 @@ suite('Explorer Controller Test Suite', function () { // Reset our connections. await mdbTestExtension.testExtensionController._connectionController.disconnect(); mdbTestExtension.testExtensionController._connectionController.clearAllConnections(); - sinon.restore(); mdbTestExtension.testExtensionController._explorerController.deactivate(); + sandbox.restore(); }); test('it updates the connections to account for a change in the connection controller', async () => { @@ -324,17 +325,17 @@ suite('Explorer Controller Test Suite', function () { testExplorerController.activateConnectionsTreeView(); - const treeControllerStub = sinon.stub().returns(null); + const treeControllerStub = sandbox.stub().returns(null); - sinon.replace( + sandbox.replace( testExplorerController.getTreeController(), 'activateTreeViewEventHandlers', treeControllerStub ); - const vscodeCreateTreeViewStub = sinon.stub().returns(''); + const vscodeCreateTreeViewStub = sandbox.stub().returns(''); - sinon.replace(vscode.window, 'createTreeView', vscodeCreateTreeViewStub); + sandbox.replace(vscode.window, 'createTreeView', vscodeCreateTreeViewStub); await testConnectionController.addNewConnectionStringAndConnect( TEST_DATABASE_URI diff --git a/src/test/suite/explorer/helpExplorer.test.ts b/src/test/suite/explorer/helpExplorer.test.ts index 68f85d732..e2e0ddf9d 100644 --- a/src/test/suite/explorer/helpExplorer.test.ts +++ b/src/test/suite/explorer/helpExplorer.test.ts @@ -8,9 +8,11 @@ import * as linkHelper from '../../../utils/linkHelper'; import { mdbTestExtension } from '../stubbableMdbExtension'; suite('Help Explorer Test Suite', function () { + const sandbox = sinon.createSandbox(); + afterEach(() => { - sinon.restore(); mdbTestExtension.testExtensionController._helpExplorer.deactivate(); + sandbox.restore(); }); test('tree view should be not created until it is activated', () => { @@ -63,8 +65,8 @@ suite('Help Explorer Test Suite', function () { mdbTestExtension.testExtensionController._telemetryService ); - const stubExecuteCommand = sinon.fake(); - sinon.replace(vscode.commands, 'executeCommand', stubExecuteCommand); + const stubExecuteCommand = sandbox.fake(); + sandbox.replace(vscode.commands, 'executeCommand', stubExecuteCommand); const helpTreeItems = await testHelpExplorer._treeController.getChildren(); const atlasHelpItem = helpTreeItems[1]; void testHelpExplorer._treeController.onClickHelpItem( @@ -91,8 +93,8 @@ suite('Help Explorer Test Suite', function () { mdbTestExtension.testExtensionController._telemetryService ); - const stubExecuteCommand = sinon.fake(); - sinon.replace(linkHelper, 'openLink', stubExecuteCommand); + const stubExecuteCommand = sandbox.fake(); + sandbox.replace(linkHelper, 'openLink', stubExecuteCommand); const helpTreeItems = await testHelpExplorer._treeController.getChildren(); const atlasHelpItem = helpTreeItems[5]; void testHelpExplorer._treeController.onClickHelpItem( @@ -107,8 +109,8 @@ suite('Help Explorer Test Suite', function () { const testHelpExplorer = mdbTestExtension.testExtensionController._helpExplorer; - const stubLinkClickedTelemetry = sinon.fake(); - sinon.replace( + const stubLinkClickedTelemetry = sandbox.fake(); + sandbox.replace( mdbTestExtension.testExtensionController._telemetryService, 'trackLinkClicked', stubLinkClickedTelemetry @@ -117,7 +119,7 @@ suite('Help Explorer Test Suite', function () { mdbTestExtension.testExtensionController._telemetryService ); - sinon.replace(vscode.commands, 'executeCommand', sinon.fake()); + sandbox.replace(vscode.commands, 'executeCommand', sandbox.fake()); const helpTreeItems = await testHelpExplorer._treeController.getChildren(); const atlasHelpItem = helpTreeItems[5]; void testHelpExplorer._treeController.onClickHelpItem( diff --git a/src/test/suite/explorer/indexListTreeItem.test.ts b/src/test/suite/explorer/indexListTreeItem.test.ts index de4246c4f..cf62d347e 100644 --- a/src/test/suite/explorer/indexListTreeItem.test.ts +++ b/src/test/suite/explorer/indexListTreeItem.test.ts @@ -12,13 +12,14 @@ const { contributes } = require('../../../../package.json'); suite('IndexListTreeItem Test Suite', () => { let showErrorMessageStub: SinonStub; + const sandbox = sinon.createSandbox(); beforeEach(() => { - showErrorMessageStub = sinon.stub(vscode.window, 'showErrorMessage'); + showErrorMessageStub = sandbox.stub(vscode.window, 'showErrorMessage'); }); afterEach(() => { - sinon.restore(); + sandbox.restore(); }); test('its context value should be in the package json', () => { diff --git a/src/test/suite/explorer/schemaTreeItem.test.ts b/src/test/suite/explorer/schemaTreeItem.test.ts index 8626ed688..7ef0fc52b 100644 --- a/src/test/suite/explorer/schemaTreeItem.test.ts +++ b/src/test/suite/explorer/schemaTreeItem.test.ts @@ -25,8 +25,10 @@ const { contributes } = require('../../../../package.json'); suite('SchemaTreeItem Test Suite', function () { this.timeout(10000); + const sandbox = sinon.createSandbox(); + afterEach(() => { - sinon.restore(); + sandbox.restore(); }); test('its context value should be in the package json', () => { @@ -88,7 +90,7 @@ suite('SchemaTreeItem Test Suite', function () { const expectedMessage = 'No documents were found when attempting to parse schema.'; - const findStub = sinon.stub(); + const findStub = sandbox.stub(); findStub.resolves([]); const testDataService = { find: findStub, @@ -105,7 +107,7 @@ suite('SchemaTreeItem Test Suite', function () { {} ); - const showInformationMessageStub = sinon.stub( + const showInformationMessageStub = sandbox.stub( vscode.window, 'showInformationMessage' ); @@ -129,7 +131,7 @@ suite('SchemaTreeItem Test Suite', function () { for (let i = 0; i < 20; i++) { mockDocWithTwentyFields[`${i}`] = 'some value'; } - const findStub = sinon.stub(); + const findStub = sandbox.stub(); findStub.resolves([mockDocWithTwentyFields]); const testDataService = { find: findStub, @@ -166,7 +168,7 @@ suite('SchemaTreeItem Test Suite', function () { for (let i = 0; i < 30; i++) { mockDocWithThirtyFields[`${i}`] = 'some value'; } - const findStub = sinon.stub(); + const findStub = sandbox.stub(); findStub.resolves([mockDocWithThirtyFields]); const testDataService = { find: findStub, @@ -194,7 +196,7 @@ suite('SchemaTreeItem Test Suite', function () { }); test('When schema parsing fails it displays an error message', async () => { - const findStub = sinon.stub(); + const findStub = sandbox.stub(); findStub.resolves('invalid schema to parse' as unknown as Document[]); const testDataService = { find: findStub, diff --git a/src/test/suite/language/languageServerController.test.ts b/src/test/suite/language/languageServerController.test.ts index 1e3dc75cc..be17d4559 100644 --- a/src/test/suite/language/languageServerController.test.ts +++ b/src/test/suite/language/languageServerController.test.ts @@ -72,16 +72,17 @@ suite('Language Server Controller Test Suite', () => { testCodeActionProvider, testExplorerController ); + const sandbox = sinon.createSandbox(); before(async () => { await testLanguageServerController.startLanguageServer(); - sinon.replace( + sandbox.replace( testConnectionController, 'getActiveConnectionName', () => 'fakeName' ); - sinon.replace( + sandbox.replace( testConnectionController, 'getActiveDataService', () => @@ -92,13 +93,17 @@ suite('Language Server Controller Test Suite', () => { }), } as unknown as DataService) ); - sinon.replace(testConnectionController, 'isCurrentlyConnected', () => true); + sandbox.replace( + testConnectionController, + 'isCurrentlyConnected', + () => true + ); await testPlaygroundController._connectToServiceProvider(); }); after(() => { - sinon.restore(); + sandbox.restore(); }); test('cancel a long-running script', async () => { diff --git a/src/test/suite/mdbExtensionController.test.ts b/src/test/suite/mdbExtensionController.test.ts index a22d7c2cb..d174e669a 100644 --- a/src/test/suite/mdbExtensionController.test.ts +++ b/src/test/suite/mdbExtensionController.test.ts @@ -38,16 +38,17 @@ suite('MDBExtensionController Test Suite', function () { suite('when not connected', () => { let showErrorMessageStub: SinonSpy; + const sandbox = sinon.createSandbox(); beforeEach(() => { - sinon.stub(vscode.window, 'showInformationMessage'); - sinon.stub(vscode.workspace, 'openTextDocument'); - sinon.stub(vscode.window, 'showTextDocument'); - showErrorMessageStub = sinon.stub(vscode.window, 'showErrorMessage'); + sandbox.stub(vscode.window, 'showInformationMessage'); + sandbox.stub(vscode.workspace, 'openTextDocument'); + sandbox.stub(vscode.window, 'showTextDocument'); + showErrorMessageStub = sandbox.stub(vscode.window, 'showErrorMessage'); }); afterEach(() => { - sinon.restore(); + sandbox.restore(); }); test('mdb.addDatabase command fails when not connected to the connection', async () => { @@ -78,38 +79,38 @@ suite('MDBExtensionController Test Suite', function () { }); suite('when connected', () => { - const sandbox = sinon.createSandbox(); let showInformationMessageStub: SinonStub; let openTextDocumentStub: SinonStub; let fakeActiveConnectionId: SinonSpy; let showErrorMessageStub: SinonStub; let fakeCreatePlaygroundFileWithContent: SinonSpy; + const sandbox = sinon.createSandbox(); + beforeEach(() => { - showInformationMessageStub = sinon.stub( + showInformationMessageStub = sandbox.stub( vscode.window, 'showInformationMessage' ); - openTextDocumentStub = sinon.stub(vscode.workspace, 'openTextDocument'); - fakeActiveConnectionId = sinon.fake.returns('tasty_sandwhich'); - sinon.replace( + openTextDocumentStub = sandbox.stub(vscode.workspace, 'openTextDocument'); + fakeActiveConnectionId = sandbox.fake.returns('tasty_sandwhich'); + sandbox.replace( mdbTestExtension.testExtensionController._connectionController, 'getActiveConnectionId', fakeActiveConnectionId ); - fakeCreatePlaygroundFileWithContent = sinon.fake(); - sinon.replace( + fakeCreatePlaygroundFileWithContent = sandbox.fake(); + sandbox.replace( mdbTestExtension.testExtensionController._playgroundController, '_createPlaygroundFileWithContent', fakeCreatePlaygroundFileWithContent ); - showErrorMessageStub = sinon.stub(vscode.window, 'showErrorMessage'); - sinon.stub(vscode.window, 'showTextDocument'); + showErrorMessageStub = sandbox.stub(vscode.window, 'showErrorMessage'); + sandbox.stub(vscode.window, 'showTextDocument'); }); afterEach(() => { sandbox.restore(); - sinon.restore(); }); test('mdb.viewCollectionDocuments command should call onViewCollectionDocuments on the editor controller with the collection namespace', async () => { @@ -181,7 +182,7 @@ suite('MDBExtensionController Test Suite', function () { }); test('mdb.addConnection command should call openWebview on the webview controller', async () => { - const openWebviewStub = sinon.stub( + const openWebviewStub = sandbox.stub( mdbTestExtension.testExtensionController._webviewController, 'openWebview' ); @@ -190,8 +191,8 @@ suite('MDBExtensionController Test Suite', function () { }); test('mdb.addConnectionWithURI command should call connectWithURI on the connection controller', async () => { - const fakeConnectWithURI = sinon.fake(); - sinon.replace( + const fakeConnectWithURI = sandbox.fake(); + sandbox.replace( mdbTestExtension.testExtensionController._connectionController, 'connectWithURI', fakeConnectWithURI @@ -211,8 +212,8 @@ suite('MDBExtensionController Test Suite', function () { ); testTreeItem.cacheIsUpToDate = true; - const fakeRefresh = sinon.fake(); - sinon.replace( + const fakeRefresh = sandbox.fake(); + sandbox.replace( mdbTestExtension.testExtensionController._explorerController, 'refresh', fakeRefresh @@ -242,8 +243,8 @@ suite('MDBExtensionController Test Suite', function () { false, {} ); - const fakeRemoveMongoDBConnection = sinon.fake(); - sinon.replace( + const fakeRemoveMongoDBConnection = sandbox.fake(); + sandbox.replace( mdbTestExtension.testExtensionController._connectionController, 'removeMongoDBConnection', fakeRemoveMongoDBConnection @@ -268,14 +269,14 @@ suite('MDBExtensionController Test Suite', function () { false, {} ); - const fakeWriteText = sinon.fake(); - sinon.replaceGetter(vscode.env, 'clipboard', () => ({ + const fakeWriteText = sandbox.fake(); + sandbox.replaceGetter(vscode.env, 'clipboard', () => ({ writeText: fakeWriteText, - readText: sinon.fake(), + readText: sandbox.fake(), })); const fakeCopyConnectionStringByConnectionId = - sinon.fake.returns('weStubThisUri'); - sinon.replace( + sandbox.fake.returns('weStubThisUri'); + sandbox.replace( mdbTestExtension.testExtensionController._connectionController, 'copyConnectionStringByConnectionId', fakeCopyConnectionStringByConnectionId @@ -296,10 +297,10 @@ suite('MDBExtensionController Test Suite', function () { false, {} ); - const fakeWriteText = sinon.fake(); - sinon.replaceGetter(vscode.env, 'clipboard', () => ({ + const fakeWriteText = sandbox.fake(); + sandbox.replaceGetter(vscode.env, 'clipboard', () => ({ writeText: fakeWriteText, - readText: sinon.fake(), + readText: sandbox.fake(), })); await vscode.commands.executeCommand( 'mdb.copyDatabaseName', @@ -324,10 +325,10 @@ suite('MDBExtensionController Test Suite', function () { false, null ); - const fakeWriteText = sinon.fake(); - sinon.replaceGetter(vscode.env, 'clipboard', () => ({ + const fakeWriteText = sandbox.fake(); + sandbox.replaceGetter(vscode.env, 'clipboard', () => ({ writeText: fakeWriteText, - readText: sinon.fake(), + readText: sandbox.fake(), })); await vscode.commands.executeCommand( 'mdb.copyCollectionName', @@ -354,10 +355,10 @@ suite('MDBExtensionController Test Suite', function () { false, {} ); - const fakeWriteText = sinon.fake(); - sinon.replaceGetter(vscode.env, 'clipboard', () => ({ + const fakeWriteText = sandbox.fake(); + sandbox.replaceGetter(vscode.env, 'clipboard', () => ({ writeText: fakeWriteText, - readText: sinon.fake(), + readText: sandbox.fake(), })); const commandResult = await vscode.commands.executeCommand( 'mdb.copySchemaFieldName', @@ -384,8 +385,8 @@ suite('MDBExtensionController Test Suite', function () { ); testTreeItem.cacheIsUpToDate = true; - const fakeRefresh = sinon.fake(); - sinon.replace( + const fakeRefresh = sandbox.fake(); + sandbox.replace( mdbTestExtension.testExtensionController._explorerController, 'refresh', fakeRefresh @@ -420,8 +421,8 @@ suite('MDBExtensionController Test Suite', function () { testTreeItem.getSchemaChild().isExpanded = true; testTreeItem.getDocumentListChild().isExpanded = true; - const fakeRefresh = sinon.fake(); - sinon.replace( + const fakeRefresh = sandbox.fake(); + sandbox.replace( mdbTestExtension.testExtensionController._explorerController, 'refresh', fakeRefresh @@ -461,8 +462,8 @@ suite('MDBExtensionController Test Suite', function () { count = 10000; docListTreeItem.isExpanded = true; - const fakeRefresh = sinon.fake(); - sinon.replace( + const fakeRefresh = sandbox.fake(); + sandbox.replace( mdbTestExtension.testExtensionController._explorerController, 'refresh', fakeRefresh @@ -501,8 +502,8 @@ suite('MDBExtensionController Test Suite', function () { // Set cached. testTreeItem.cacheIsUpToDate = true; - const fakeRefresh = sinon.fake(); - sinon.replace( + const fakeRefresh = sandbox.fake(); + sandbox.replace( mdbTestExtension.testExtensionController._explorerController, 'refresh', fakeRefresh @@ -531,8 +532,8 @@ suite('MDBExtensionController Test Suite', function () { // Set cached. testTreeItem.cacheIsUpToDate = true; - const fakeRefresh = sinon.fake(); - sinon.replace( + const fakeRefresh = sandbox.fake(); + sandbox.replace( mdbTestExtension.testExtensionController._explorerController, 'refresh', fakeRefresh @@ -609,10 +610,14 @@ suite('MDBExtensionController Test Suite', function () { }); test('mdb.createPlayground should create a MongoDB playground with default template', async () => { - const fakeGetConfiguration = sinon.fake.returns({ + const fakeGetConfiguration = sandbox.fake.returns({ get: () => true, }); - sinon.replace(vscode.workspace, 'getConfiguration', fakeGetConfiguration); + sandbox.replace( + vscode.workspace, + 'getConfiguration', + fakeGetConfiguration + ); await vscode.commands.executeCommand('mdb.createPlayground'); const content = fakeCreatePlaygroundFileWithContent.firstCall.args[0]; @@ -620,10 +625,14 @@ suite('MDBExtensionController Test Suite', function () { }); test('mdb.createPlayground command should create a MongoDB playground without template', async () => { - const fakeGetConfiguration = sinon.fake.returns({ + const fakeGetConfiguration = sandbox.fake.returns({ get: () => false, }); - sinon.replace(vscode.workspace, 'getConfiguration', fakeGetConfiguration); + sandbox.replace( + vscode.workspace, + 'getConfiguration', + fakeGetConfiguration + ); await vscode.commands.executeCommand('mdb.createPlayground'); const content = fakeCreatePlaygroundFileWithContent.firstCall.args[0]; @@ -639,13 +648,13 @@ suite('MDBExtensionController Test Suite', function () { false, {} ); - const inputBoxResolvesStub = sinon.stub(); + const inputBoxResolvesStub = sandbox.stub(); inputBoxResolvesStub.onCall(0).resolves('theDbName'); inputBoxResolvesStub.onCall(1).resolves('theCollectionName'); - sinon.replace(vscode.window, 'showInputBox', inputBoxResolvesStub); + sandbox.replace(vscode.window, 'showInputBox', inputBoxResolvesStub); - const fakeIsDisconnecting = sinon.fake.returns(true); - sinon.replace( + const fakeIsDisconnecting = sandbox.fake.returns(true); + sandbox.replace( mdbTestExtension.testExtensionController._connectionController, 'isDisconnecting', fakeIsDisconnecting @@ -677,13 +686,13 @@ suite('MDBExtensionController Test Suite', function () { false, {} ); - const inputBoxResolvesStub = sinon.stub(); + const inputBoxResolvesStub = sandbox.stub(); inputBoxResolvesStub.onCall(0).resolves('theDbName'); inputBoxResolvesStub.onCall(1).resolves('theCollectionName'); - sinon.replace(vscode.window, 'showInputBox', inputBoxResolvesStub); + sandbox.replace(vscode.window, 'showInputBox', inputBoxResolvesStub); - const fakeIsConnecting = sinon.fake.returns(true); - sinon.replace( + const fakeIsConnecting = sandbox.fake.returns(true); + sandbox.replace( mdbTestExtension.testExtensionController._connectionController, 'isConnecting', fakeIsConnecting @@ -713,12 +722,12 @@ suite('MDBExtensionController Test Suite', function () { false, {} ); - const inputBoxResolvesStub = sinon.stub(); + const inputBoxResolvesStub = sandbox.stub(); inputBoxResolvesStub.onCall(0).resolves('mintChocolateChips'); - sinon.replace(vscode.window, 'showInputBox', inputBoxResolvesStub); + sandbox.replace(vscode.window, 'showInputBox', inputBoxResolvesStub); - const fakeIsDisconnecting = sinon.fake.returns(true); - sinon.replace( + const fakeIsDisconnecting = sandbox.fake.returns(true); + sandbox.replace( mdbTestExtension.testExtensionController._connectionController, 'isDisconnecting', fakeIsDisconnecting @@ -757,9 +766,9 @@ suite('MDBExtensionController Test Suite', function () { null ); - const inputBoxResolvesStub = sinon.stub(); + const inputBoxResolvesStub = sandbox.stub(); inputBoxResolvesStub.onCall(0).resolves('testColName'); - sinon.replace(vscode.window, 'showInputBox', inputBoxResolvesStub); + sandbox.replace(vscode.window, 'showInputBox', inputBoxResolvesStub); const successfullyDropped = await vscode.commands.executeCommand( 'mdb.dropCollection', @@ -784,9 +793,9 @@ suite('MDBExtensionController Test Suite', function () { false, null ); - const inputBoxResolvesStub = sinon.stub(); + const inputBoxResolvesStub = sandbox.stub(); inputBoxResolvesStub.onCall(0).resolves('doesntExistColName'); - sinon.replace(vscode.window, 'showInputBox', inputBoxResolvesStub); + sandbox.replace(vscode.window, 'showInputBox', inputBoxResolvesStub); const successfullyDropped = await vscode.commands.executeCommand( 'mdb.dropCollection', @@ -815,9 +824,9 @@ suite('MDBExtensionController Test Suite', function () { false, null ); - const inputBoxResolvesStub = sinon.stub(); + const inputBoxResolvesStub = sandbox.stub(); inputBoxResolvesStub.onCall(0).resolves('apple'); - sinon.replace(vscode.window, 'showInputBox', inputBoxResolvesStub); + sandbox.replace(vscode.window, 'showInputBox', inputBoxResolvesStub); const successfullyDropped = await vscode.commands.executeCommand( 'mdb.dropCollection', @@ -838,9 +847,9 @@ suite('MDBExtensionController Test Suite', function () { false, null ); - const inputBoxResolvesStub = sinon.stub(); + const inputBoxResolvesStub = sandbox.stub(); inputBoxResolvesStub.onCall(0).resolves(/* Return undefined. */); - sinon.replace(vscode.window, 'showInputBox', inputBoxResolvesStub); + sandbox.replace(vscode.window, 'showInputBox', inputBoxResolvesStub); const successfullyDropped = await vscode.commands.executeCommand( 'mdb.dropCollection', @@ -867,9 +876,9 @@ suite('MDBExtensionController Test Suite', function () { {} ); - const inputBoxResolvesStub = sinon.stub(); + const inputBoxResolvesStub = sandbox.stub(); inputBoxResolvesStub.onCall(0).resolves('iMissTangerineAltoids'); - sinon.replace(vscode.window, 'showInputBox', inputBoxResolvesStub); + sandbox.replace(vscode.window, 'showInputBox', inputBoxResolvesStub); const successfullyDropped = await vscode.commands.executeCommand( 'mdb.dropDatabase', @@ -893,9 +902,9 @@ suite('MDBExtensionController Test Suite', function () { false, {} ); - const inputBoxResolvesStub = sinon.stub(); + const inputBoxResolvesStub = sandbox.stub(); inputBoxResolvesStub.onCall(0).resolves('narnia____a'); - sinon.replace(vscode.window, 'showInputBox', inputBoxResolvesStub); + sandbox.replace(vscode.window, 'showInputBox', inputBoxResolvesStub); const successfullyDropped = await vscode.commands.executeCommand( 'mdb.dropDatabase', @@ -919,9 +928,9 @@ suite('MDBExtensionController Test Suite', function () { false, {} ); - const inputBoxResolvesStub = sinon.stub(); + const inputBoxResolvesStub = sandbox.stub(); inputBoxResolvesStub.onCall(0).resolves('apple'); - sinon.replace(vscode.window, 'showInputBox', inputBoxResolvesStub); + sandbox.replace(vscode.window, 'showInputBox', inputBoxResolvesStub); const successfullyDropped = await vscode.commands.executeCommand( 'mdb.dropDatabase', @@ -941,9 +950,9 @@ suite('MDBExtensionController Test Suite', function () { false, {} ); - const inputBoxResolvesStub = sinon.stub(); + const inputBoxResolvesStub = sandbox.stub(); inputBoxResolvesStub.onCall(0).resolves(/* Return undefined. */); - sinon.replace(vscode.window, 'showInputBox', inputBoxResolvesStub); + sandbox.replace(vscode.window, 'showInputBox', inputBoxResolvesStub); const successfullyDropped = await vscode.commands.executeCommand( 'mdb.dropDatabase', @@ -973,9 +982,9 @@ suite('MDBExtensionController Test Suite', function () { {} ); - const inputBoxResolvesStub = sinon.stub(); + const inputBoxResolvesStub = sandbox.stub(); inputBoxResolvesStub.onCall(0).resolves(/* Return undefined. */); - sinon.replace(vscode.window, 'showInputBox', inputBoxResolvesStub); + sandbox.replace(vscode.window, 'showInputBox', inputBoxResolvesStub); const successfullyRenamed = await vscode.commands.executeCommand( 'mdb.renameConnection', @@ -1010,9 +1019,9 @@ suite('MDBExtensionController Test Suite', function () { false, {} ); - const inputBoxResolvesStub = sinon.stub(); + const inputBoxResolvesStub = sandbox.stub(); inputBoxResolvesStub.onCall(0).resolves('orange juice'); - sinon.replace(vscode.window, 'showInputBox', inputBoxResolvesStub); + sandbox.replace(vscode.window, 'showInputBox', inputBoxResolvesStub); const successfullyRenamed = await vscode.commands.executeCommand( 'mdb.renameConnection', @@ -1035,8 +1044,8 @@ suite('MDBExtensionController Test Suite', function () { $time: '12345', }, }; - const fakeGet = sinon.fake.returns('pancakes'); - sinon.replace( + const fakeGet = sandbox.fake.returns('pancakes'); + sandbox.replace( mdbTestExtension.testExtensionController._editorsController ._documentIdStore, 'get', @@ -1061,7 +1070,7 @@ suite('MDBExtensionController Test Suite', function () { () => activeTextEditor ); - const fakeGetActiveDataService = sinon.fake.returns({ + const fakeGetActiveDataService = sandbox.fake.returns({ find: () => { return Promise.resolve([mockDocument]); }, @@ -1077,7 +1086,7 @@ suite('MDBExtensionController Test Suite', function () { return callback(null, mockDocument); }, }); - sinon.replace( + sandbox.replace( mdbTestExtension.testExtensionController._connectionController, 'getActiveDataService', fakeGetActiveDataService @@ -1141,8 +1150,8 @@ suite('MDBExtensionController Test Suite', function () { {} as DataService, () => Promise.resolve() ); - const fakeFetchDocument = sinon.fake.resolves(null); - sinon.replace( + const fakeFetchDocument = sandbox.fake.resolves(null); + sandbox.replace( mdbTestExtension.testExtensionController._editorsController ._mongoDBDocumentService, 'fetchDocument', @@ -1166,8 +1175,8 @@ suite('MDBExtensionController Test Suite', function () { namespace: 'db.coll', connectionId: null, }; - const fakeFetchDocument = sinon.fake.resolves(null); - sinon.replace( + const fakeFetchDocument = sandbox.fake.resolves(null); + sandbox.replace( mdbTestExtension.testExtensionController._editorsController ._mongoDBDocumentService, 'fetchDocument', @@ -1191,8 +1200,8 @@ suite('MDBExtensionController Test Suite', function () { $time: '12345', }, }; - const fakeGet = sinon.fake.returns('pancakes'); - sinon.replace( + const fakeGet = sandbox.fake.returns('pancakes'); + sandbox.replace( mdbTestExtension.testExtensionController._editorsController ._documentIdStore, 'get', @@ -1219,8 +1228,8 @@ suite('MDBExtensionController Test Suite', function () { } as unknown as typeof vscode.window.activeTextEditor) ); - const fakeReplaceDocument = sinon.fake.resolves(null); - sinon.replace( + const fakeReplaceDocument = sandbox.fake.resolves(null); + sandbox.replace( mdbTestExtension.testExtensionController._editorsController ._mongoDBDocumentService, 'replaceDocument', @@ -1241,8 +1250,8 @@ suite('MDBExtensionController Test Suite', function () { $time: '12345', }, }; - const fakeGet = sinon.fake.returns('pancakes'); - sinon.replace( + const fakeGet = sandbox.fake.returns('pancakes'); + sandbox.replace( mdbTestExtension.testExtensionController._editorsController ._documentIdStore, 'get', @@ -1269,8 +1278,8 @@ suite('MDBExtensionController Test Suite', function () { } as unknown as typeof vscode.window.activeTextEditor) ); - const fakeReplaceDocument = sinon.fake.resolves(null); - sinon.replace( + const fakeReplaceDocument = sandbox.fake.resolves(null); + sandbox.replace( mdbTestExtension.testExtensionController._editorsController ._mongoDBDocumentService, 'replaceDocument', @@ -1284,8 +1293,8 @@ suite('MDBExtensionController Test Suite', function () { }); test('mdb.runSelectedPlaygroundBlocks runs selected playgroundB blocks once', async () => { - const fakeRunSelectedPlaygroundBlocks = sinon.fake(); - sinon.replace( + const fakeRunSelectedPlaygroundBlocks = sandbox.fake(); + sandbox.replace( mdbTestExtension.testExtensionController._playgroundController, 'runSelectedPlaygroundBlocks', fakeRunSelectedPlaygroundBlocks @@ -1298,8 +1307,8 @@ suite('MDBExtensionController Test Suite', function () { }); test('mdb.runAllPlaygroundBlocks runs all playgroundB blocks once', async () => { - const fakeRunAllPlaygroundBlocks = sinon.fake(); - sinon.replace( + const fakeRunAllPlaygroundBlocks = sandbox.fake(); + sandbox.replace( mdbTestExtension.testExtensionController._playgroundController, 'runAllPlaygroundBlocks', fakeRunAllPlaygroundBlocks @@ -1312,8 +1321,8 @@ suite('MDBExtensionController Test Suite', function () { }); test('mdb.changeActiveConnection changes the active connection once', async () => { - const fakeChangeActiveConnection = sinon.fake(); - sinon.replace( + const fakeChangeActiveConnection = sandbox.fake(); + sandbox.replace( mdbTestExtension.testExtensionController._connectionController, 'changeActiveConnection', fakeChangeActiveConnection @@ -1326,8 +1335,8 @@ suite('MDBExtensionController Test Suite', function () { }); test('mdb.refreshPlaygroundsFromTreeView refreshes the playgrounds explorer once', async () => { - const fakeRefresh = sinon.fake(); - sinon.replace( + const fakeRefresh = sandbox.fake(); + sandbox.replace( mdbTestExtension.testExtensionController._playgroundsExplorer, 'refresh', fakeRefresh @@ -1350,7 +1359,7 @@ suite('MDBExtensionController Test Suite', function () { }; let namespaceUsed = ''; - const findStub = sinon.stub(); + const findStub = sandbox.stub(); findStub.resolves([mockDocument]); const dataServiceStub = { @@ -1366,10 +1375,10 @@ suite('MDBExtensionController Test Suite', function () { dataServiceStub, () => Promise.resolve() ); - const fakeWriteText = sinon.fake(); - sinon.replaceGetter(vscode.env, 'clipboard', () => ({ + const fakeWriteText = sandbox.fake(); + sandbox.replaceGetter(vscode.env, 'clipboard', () => ({ writeText: fakeWriteText, - readText: sinon.fake(), + readText: sandbox.fake(), })); await vscode.commands.executeCommand( 'mdb.copyDocumentContentsFromTreeView', @@ -1408,8 +1417,8 @@ suite('MDBExtensionController Test Suite', function () { dataServiceStub, () => Promise.resolve() ); - const fakeCreatePlaygroundForCloneDocument = sinon.fake(); - sinon.replace( + const fakeCreatePlaygroundForCloneDocument = sandbox.fake(); + sandbox.replace( mdbTestExtension.testExtensionController._playgroundController, 'createPlaygroundForCloneDocument', fakeCreatePlaygroundForCloneDocument @@ -1450,8 +1459,8 @@ suite('MDBExtensionController Test Suite', function () { false, null ); - const fakeCreatePlaygroundForInsertDocument = sinon.fake(); - sinon.replace( + const fakeCreatePlaygroundForInsertDocument = sandbox.fake(); + sandbox.replace( mdbTestExtension.testExtensionController._playgroundController, 'createPlaygroundForInsertDocument', fakeCreatePlaygroundForInsertDocument @@ -1563,11 +1572,7 @@ suite('MDBExtensionController Test Suite', function () { let executeCommandStub: SinonStub; beforeEach(() => { - executeCommandStub = sinon.stub(vscode.commands, 'executeCommand'); - }); - - afterEach(() => { - sinon.restore(); + executeCommandStub = sandbox.stub(vscode.commands, 'executeCommand'); }); suite( @@ -1576,19 +1581,19 @@ suite('MDBExtensionController Test Suite', function () { let fakeUpdate: SinonSpy; beforeEach(() => { - sinon.replace( + sandbox.replace( mdbTestExtension.testExtensionController._storageController, 'get', - sinon.fake.returns(false) + sandbox.fake.returns(false) ); - sinon.replace( + sandbox.replace( mdbTestExtension.testExtensionController._storageController, 'hasSavedConnections', - sinon.fake.returns(false) + sandbox.fake.returns(false) ); - fakeUpdate = sinon.fake.resolves(undefined); - sinon.replace( + fakeUpdate = sandbox.fake.resolves(undefined); + sandbox.replace( mdbTestExtension.testExtensionController._storageController, 'update', fakeUpdate @@ -1597,10 +1602,6 @@ suite('MDBExtensionController Test Suite', function () { void mdbTestExtension.testExtensionController.showOverviewPageIfRecentlyInstalled(); }); - afterEach(() => { - sinon.restore(); - }); - test('they are shown the overview page', () => { assert(executeCommandStub.called); assert.strictEqual( @@ -1634,18 +1635,18 @@ suite('MDBExtensionController Test Suite', function () { let fakeUpdate: SinonSpy; beforeEach(() => { - sinon.replace( + sandbox.replace( mdbTestExtension.testExtensionController._storageController, 'get', - sinon.fake.returns(undefined) + sandbox.fake.returns(undefined) ); - sinon.replace( + sandbox.replace( mdbTestExtension.testExtensionController._storageController, 'hasSavedConnections', - sinon.fake.returns(true) + sandbox.fake.returns(true) ); - fakeUpdate = sinon.fake.resolves(undefined); - sinon.replace( + fakeUpdate = sandbox.fake.resolves(undefined); + sandbox.replace( mdbTestExtension.testExtensionController._storageController, 'update', fakeUpdate @@ -1675,10 +1676,10 @@ suite('MDBExtensionController Test Suite', function () { suite('when a user has been shown the initial overview page', () => { beforeEach(() => { - sinon.replace( + sandbox.replace( mdbTestExtension.testExtensionController._storageController, 'get', - sinon.fake.returns(true) + sandbox.fake.returns(true) ); void mdbTestExtension.testExtensionController.showOverviewPageIfRecentlyInstalled(); diff --git a/src/test/suite/telemetry/connectionTelemetry.test.ts b/src/test/suite/telemetry/connectionTelemetry.test.ts index 0b5323fe5..3d01c7a1b 100644 --- a/src/test/suite/telemetry/connectionTelemetry.test.ts +++ b/src/test/suite/telemetry/connectionTelemetry.test.ts @@ -15,16 +15,17 @@ suite('ConnectionTelemetry Controller Test Suite', function () { suite('with mock data service', function () { this.timeout(8000); let dataServiceStub: DataService; + const sandbox = sinon.createSandbox(); before(() => { - const getConnectionStringStub = sinon.stub(); + const getConnectionStringStub = sandbox.stub(); getConnectionStringStub.returns({ hosts: ['localhost:27018'], searchParams: { get: () => null }, username: 'authMechanism', } as unknown as ReturnType); - const instanceStub = sinon.stub(); + const instanceStub = sandbox.stub(); instanceStub.resolves({ dataLake: {}, build: {}, @@ -40,11 +41,11 @@ suite('ConnectionTelemetry Controller Test Suite', function () { 'getConnectionString' | 'instance' > as unknown as DataService; - sinon.stub(getCloudInfoModule, 'getCloudInfo').resolves({}); + sandbox.stub(getCloudInfoModule, 'getCloudInfo').resolves({}); }); after(() => { - sinon.restore(); + sandbox.restore(); }); test('it returns is_used_connect_screen true when the connection type is form', async () => { @@ -117,14 +118,15 @@ suite('ConnectionTelemetry Controller Test Suite', function () { suite('with live connection', function () { this.timeout(20000); let dataServ; + const sandbox = sinon.createSandbox(); beforeEach(async () => { dataServ = await connect({ connectionString: TEST_DATABASE_URI }); }); afterEach(async () => { - sinon.restore(); await dataServ.disconnect(); + sandbox.restore(); }); test('track new connection event fetches the connection instance information', async () => { diff --git a/src/test/suite/utils/linkHelper.test.ts b/src/test/suite/utils/linkHelper.test.ts index cc7d2e601..0de609adc 100644 --- a/src/test/suite/utils/linkHelper.test.ts +++ b/src/test/suite/utils/linkHelper.test.ts @@ -1,4 +1,5 @@ import { EventEmitter } from 'events'; +import { afterEach } from 'mocha'; import { expect } from 'chai'; import http from 'http'; import sinon from 'sinon'; @@ -7,8 +8,14 @@ import vscode from 'vscode'; import { openLink } from '../../../utils/linkHelper'; suite('Open Link Test Suite', () => { + const sandbox = sinon.createSandbox(); + + afterEach(() => { + sandbox.restore(); + }); + test('the helper server is instantiated correctly', () => { - const stubServer: any = { on: sinon.spy(), listen: sinon.spy() }; + const stubServer: any = { on: sandbox.spy(), listen: sandbox.spy() }; const stubCreateServer: any = sinon .stub(http, 'createServer') .returns(stubServer); @@ -20,10 +27,10 @@ suite('Open Link Test Suite', () => { test('the browser opens correctly for mongodb.com', () => { const stubServer: any = { - on: sinon.stub(), - listen: sinon.stub().callsArg(1), + on: sandbox.stub(), + listen: sandbox.stub().callsArg(1), }; - const stubCreateStubInstance: any = sinon.createStubInstance( + const stubCreateStubInstance: any = sandbox.createStubInstance( http.Server, stubServer ); @@ -44,10 +51,10 @@ suite('Open Link Test Suite', () => { test('the browser opens correctly for a subdomain of mongodb.com', () => { const stubServer: any = { - on: sinon.stub(), - listen: sinon.stub().callsArg(1), + on: sandbox.stub(), + listen: sandbox.stub().callsArg(1), }; - const stubCreateStubInstance: any = sinon.createStubInstance( + const stubCreateStubInstance: any = sandbox.createStubInstance( http.Server, stubServer ); From ab1600ce567497ca383082136ccfb9be4bf8da25 Mon Sep 17 00:00:00 2001 From: Alena Khineika Date: Wed, 1 Mar 2023 19:36:20 +0100 Subject: [PATCH 36/36] fix: add mdb prefix --- package.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index cd32d89a8..0af9b6db0 100644 --- a/package.json +++ b/package.json @@ -636,23 +636,23 @@ }, { "command": "mdb.exportToRuby", - "when": "mdb.isPlayground == true && connectedToMongoDB == true" + "when": "mdb.isPlayground == true && mdb.connectedToMongoDB == true" }, { "command": "mdb.exportToPython", - "when": "mdb.isPlayground == true && connectedToMongoDB == true" + "when": "mdb.isPlayground == true && mdb.connectedToMongoDB == true" }, { "command": "mdb.exportToJava", - "when": "mdb.isPlayground == true && connectedToMongoDB == true" + "when": "mdb.isPlayground == true && mdb.connectedToMongoDB == true" }, { "command": "mdb.exportToCsharp", - "when": "mdb.isPlayground == true && connectedToMongoDB == true" + "when": "mdb.isPlayground == true && mdb.connectedToMongoDB == true" }, { "command": "mdb.exportToNode", - "when": "mdb.isPlayground == true && connectedToMongoDB == true" + "when": "mdb.isPlayground == true && mdb.connectedToMongoDB == true" }, { "command": "mdb.refreshPlaygroundsFromTreeView",