From 78a8ff3bb35ac3bcf3ab55e7e4886f17ecabeb23 Mon Sep 17 00:00:00 2001 From: Colen Garoutte-Carson <49173979+Colengms@users.noreply.github.com> Date: Thu, 24 Aug 2023 18:29:52 -0700 Subject: [PATCH 01/15] Disable AutoPCH early on platforms that don't support it (#11362) --- Extension/src/LanguageServer/client.ts | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/Extension/src/LanguageServer/client.ts b/Extension/src/LanguageServer/client.ts index d0caa9d1b9..ccf32694ad 100644 --- a/Extension/src/LanguageServer/client.ts +++ b/Extension/src/LanguageServer/client.ts @@ -1597,13 +1597,27 @@ export class DefaultClient implements Client { debug: { command: serverModule, args: [serverName], options: { detached: true } } }; + // The IntelliSense process should automatically detect when AutoPCH is + // not supportable (on platforms that don't support disabling ASLR/PIE). + // We've had reports of issues on arm64 macOS that are addressed by + // disabling the IntelliSense cache, suggesting fallback does not + // always work as expected. It's actually more efficient to disable + // the cache on platforms we know do not support it. We do that here. let intelliSenseCacheDisabled: boolean = false; if (os.platform() === "darwin") { - const releaseParts: string[] = os.release().split("."); - if (releaseParts.length >= 1) { - // AutoPCH doesn't work for older Mac OS's. - intelliSenseCacheDisabled = parseInt(releaseParts[0]) < 17; + // AutoPCH doesn't work for arm64 macOS. + if (os.arch() === "arm64") { + intelliSenseCacheDisabled = true; + } else { + // AutoPCH doesn't work for older x64 macOS's. + const releaseParts: string[] = os.release().split("."); + if (releaseParts.length >= 1) { + intelliSenseCacheDisabled = parseInt(releaseParts[0]) < 17; + } } + } else { + // AutoPCH doesn't work for arm64 Windows. + intelliSenseCacheDisabled = os.platform() === "win32" && os.arch() === "arm64"; } const localizedStrings: string[] = []; From c873aa18bda56f7ddcf762e0b1661c63ae94f5af Mon Sep 17 00:00:00 2001 From: Michelle Matias <38734287+michelleangela@users.noreply.github.com> Date: Fri, 25 Aug 2023 13:50:14 -0700 Subject: [PATCH 02/15] 1.17.5 changelog (#11363) --- Extension/CHANGELOG.md | 7 +++++++ Extension/package.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Extension/CHANGELOG.md b/Extension/CHANGELOG.md index bb778a2c0f..caa50bc568 100644 --- a/Extension/CHANGELOG.md +++ b/Extension/CHANGELOG.md @@ -1,5 +1,12 @@ # C/C++ for Visual Studio Code Changelog +## Version 1.17.5: August 28, 2023 +### Bug Fixes +* Fix a language server crash for platforms that don't support the IntelliSense cache (AutoPCH). [#10789](https://github.com/microsoft/vscode-cpptools/issues/10789) +* Fix markdown in comments when inline/block code is used. [#11322](https://github.com/microsoft/vscode-cpptools/issues/11322) +* Fix Find All References and Call Hierarchy for C files when the cursor is at the end of a symbol. [#11338](https://github.com/microsoft/vscode-cpptools/issues/11338) +* Fix usage of the `/Zc:alignedNew-` MSVC compiler option. [#11350](https://github.com/microsoft/vscode-cpptools/issues/11350) + ## Version 1.17.4: August 21, 2023 ### Bug Fixes * Fix crash recovery for the main extension process. [#11335](https://github.com/microsoft/vscode-cpptools/issues/11335) diff --git a/Extension/package.json b/Extension/package.json index ef1be3bafe..1e79389f39 100644 --- a/Extension/package.json +++ b/Extension/package.json @@ -2,7 +2,7 @@ "name": "cpptools", "displayName": "C/C++", "description": "C/C++ IntelliSense, debugging, and code browsing.", - "version": "1.17.4-main", + "version": "1.17.5-main", "publisher": "ms-vscode", "icon": "LanguageCCPP_color_128x.png", "readme": "README.md", From f387815749a3f600daec087b1a427486a4d00cc4 Mon Sep 17 00:00:00 2001 From: Michelle Matias <38734287+michelleangela@users.noreply.github.com> Date: Fri, 25 Aug 2023 15:50:03 -0700 Subject: [PATCH 03/15] Fix tag parse language status item UI (#11354) --- Extension/src/LanguageServer/client.ts | 23 - Extension/src/LanguageServer/extension.ts | 5 - Extension/src/LanguageServer/ui.ts | 599 +++++++++++----------- 3 files changed, 305 insertions(+), 322 deletions(-) diff --git a/Extension/src/LanguageServer/client.ts b/Extension/src/LanguageServer/client.ts index ccf32694ad..5e533cae67 100644 --- a/Extension/src/LanguageServer/client.ts +++ b/Extension/src/LanguageServer/client.ts @@ -552,7 +552,6 @@ interface InitializationOptions { interface TagParseStatus { localizeStringParams: LocalizeStringParams; - isPausable: boolean; isPaused: boolean; } @@ -636,7 +635,6 @@ class ClientModel { public isInitializingWorkspace: DataBinding; public isIndexingWorkspace: DataBinding; public isParsingWorkspace: DataBinding; - public isParsingWorkspacePausable: DataBinding; public isParsingWorkspacePaused: DataBinding; public isParsingFiles: DataBinding; public isUpdatingIntelliSense: DataBinding; @@ -652,7 +650,6 @@ class ClientModel { this.isInitializingWorkspace = new DataBinding(false); this.isIndexingWorkspace = new DataBinding(false); this.isParsingWorkspace = new DataBinding(false); - this.isParsingWorkspacePausable = new DataBinding(false); this.isParsingWorkspacePaused = new DataBinding(false); this.isParsingFiles = new DataBinding(false); this.isUpdatingIntelliSense = new DataBinding(false); @@ -669,7 +666,6 @@ class ClientModel { this.isInitializingWorkspace.activate(); this.isIndexingWorkspace.activate(); this.isParsingWorkspace.activate(); - this.isParsingWorkspacePausable.activate(); this.isParsingWorkspacePaused.activate(); this.isParsingFiles.activate(); this.isUpdatingIntelliSense.activate(); @@ -686,7 +682,6 @@ class ClientModel { this.isInitializingWorkspace.deactivate(); this.isIndexingWorkspace.deactivate(); this.isParsingWorkspace.deactivate(); - this.isParsingWorkspacePausable.deactivate(); this.isParsingWorkspacePaused.deactivate(); this.isParsingFiles.deactivate(); this.isUpdatingIntelliSense.deactivate(); @@ -703,7 +698,6 @@ class ClientModel { this.isInitializingWorkspace.dispose(); this.isIndexingWorkspace.dispose(); this.isParsingWorkspace.dispose(); - this.isParsingWorkspacePausable.dispose(); this.isParsingWorkspacePaused.dispose(); this.isParsingFiles.dispose(); this.isUpdatingIntelliSense.dispose(); @@ -723,7 +717,6 @@ export interface Client { InitializingWorkspaceChanged: vscode.Event; IndexingWorkspaceChanged: vscode.Event; ParsingWorkspaceChanged: vscode.Event; - ParsingWorkspacePausableChanged: vscode.Event; ParsingWorkspacePausedChanged: vscode.Event; ParsingFilesChanged: vscode.Event; IntelliSenseParsingChanged: vscode.Event; @@ -778,7 +771,6 @@ export interface Client { CancelCodeAnalysis(): void; handleConfigurationSelectCommand(): Promise; handleConfigurationProviderSelectCommand(): Promise; - handleShowParsingCommands(): Promise; handleShowActiveCodeAnalysisCommands(): Promise; handleShowIdleCodeAnalysisCommands(): Promise; handleReferencesIcon(): void; @@ -865,7 +857,6 @@ export class DefaultClient implements Client { public get InitializingWorkspaceChanged(): vscode.Event { return this.model.isInitializingWorkspace.ValueChanged; } public get IndexingWorkspaceChanged(): vscode.Event { return this.model.isIndexingWorkspace.ValueChanged; } public get ParsingWorkspaceChanged(): vscode.Event { return this.model.isParsingWorkspace.ValueChanged; } - public get ParsingWorkspacePausableChanged(): vscode.Event { return this.model.isParsingWorkspacePausable.ValueChanged; } public get ParsingWorkspacePausedChanged(): vscode.Event { return this.model.isParsingWorkspacePaused.ValueChanged; } public get ParsingFilesChanged(): vscode.Event { return this.model.isParsingFiles.ValueChanged; } public get IntelliSenseParsingChanged(): vscode.Event { return this.model.isUpdatingIntelliSense.ValueChanged; } @@ -2536,7 +2527,6 @@ export class DefaultClient implements Client { this.model.isParsingWorkspace.Value = true; this.model.isInitializingWorkspace.Value = false; this.model.isIndexingWorkspace.Value = false; - this.model.isParsingWorkspacePausable.Value = false; const status: IntelliSenseStatus = { status: Status.TagParsingBegun }; testHook.updateStatus(status); } else if (message.endsWith("Initializing")) { @@ -2632,7 +2622,6 @@ export class DefaultClient implements Client { private updateTagParseStatus(tagParseStatus: TagParseStatus): void { this.model.parsingWorkspaceStatus.Value = getLocalizedString(tagParseStatus.localizeStringParams); - this.model.isParsingWorkspacePausable.Value = tagParseStatus.isPausable; this.model.isParsingWorkspacePaused.Value = tagParseStatus.isPaused; } @@ -3313,16 +3302,6 @@ export class DefaultClient implements Client { } } - public async handleShowParsingCommands(): Promise { - await this.ready; - const index: number = await ui.showParsingCommands(); - if (index === 0) { - return this.pauseParsing(); - } else if (index === 1) { - return this.resumeParsing(); - } - } - public async handleShowActiveCodeAnalysisCommands(): Promise { await this.ready; const index: number = await ui.showActiveCodeAnalysisCommands(); @@ -3781,7 +3760,6 @@ class NullClient implements Client { public get InitializingWorkspaceChanged(): vscode.Event { return this.booleanEvent.event; } public get IndexingWorkspaceChanged(): vscode.Event { return this.booleanEvent.event; } public get ParsingWorkspaceChanged(): vscode.Event { return this.booleanEvent.event; } - public get ParsingWorkspacePausableChanged(): vscode.Event { return this.booleanEvent.event; } public get ParsingWorkspacePausedChanged(): vscode.Event { return this.booleanEvent.event; } public get ParsingFilesChanged(): vscode.Event { return this.booleanEvent.event; } public get IntelliSenseParsingChanged(): vscode.Event { return this.booleanEvent.event; } @@ -3835,7 +3813,6 @@ class NullClient implements Client { CancelCodeAnalysis(): void { } handleConfigurationSelectCommand(): Promise { return Promise.resolve(); } handleConfigurationProviderSelectCommand(): Promise { return Promise.resolve(); } - handleShowParsingCommands(): Promise { return Promise.resolve(); } handleShowActiveCodeAnalysisCommands(): Promise { return Promise.resolve(); } handleShowIdleCodeAnalysisCommands(): Promise { return Promise.resolve(); } handleReferencesIcon(): void { } diff --git a/Extension/src/LanguageServer/extension.ts b/Extension/src/LanguageServer/extension.ts index 4c9b67c3a3..c53014057f 100644 --- a/Extension/src/LanguageServer/extension.ts +++ b/Extension/src/LanguageServer/extension.ts @@ -403,7 +403,6 @@ export function registerCommands(enabled: boolean): void { commandDisposables.push(vscode.commands.registerCommand('C_Cpp.PauseCodeAnalysis', enabled ? onPauseCodeAnalysis : onDisabledCommand)); commandDisposables.push(vscode.commands.registerCommand('C_Cpp.ResumeCodeAnalysis', enabled ? onResumeCodeAnalysis : onDisabledCommand)); commandDisposables.push(vscode.commands.registerCommand('C_Cpp.CancelCodeAnalysis', enabled ? onCancelCodeAnalysis : onDisabledCommand)); - commandDisposables.push(vscode.commands.registerCommand('C_Cpp.ShowParsingCommands', enabled ? onShowParsingCommands : onDisabledCommand)); commandDisposables.push(vscode.commands.registerCommand('C_Cpp.ShowActiveCodeAnalysisCommands', enabled ? onShowActiveCodeAnalysisCommands : onDisabledCommand)); commandDisposables.push(vscode.commands.registerCommand('C_Cpp.ShowIdleCodeAnalysisCommands', enabled ? onShowIdleCodeAnalysisCommands : onDisabledCommand)); commandDisposables.push(vscode.commands.registerCommand('C_Cpp.ShowReferencesProgress', enabled ? onShowReferencesProgress : onDisabledCommand)); @@ -743,10 +742,6 @@ function onCancelCodeAnalysis(): void { clients.ActiveClient.CancelCodeAnalysis(); } -function onShowParsingCommands(): Promise { - return clients.ActiveClient.handleShowParsingCommands(); -} - function onShowActiveCodeAnalysisCommands(): Promise { return clients.ActiveClient.handleShowActiveCodeAnalysisCommands(); } diff --git a/Extension/src/LanguageServer/ui.ts b/Extension/src/LanguageServer/ui.ts index 3b32bf357c..76585a96b7 100644 --- a/Extension/src/LanguageServer/ui.ts +++ b/Extension/src/LanguageServer/ui.ts @@ -58,154 +58,231 @@ const commandArguments: string[] = []; // We report the sender of the command export class LanguageStatusUI { private currentClient: Client | undefined; - private configStatusBarItem: vscode.StatusBarItem; - private browseEngineStatusItem: vscode.LanguageStatusItem; - private intelliSenseStatusItem: vscode.LanguageStatusItem; - private configureIntelliSenseStatusItem: vscode.StatusBarItem; - private referencesStatusBarItem: vscode.StatusBarItem; - private codeAnalysisStatusItem: vscode.LanguageStatusItem; - /** **************************************************** */ private curConfigurationStatus?: Promise; + + // Timer for icons from appearing too often and for too short of a time. + private readonly iconDelayTime: number = 1000; + + // IntelliSense language status + private intelliSenseStatusItem: vscode.LanguageStatusItem; + private readonly updatingIntelliSenseText: string = localize("updating.intellisense.text", "IntelliSense: Updating"); + private readonly idleIntelliSenseText: string = localize("idle.intellisense.text", "IntelliSense: Ready"); + private readonly missingIntelliSenseText: string = localize("absent.intellisense.text", "IntelliSense: Not configured"); + + // Tag parse language status + private tagParseStatusItem: vscode.LanguageStatusItem; private isParsingWorkspace: boolean = false; private isParsingWorkspacePaused: boolean = false; private isParsingFiles: boolean = false; - private isRunningCodeAnalysis: boolean = false; - private isCodeAnalysisPaused: boolean = false; - private codeAnalysisProcessed: number = 0; - private codeAnalysisTotal: number = 0; + private tagParseTimeout?: NodeJS.Timeout; + private readonly dataBaseIcon: string = "$(database)"; + private readonly workspaceParsingInitializing: string = localize("initializing.tagparser.text", "Initializing Workspace"); + private readonly workspaceParsingIndexing: string = localize("indexing.tagparser.text", "Indexing Workspace"); private readonly workspaceParsingRunningText: string = localize("running.tagparser.text", "Parsing Workspace"); private readonly workspaceParsingPausedText: string = localize("paused.tagparser.text", "Parsing Workspace: Paused"); private readonly workspaceParsingDoneText: string = localize("complete.tagparser.text", "Parsing Complete"); - private readonly workspaceParsingInitializing: string = localize("initializing.tagparser.text", "Initializing Workspace"); - private readonly workspaceParsingIndexing: string = localize("indexing.tagparser.text", "Indexing Workspace"); - private workspaceParsingStatus: string = ""; - private workspaceParsingProgress: string = ""; - private readonly workspaceRescanText = localize("rescan.tagparse.text", "Rescan Workspace"); + private readonly workspaceRescanText: string = localize("rescan.tagparse.text", "Rescan Workspace"); private readonly parsingFilesTooltip: string = localize("c.cpp.parsing.open.files.tooltip", "Parsing Open Files"); - private readonly referencesPreviewTooltip: string = ` (${localize("click.to.preview", "click to preview results")})`; - private readonly updatingIntelliSenseText: string = localize("updating.intellisense.text", "IntelliSense: Updating"); - private readonly idleIntelliSenseText: string = localize("idle.intellisense.text", "IntelliSense: Ready"); - private readonly missingIntelliSenseText: string = localize("absent.intellisense.text", "IntelliSense: Not configured"); + + // Code analysis language status + private codeAnalysisStatusItem: vscode.LanguageStatusItem; + private isRunningCodeAnalysis: boolean = false; + private isCodeAnalysisPaused: boolean = false; + private codeAnalysisProcessed: number = 0; + private codeAnalysisTotal: number = 0; + private codeAnalysProgress: string = ""; private readonly codeAnalysisRunningText: string = localize("running.analysis.text", "Code Analysis: Running"); private readonly codeAnalysisPausedText: string = localize("paused.analysis.text", "Code Analysis: Paused"); private readonly codeAnalysisModePrefix: string = localize("mode.analysis.prefix", "Code Analysis Mode: "); - private codeAnalysProgress: string = ""; - // Prevent icons from appearing too often and for too short of a time. - private readonly iconDelayTime: number = 1000; + + // References status bar + private referencesStatusBarItem: vscode.StatusBarItem; + private readonly referencesPreviewTooltip: string = ` (${localize("click.to.preview", "click to preview results")})`; + + // Configuration status bar + private configurationStatusBarItem: vscode.StatusBarItem; + + // Configure IntelliSense status bar + private configureIntelliSenseStatusBarItem: vscode.StatusBarItem; + private showConfigureIntelliSenseButton: boolean = false; + private configureIntelliSenseTimeout?: NodeJS.Timeout; private readonly configureIntelliSenseText: string = localize("c.cpp.configureIntelliSenseStatus.text", "Configure IntelliSense"); - private readonly cppConfigureIntelliSenseText: string = localize("c.cpp.configureIntelliSenseStatus.cppText", "C/C++ Configure IntelliSense"); constructor() { - const configTooltip: string = localize("c.cpp.configuration.tooltip", "C/C++ Configuration"); - this.configStatusBarItem = vscode.window.createStatusBarItem("c.cpp.configuration.tooltip", vscode.StatusBarAlignment.Right, 0); - this.configStatusBarItem.name = configTooltip; - this.configStatusBarItem.command = { - command: "C_Cpp.ConfigurationSelect", - title: configTooltip, - arguments: commandArguments - }; - this.configStatusBarItem.tooltip = configTooltip; - this.ShowConfiguration = true; + this.intelliSenseStatusItem = this.createIntelliSenseStatusItem(); + this.tagParseStatusItem = this.createTagParseStatusItem(); + this.codeAnalysisStatusItem = this.createCodeAnalysisStatusItem(); - this.referencesStatusBarItem = vscode.window.createStatusBarItem(`c.cpp.references.statusbar`, vscode.StatusBarAlignment.Right, 901); - this.referencesStatusBarItem.name = localize("c.cpp.references.statusbar", "C/C++ References Status"); - this.referencesStatusBarItem.tooltip = ""; - this.referencesStatusBarItem.command = { - command: "C_Cpp.ShowReferencesProgress", - title: this.referencesStatusBarItem.name, - arguments: commandArguments - }; + this.referencesStatusBarItem = this.createReferencesStatusBarItem(); this.ShowReferencesIcon = false; - this.configureIntelliSenseStatusItem = vscode.window.createStatusBarItem(`c.cpp.configureIntelliSenseStatus.statusbar`, vscode.StatusBarAlignment.Right, 0); - this.configureIntelliSenseStatusItem.name = this.cppConfigureIntelliSenseText; - this.configureIntelliSenseStatusItem.tooltip = this.cppConfigureIntelliSenseText; - this.configureIntelliSenseStatusItem.text = `$(warning) ${this.configureIntelliSenseText}`; - this.configureIntelliSenseStatusItem.backgroundColor = new vscode.ThemeColor('statusBarItem.warningBackground'); - this.configureIntelliSenseStatusItem.command = { - command: "C_Cpp.SelectIntelliSenseConfiguration", - title: this.configureIntelliSenseStatusItem.name, - arguments: ['statusBar'] - }; + this.configurationStatusBarItem = this.createConfigurationStatusBarItem(); + this.ShowConfiguration = true; + + this.configureIntelliSenseStatusBarItem = this.createConfigureIntelliSenseStatusBarItem(); void this.ShowConfigureIntelliSenseButton(false, this.currentClient); + } - this.intelliSenseStatusItem = vscode.languages.createLanguageStatusItem(`cpptools.status.${LanguageStatusPriority.Mid}.intellisense`, util.documentSelector); - this.intelliSenseStatusItem.name = localize("cpptools.status.intellisense", "C/C++ IntelliSense Status"); - this.intelliSenseStatusItem.text = this.idleIntelliSenseText; + //#region IntelliSense language status + private createIntelliSenseStatusItem(): vscode.LanguageStatusItem { + const item: vscode.LanguageStatusItem = vscode.languages.createLanguageStatusItem(`cpptools.status.${LanguageStatusPriority.High}.intellisense`, util.documentSelector); + item.name = localize("cpptools.status.intellisense", "C/C++ IntelliSense Status"); + item.text = this.idleIntelliSenseText; + return item; + } - this.browseEngineStatusItem = vscode.languages.createLanguageStatusItem(`cpptools.status.${LanguageStatusPriority.Mid}.tagparser`, util.documentSelector); - this.browseEngineStatusItem.name = localize("cpptools.status.tagparser", "C/C++ Tag Parser Status"); - this.browseEngineStatusItem.detail = localize("cpptools.detail.tagparser", "Initializing..."); - this.browseEngineStatusItem.text = "$(database)"; - this.browseEngineStatusItem.command = { - command: "C_Cpp.RescanWorkspace", - title: this.workspaceRescanText, + private flameTimeout?: NodeJS.Timeout; + private setIsUpdatingIntelliSense(val: boolean): void { + const settings: CppSettings = new CppSettings((vscode.workspace.workspaceFolders && vscode.workspace.workspaceFolders.length > 0) ? vscode.workspace.workspaceFolders[0]?.uri : undefined); + + if (settings.intelliSenseEngine === "disabled") { + this.intelliSenseStatusItem.text = this.missingIntelliSenseText; + this.intelliSenseStatusItem.command = { + command: "C_Cpp.SelectDefaultCompiler", + title: localize("intellisense.select.text", "Select a Compiler"), + arguments: commandArguments + }; + return; + } + + this.intelliSenseStatusItem.busy = val; + + if (this.flameTimeout) { + clearTimeout(this.flameTimeout); + } + + if (val) { + this.intelliSenseStatusItem.text = "$(flame)"; + this.intelliSenseStatusItem.detail = this.updatingIntelliSenseText; + this.flameTimeout = undefined; + } else { + this.flameTimeout = setTimeout(() => { + if (this.intelliSenseStatusItem) { + this.intelliSenseStatusItem.text = this.idleIntelliSenseText; + this.intelliSenseStatusItem.detail = ""; + } + }, this.iconDelayTime); + } + this.intelliSenseStatusItem.command = { + command: "C_Cpp.RestartIntelliSenseForFile", + title: localize("rescan.intellisense.text", "Rescan"), + tooltip: localize("rescan.intellisense.tooltip", "Rescan IntelliSense"), arguments: commandArguments }; - this.workspaceParsingStatus = this.workspaceParsingRunningText; + } + //#endregion End - IntelliSense language status - this.codeAnalysisStatusItem = vscode.languages.createLanguageStatusItem(`cpptools.status.${LanguageStatusPriority.Low}.codeanalysis`, util.documentSelector); - this.codeAnalysisStatusItem.name = localize("cpptools.status.codeanalysis", "C/C++ Code Analysis Status"); - this.codeAnalysisStatusItem.text = this.codeAnalysisModePrefix + this.codeAnalysisCurrentMode(); - this.codeAnalysisStatusItem.command = { - command: "C_Cpp.ShowIdleCodeAnalysisCommands", - title: localize("c.cpp.codeanalysis.statusbar.runNow", "Run Now"), + //#region Tag parse language status + private createTagParseStatusItem(): vscode.LanguageStatusItem { + const item: vscode.LanguageStatusItem = vscode.languages.createLanguageStatusItem(`cpptools.status.${LanguageStatusPriority.Mid}.tagparser`, util.documentSelector); + item.name = localize("cpptools.status.tagparser", "C/C++ Tag Parser Status"); + item.detail = localize("cpptools.detail.tagparser", "Initializing..."); + item.text = this.dataBaseIcon; + item.command = { + command: "C_Cpp.RescanWorkspace", + title: this.workspaceRescanText, arguments: commandArguments }; - + return item; } private set TagParseStatus(label: string) { - this.workspaceParsingProgress = label; - if (this.browseEngineStatusItem.command) { - // Currently needed in order to update hover tooltip - this.browseEngineStatusItem.command.tooltip = (this.isParsingFiles ? `${this.parsingFilesTooltip} | ` : "") + this.workspaceParsingProgress; + if ((this.isParsingWorkspace || this.isParsingFiles) && this.tagParseStatusItem.command) { + // Create a new command object to force update on tooltip + const updatedCommand: vscode.Command = this.tagParseStatusItem.command; + updatedCommand.tooltip = (this.isParsingFiles ? `${this.parsingFilesTooltip} | ` : "") + label; + this.tagParseStatusItem.command = updatedCommand; } } private setIsInitializingWorkspace(val: boolean): void { if (val) { - this.browseEngineStatusItem.text = "$(database)"; - this.browseEngineStatusItem.detail = this.workspaceParsingInitializing; + this.tagParseStatusItem.text = this.dataBaseIcon; + this.tagParseStatusItem.detail = this.workspaceParsingInitializing; } } + private setIsIndexingWorkspace(val: boolean): void { if (val) { - this.browseEngineStatusItem.text = "$(database)"; - this.browseEngineStatusItem.detail = this.workspaceParsingIndexing; - this.browseEngineStatusItem.busy = true; + this.tagParseStatusItem.text = this.dataBaseIcon; + this.tagParseStatusItem.detail = this.workspaceParsingIndexing; + this.tagParseStatusItem.busy = true; } } - private set ActiveConfig(label: string) { - this.configStatusBarItem.text = label; - } - - private dbTimeout?: NodeJS.Timeout; private setIsParsingWorkspace(val: boolean): void { + this.isParsingWorkspace = val; if (!val && this.isParsingWorkspacePaused) { // Unpause before handling the no longer parsing state. - this.setIsParsingWorkspacePaused(false); + this.isParsingWorkspacePaused = false; } - this.isParsingWorkspace = val; - const showIcon: boolean = val || this.isParsingFiles; + this.setTagParseStatus(); + } - // Leave this outside for more real-time response - this.browseEngineStatusItem.busy = showIcon; + private setIsParsingFiles(val: boolean): void { + this.isParsingFiles = val; + this.setTagParseStatus(); + } - if (showIcon) { - this.browseEngineStatusItem.text = "$(database)"; - this.browseEngineStatusItem.detail = this.tagParseText(); + private setIsParsingWorkspacePaused(val: boolean): void { + this.isParsingWorkspacePaused = val; + if (this.isParsingWorkspace || this.isParsingFiles) { + this.setTagParseStatus(); + } + } - if (this.dbTimeout) { - clearTimeout(this.dbTimeout); - this.dbTimeout = undefined; + private getTagParsingDetail(): string { + if (!this.isParsingWorkspace && !this.isParsingFiles) { + return ""; + } + if (this.isParsingWorkspacePaused) { + const displayTwoStatus: boolean = this.isParsingFiles && this.isParsingWorkspace; + return (this.isParsingFiles ? this.parsingFilesTooltip : "") + + (displayTwoStatus ? " | " : "") + + (this.isParsingWorkspace ? this.workspaceParsingPausedText : ""); + } else { + return this.isParsingWorkspace ? this.workspaceParsingRunningText : this.parsingFilesTooltip; + } + } + + private setTagParseStatus(): void { + // Set busy icon outside of timer for more real-time response + this.tagParseStatusItem.busy = (this.isParsingWorkspace && !this.isParsingWorkspacePaused) || this.isParsingFiles; + if (this.tagParseStatusItem.busy && this.tagParseTimeout) { + clearTimeout(this.tagParseTimeout); + this.tagParseTimeout = undefined; + } + + if (this.isParsingWorkspace || this.isParsingFiles) { + this.tagParseStatusItem.text = this.dataBaseIcon; + this.tagParseStatusItem.detail = this.getTagParsingDetail(); + if (this.isParsingWorkspace) { + // Pausing/resuming is only applicable to parsing workspace. + this.tagParseStatusItem.command = this.isParsingWorkspacePaused ? { + command: "C_Cpp.ResumeParsing", + title: localize("tagparser.resume.text", "Resume"), + arguments: commandArguments, + tooltip: this.tagParseStatusItem.command?.tooltip ?? undefined + } : { + command: "C_Cpp.PauseParsing", + title: localize("tagparser.pause.text", "Pause"), + arguments: commandArguments, + tooltip: this.tagParseStatusItem.command?.tooltip ?? undefined + }; + } else { + this.tagParseStatusItem.command = { + command: "C_Cpp.RescanWorkspace", + title: this.workspaceRescanText, + arguments: commandArguments, + tooltip: this.tagParseStatusItem.command?.tooltip ?? undefined + }; } } else { - this.dbTimeout = setTimeout(() => { - this.browseEngineStatusItem.text = this.workspaceParsingDoneText; - this.browseEngineStatusItem.detail = ""; - this.browseEngineStatusItem.command = { + // Parsing completed. + this.tagParseTimeout = setTimeout(() => { + this.tagParseStatusItem.text = this.workspaceParsingDoneText; + this.tagParseStatusItem.detail = ""; + this.tagParseStatusItem.command = { command: "C_Cpp.RescanWorkspace", title: this.workspaceRescanText, arguments: commandArguments @@ -213,57 +290,20 @@ export class LanguageStatusUI { }, this.iconDelayTime); } } + //#endregion Tag parse language status - private tagParseText(): string { - if (this.isParsingWorkspacePaused) { - const twoStatus: boolean = this.isParsingFiles && this.isParsingWorkspace; - return (this.isParsingFiles ? this.parsingFilesTooltip : "") - + (twoStatus ? " | " : "") - + (this.isParsingWorkspace ? this.workspaceParsingStatus : ""); - } else { - return this.isParsingWorkspace ? this.workspaceParsingStatus : this.parsingFilesTooltip; - } - } - - private setIsParsingWorkspacePausable(val: boolean): void { - if (val && this.isParsingWorkspace) { - this.browseEngineStatusItem.command = { - command: "C_Cpp.PauseParsing", - title: localize("tagparser.pause.text", "Pause"), - arguments: commandArguments - }; - } - } - - private setIsParsingWorkspacePaused(val: boolean): void { - if (!this.isParsingFiles && !this.isParsingWorkspace) { - // Ignore a pause change if no parsing is actually happening. - return; - } - this.isParsingWorkspacePaused = val; - this.browseEngineStatusItem.busy = !val || this.isParsingFiles; - this.browseEngineStatusItem.text = "$(database)"; - this.workspaceParsingStatus = val ? this.workspaceParsingPausedText : this.workspaceParsingRunningText; - this.browseEngineStatusItem.detail = this.tagParseText(); - this.browseEngineStatusItem.command = val ? { - command: "C_Cpp.ResumeParsing", - title: localize("tagparser.resume.text", "Resume"), - arguments: commandArguments - } : { - command: "C_Cpp.PauseParsing", - title: localize("tagparser.pause.text", "Pause"), + //#region Code analysis language status + private createCodeAnalysisStatusItem(): vscode.LanguageStatusItem { + const item: vscode.LanguageStatusItem = vscode.languages.createLanguageStatusItem(`cpptools.status.${LanguageStatusPriority.Low}.codeanalysis`, util.documentSelector); + item.name = localize("cpptools.status.codeanalysis", "C/C++ Code Analysis Status"); + item.text = this.codeAnalysisModePrefix + this.codeAnalysisCurrentMode(); + item.command = { + command: "C_Cpp.ShowIdleCodeAnalysisCommands", + title: localize("c.cpp.codeanalysis.statusbar.runNow", "Run Now"), arguments: commandArguments }; + return item; } - - private set ShowConfiguration(show: boolean) { - if (show) { - this.configStatusBarItem.show(); - } else { - this.configStatusBarItem.hide(); - } - } - private setIsCodeAnalysisPaused(val: boolean): void { if (!this.isRunningCodeAnalysis) { return; @@ -274,74 +314,6 @@ export class LanguageStatusUI { this.codeAnalysisStatusItem.text = val ? this.codeAnalysisPausedText : this.codeAnalysisRunningText; } - private setIsParsingFiles(val: boolean): void { - this.isParsingFiles = val; - const showIcon: boolean = val || this.isParsingWorkspace; - - // Leave this outside for more real-time response - this.browseEngineStatusItem.busy = val || (!this.isParsingWorkspacePaused && this.isParsingWorkspace); - - if (showIcon) { - this.browseEngineStatusItem.text = "$(database)"; - this.browseEngineStatusItem.detail = this.tagParseText(); - - if (this.dbTimeout) { - clearTimeout(this.dbTimeout); - this.dbTimeout = undefined; - } - } else { - this.dbTimeout = setTimeout(() => { - this.browseEngineStatusItem.text = this.workspaceParsingDoneText; - this.browseEngineStatusItem.detail = ""; - this.browseEngineStatusItem.command = { - command: "C_Cpp.RescanWorkspace", - title: this.workspaceRescanText, - arguments: commandArguments - }; - }, this.iconDelayTime); - } - } - - private flameTimeout?: NodeJS.Timeout; - private setIsUpdatingIntelliSense(val: boolean): void { - const settings: CppSettings = new CppSettings((vscode.workspace.workspaceFolders && vscode.workspace.workspaceFolders.length > 0) ? vscode.workspace.workspaceFolders[0]?.uri : undefined); - - if (settings.intelliSenseEngine === "disabled") { - this.intelliSenseStatusItem.text = this.missingIntelliSenseText; - this.intelliSenseStatusItem.command = { - command: "C_Cpp.SelectDefaultCompiler", - title: localize("intellisense.select.text", "Select a Compiler"), - arguments: commandArguments - }; - return; - } - - this.intelliSenseStatusItem.busy = val; - - if (this.flameTimeout) { - clearTimeout(this.flameTimeout); - } - - if (val) { - this.intelliSenseStatusItem.text = "$(flame)"; - this.intelliSenseStatusItem.detail = this.updatingIntelliSenseText; - this.flameTimeout = undefined; - } else { - this.flameTimeout = setTimeout(() => { - if (this.intelliSenseStatusItem) { - this.intelliSenseStatusItem.text = this.idleIntelliSenseText; - this.intelliSenseStatusItem.detail = ""; - } - }, this.iconDelayTime); - } - this.intelliSenseStatusItem.command = { - command: "C_Cpp.RestartIntelliSenseForFile", - title: localize("rescan.intellisense.text", "Rescan"), - tooltip: localize("rescan.intellisense.tooltip", "Rescan IntelliSense"), - arguments: commandArguments - }; - } - private codeAnalysisCurrentMode(): string { const settings: CppSettings = new CppSettings((vscode.workspace.workspaceFolders && vscode.workspace.workspaceFolders.length > 0) ? vscode.workspace.workspaceFolders[0]?.uri : undefined); const state: string = (settings.codeAnalysisRunAutomatically && settings.clangTidyEnabled) @@ -404,6 +376,49 @@ export class LanguageStatusUI { this.updateCodeAnalysisTooltip(); } + public async showActiveCodeAnalysisCommands(): Promise { + const options: vscode.QuickPickOptions = {}; + options.placeHolder = localize("select.code.analysis.command", "Select a code analysis command..."); + + const items: IndexableQuickPickItem[] = []; + items.push({ label: localize("cancel.analysis", "Cancel"), description: "", index: 0 }); + + if (this.isCodeAnalysisPaused) { + items.push({ label: localize("resume.analysis", "Resume"), description: "", index: 2 }); + } else { + items.push({ label: localize("pause.analysis", "Pause"), description: "", index: 1 }); + } + items.push({ label: localize("another.analysis", "Start Another..."), description: "", index: 3 }); + const selection: IndexableQuickPickItem | undefined = await vscode.window.showQuickPick(items, options); + return (selection) ? selection.index : -1; + } + + public async showIdleCodeAnalysisCommands(): Promise { + const options: vscode.QuickPickOptions = {}; + options.placeHolder = localize("select.command", "Select a command..."); + + const items: IndexableQuickPickItem[] = []; + items.push({ label: localize("active.analysis", "Run Code Analysis on Active File"), description: "", index: 0 }); + items.push({ label: localize("all.analysis", "Run Code Analysis on All Files"), description: "", index: 1 }); + items.push({ label: localize("open.analysis", "Run Code Analysis on Open Files"), description: "", index: 2 }); + const selection: IndexableQuickPickItem | undefined = await vscode.window.showQuickPick(items, options); + return (selection) ? selection.index : -1; + } + //#endregion Code analysis language status + + //#region References status + private createReferencesStatusBarItem(): vscode.StatusBarItem { + const item: vscode.StatusBarItem = vscode.window.createStatusBarItem(`c.cpp.references.statusbar`, vscode.StatusBarAlignment.Right, 901); + item.name = localize("c.cpp.references.statusbar", "C/C++ References Status"); + item.tooltip = ""; + item.command = { + command: "C_Cpp.ShowReferencesProgress", + title: item.name, + arguments: commandArguments + }; + return item; + } + private get ReferencesCommand(): ReferencesCommandMode { return this.referencesStatusBarItem.tooltip === "" ? ReferencesCommandMode.None : (this.referencesStatusBarItem.tooltip === referencesCommandModeToString(ReferencesCommandMode.Find) ? ReferencesCommandMode.Find : @@ -429,9 +444,50 @@ export class LanguageStatusUI { this.referencesStatusBarItem.hide(); } } + //#endregion End - References status - private showConfigureIntelliSenseButton: boolean = false; - private configureIntelliSenseTimeout?: NodeJS.Timeout; + //#region Configuration status bar + private createConfigurationStatusBarItem(): vscode.StatusBarItem { + const configTooltip: string = localize("c.cpp.configuration.tooltip", "C/C++ Configuration"); + const item: vscode.StatusBarItem = vscode.window.createStatusBarItem("c.cpp.configuration.tooltip", vscode.StatusBarAlignment.Right, 0); + item.name = configTooltip; + item.tooltip = configTooltip; + item.command = { + command: "C_Cpp.ConfigurationSelect", + title: configTooltip, + arguments: commandArguments + }; + return item; + } + + private set ActiveConfig(label: string) { + this.configurationStatusBarItem.text = label; + } + + private set ShowConfiguration(show: boolean) { + if (show) { + this.configurationStatusBarItem.show(); + } else { + this.configurationStatusBarItem.hide(); + } + } + //#endregion End - Configuration status bar + + //#region Configure IntelliSense status bar + private createConfigureIntelliSenseStatusBarItem(): vscode.StatusBarItem { + const cppConfigureIntelliSenseText: string = localize("c.cpp.configureIntelliSenseStatus.cppText", "C/C++ Configure IntelliSense"); + const item: vscode.StatusBarItem = vscode.window.createStatusBarItem(`c.cpp.configureIntelliSenseStatus.statusbar`, vscode.StatusBarAlignment.Right, 0); + item.name = cppConfigureIntelliSenseText; + item.tooltip = cppConfigureIntelliSenseText; + item.text = `$(warning) ${this.configureIntelliSenseText}`; + item.backgroundColor = new vscode.ThemeColor('statusBarItem.warningBackground'); + item.command = { + command: "C_Cpp.SelectIntelliSenseConfiguration", + title: cppConfigureIntelliSenseText, + arguments: ['statusBar'] + }; + return item; + } public async ShowConfigureIntelliSenseButton(show: boolean, client?: Client, configurationType?: ConfigurationType, sender?: string): Promise { if (client !== this.currentClient) { @@ -453,18 +509,18 @@ export class LanguageStatusUI { const activeEditor: vscode.TextEditor | undefined = vscode.window.activeTextEditor; telemetry.logLanguageServerEvent('configureIntelliSenseStatusBar'); if (activeEditor && util.isCppOrRelated(activeEditor.document)) { - this.configureIntelliSenseStatusItem.show(); + this.configureIntelliSenseStatusBarItem.show(); if (!this.configureIntelliSenseTimeout) { this.configureIntelliSenseTimeout = setTimeout(() => { - this.configureIntelliSenseStatusItem.text = "$(warning)"; + this.configureIntelliSenseStatusBarItem.text = "$(warning)"; }, 15000); } } } else { - this.configureIntelliSenseStatusItem.hide(); + this.configureIntelliSenseStatusBarItem.hide(); if (this.configureIntelliSenseTimeout) { clearTimeout(this.configureIntelliSenseTimeout); - this.configureIntelliSenseStatusItem.text = `$(warning) ${this.configureIntelliSenseText}`; + this.configureIntelliSenseStatusBarItem.text = `$(warning) ${this.configureIntelliSenseText}`; this.configureIntelliSenseTimeout = undefined; } } @@ -475,7 +531,7 @@ export class LanguageStatusUI { if (!activeEditor) { this.ShowConfiguration = false; if (this.showConfigureIntelliSenseButton) { - this.configureIntelliSenseStatusItem.hide(); + this.configureIntelliSenseStatusBarItem.hide(); } } else { const isCppPropertiesJson: boolean = util.isCppPropertiesJson(activeEditor.document); @@ -492,39 +548,19 @@ export class LanguageStatusUI { if (this.showConfigureIntelliSenseButton) { if (isCppOrRelated && !!this.currentClient && this.currentClient.getShowConfigureIntelliSenseButton()) { - this.configureIntelliSenseStatusItem.show(); + this.configureIntelliSenseStatusBarItem.show(); if (!this.configureIntelliSenseTimeout) { this.configureIntelliSenseTimeout = setTimeout(() => { - this.configureIntelliSenseStatusItem.text = "$(warning)"; + this.configureIntelliSenseStatusBarItem.text = "$(warning)"; }, 15000); } } else { - this.configureIntelliSenseStatusItem.hide(); + this.configureIntelliSenseStatusBarItem.hide(); } } } } - - public bind(client: Client): void { - client.InitializingWorkspaceChanged(value => { this.setIsInitializingWorkspace(value); }); - client.IndexingWorkspaceChanged(value => { this.setIsIndexingWorkspace(value); }); - client.ParsingWorkspaceChanged(value => { this.setIsParsingWorkspace(value); }); - client.ParsingWorkspacePausableChanged(value => { this.setIsParsingWorkspacePausable(value); }); - client.ParsingWorkspacePausedChanged(value => { this.setIsParsingWorkspacePaused(value); }); - client.ParsingFilesChanged(value => { this.setIsParsingFiles(value); }); - client.IntelliSenseParsingChanged(value => { this.setIsUpdatingIntelliSense(value); }); - client.RunningCodeAnalysisChanged(value => { this.setIsRunningCodeAnalysis(value); }); - client.CodeAnalysisPausedChanged(value => { this.setIsCodeAnalysisPaused(value); }); - client.CodeAnalysisProcessedChanged(value => { this.setCodeAnalysisProcessed(value); }); - client.CodeAnalysisTotalChanged(value => { this.setCodeAnalysisTotal(value); }); - client.ReferencesCommandModeChanged(value => { this.ReferencesCommand = value; }); - client.TagParserStatusChanged(value => { this.TagParseStatus = value; }); - client.ActiveConfigChanged(value => { - this.ActiveConfig = value; - this.currentClient = client; - void this.ShowConfigureIntelliSenseButton(client.getShowConfigureIntelliSenseButton(), client); - }); - } + //#endregion End - Configure IntelliSense status bar public async showConfigurations(configurationNames: string[]): Promise { const options: vscode.QuickPickOptions = {}; @@ -584,52 +620,6 @@ export class LanguageStatusUI { return (selection) ? selection.key : ""; } - private readonly selectACommandString: string = localize("select.command", "Select a command..."); - private readonly selectACodeAnalysisCommandString: string = localize("select.code.analysis.command", "Select a code analysis command..."); - - public async showParsingCommands(): Promise { - const options: vscode.QuickPickOptions = {}; - options.placeHolder = this.selectACommandString; - - const items: IndexableQuickPickItem[] = []; - if (this.isParsingWorkspacePaused) { - items.push({ label: localize("resume.parsing", "Resume Workspace Parsing"), description: "", index: 1 }); - } else { - items.push({ label: localize("pause.parsing", "Pause Workspace Parsing"), description: "", index: 0 }); - } - const selection: IndexableQuickPickItem | undefined = await vscode.window.showQuickPick(items, options); - return (selection) ? selection.index : -1; - } - - public async showActiveCodeAnalysisCommands(): Promise { - const options: vscode.QuickPickOptions = {}; - options.placeHolder = this.selectACodeAnalysisCommandString; - - const items: IndexableQuickPickItem[] = []; - items.push({ label: localize("cancel.analysis", "Cancel"), description: "", index: 0 }); - - if (this.isCodeAnalysisPaused) { - items.push({ label: localize("resume.analysis", "Resume"), description: "", index: 2 }); - } else { - items.push({ label: localize("pause.analysis", "Pause"), description: "", index: 1 }); - } - items.push({ label: localize("another.analysis", "Start Another..."), description: "", index: 3 }); - const selection: IndexableQuickPickItem | undefined = await vscode.window.showQuickPick(items, options); - return (selection) ? selection.index : -1; - } - - public async showIdleCodeAnalysisCommands(): Promise { - const options: vscode.QuickPickOptions = {}; - options.placeHolder = this.selectACommandString; - - const items: IndexableQuickPickItem[] = []; - items.push({ label: localize("active.analysis", "Run Code Analysis on Active File"), description: "", index: 0 }); - items.push({ label: localize("all.analysis", "Run Code Analysis on All Files"), description: "", index: 1 }); - items.push({ label: localize("open.analysis", "Run Code Analysis on Open Files"), description: "", index: 2 }); - const selection: IndexableQuickPickItem | undefined = await vscode.window.showQuickPick(items, options); - return (selection) ? selection.index : -1; - } - public async showConfigureIncludePathMessage(prompt: () => Promise, onSkip: () => void): Promise { await sleep(10000); this.showConfigurationPrompt(ConfigurationPriority.IncludePath, prompt, onSkip); @@ -672,12 +662,33 @@ export class LanguageStatusUI { } } + public bind(client: Client): void { + client.InitializingWorkspaceChanged(value => { this.setIsInitializingWorkspace(value); }); + client.IndexingWorkspaceChanged(value => { this.setIsIndexingWorkspace(value); }); + client.ParsingWorkspaceChanged(value => { this.setIsParsingWorkspace(value); }); + client.ParsingWorkspacePausedChanged(value => { this.setIsParsingWorkspacePaused(value); }); + client.ParsingFilesChanged(value => { this.setIsParsingFiles(value); }); + client.IntelliSenseParsingChanged(value => { this.setIsUpdatingIntelliSense(value); }); + client.RunningCodeAnalysisChanged(value => { this.setIsRunningCodeAnalysis(value); }); + client.CodeAnalysisPausedChanged(value => { this.setIsCodeAnalysisPaused(value); }); + client.CodeAnalysisProcessedChanged(value => { this.setCodeAnalysisProcessed(value); }); + client.CodeAnalysisTotalChanged(value => { this.setCodeAnalysisTotal(value); }); + client.ReferencesCommandModeChanged(value => { this.ReferencesCommand = value; }); + client.TagParserStatusChanged(value => { this.TagParseStatus = value; }); + client.ActiveConfigChanged(value => { + this.ActiveConfig = value; + this.currentClient = client; + void this.ShowConfigureIntelliSenseButton(client.getShowConfigureIntelliSenseButton(), client); + }); + } + public dispose(): void { - this.configStatusBarItem.dispose(); - this.browseEngineStatusItem.dispose(); this.intelliSenseStatusItem.dispose(); - this.referencesStatusBarItem.dispose(); + this.tagParseStatusItem.dispose(); this.codeAnalysisStatusItem.dispose(); + this.referencesStatusBarItem.dispose(); + this.configurationStatusBarItem.dispose(); + this.configureIntelliSenseStatusBarItem.dispose(); } } From 6efaafef6070a986d734e94c37dc64bad6d21e99 Mon Sep 17 00:00:00 2001 From: browntarik <111317156+browntarik@users.noreply.github.com> Date: Tue, 29 Aug 2023 14:53:18 -0700 Subject: [PATCH 04/15] place markdownInComments setting under code doc (#11380) --- Extension/package.json | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/Extension/package.json b/Extension/package.json index 1e79389f39..94efd0bbbc 100644 --- a/Extension/package.json +++ b/Extension/package.json @@ -456,22 +456,6 @@ ], "scope": "resource" }, - "C_Cpp.markdownInComments": { - "type": "string", - "enum": [ - "subsetEnabled", - "enabled", - "disabled" - ], - "enumDescriptions": [ - "%c_cpp.configuration.markdownInComments.subsetEnabled.description%", - "%c_cpp.configuration.markdownInComments.enabled.description%", - "%c_cpp.configuration.markdownInComments.disabled.description%" - ], - "default": "subsetEnabled", - "description": "%c_cpp.configuration.markdownInComments.description%", - "scope": "resource" - }, "C_Cpp.hover": { "type": "string", "enum": [ @@ -1492,6 +1476,22 @@ "description": "%c_cpp.configuration.commentContinuationPatterns.description%", "scope": "window" }, + "C_Cpp.markdownInComments": { + "type": "string", + "enum": [ + "subsetEnabled", + "enabled", + "disabled" + ], + "enumDescriptions": [ + "%c_cpp.configuration.markdownInComments.subsetEnabled.description%", + "%c_cpp.configuration.markdownInComments.enabled.description%", + "%c_cpp.configuration.markdownInComments.disabled.description%" + ], + "default": "subsetEnabled", + "description": "%c_cpp.configuration.markdownInComments.description%", + "scope": "resource" + }, "C_Cpp.simplifyStructuredComments": { "type": "boolean", "default": true, From 628301be372afb934e143270d8e4137d8eca092c Mon Sep 17 00:00:00 2001 From: Garrett Serack Date: Tue, 29 Aug 2023 16:08:07 -0700 Subject: [PATCH 05/15] Test restructuring and cleanup (#11262) * updated files * queue and ready are now separate * checkpoint * found it! fixed missing call * cleaned up and refactored a bit * cleanup * whoops. make sure linter runs! * Make the queue itself static * addressed formatting issues, added more rules to eslint * more formatting, made ready Promise/void * checkpoint * checkpoint * checkpoint * checkpoint (linting) * checkpoint * checkpoint * checkpoint * checkpoint * renamed path to filepath. * checkpoint * checkpoint * so close... * checkpoint again * before making doc * checkpoint * checkpoint * Checkpoint * renamed awaiters * eslint * fix format on generated native strings * add dummy pretest task back in for the moment * change unit test runing * posix calc test failure * make signal dispose better * add est regen script * missed file * checkpoint * Improve scripts a bit * remove hooks for now * remove unused script * remove unused script * filter out files * ensure that eslint works for scripts too * fix build oses to specific version * cleanups and tweaking * adjusted for cosmetic feedback * more * add eslint rule to fix space before/after semicolon * remove tba/tbd * cleanup * Added space-infix-ops rule * cleanup * resolve comments * resolve comments * add simple debug task * spelling fixes * cleanup more * More changes. yay * remove the extra whitespace from before comments * add eslint rule to ensure that there are never extra spaces * adding another eslint rule to ensure that there isn't spacing around unary operators, which we all know is dangerous. Or weird. I forget which * added a space between vs and code because a space is the desired format * removed all mentions of transpiler which was removed * removed an extra comma * removed a trailing slash * removed useless lines * missed as file * reconfigure no-extra-parens rule * added note about yarn install * whatever * more fun * FIx it so that it webpacks correctly * remove refernces to attic * restore line to correct check * fix whitespace * added blank yarn install * removed --- .github/workflows/ci_linux.yml | 94 +- .github/workflows/ci_mac.yml | 94 +- .github/workflows/ci_windows.yml | 86 +- Extension/.eslintignore | 5 +- Extension/.eslintrc.js | 7 +- Extension/.gitignore | 1 + Extension/.scripts/clean.ts | 64 ++ Extension/.scripts/code.ts | 40 + Extension/.scripts/common.ts | 290 +++++ Extension/.scripts/copyWalkthruMedia.ts | 28 + Extension/.scripts/generateNativeStrings.ts | 134 +++ .../generateOptionsSchema.ts} | 21 +- Extension/.scripts/import_edge_strings.ts | 95 ++ Extension/.scripts/scripts.ts | 17 + Extension/.scripts/test.ts | 230 ++++ Extension/.scripts/tsconfig.json | 12 + .../mockDebug.ts => .scripts/verify.ts} | 11 +- Extension/.scripts/vscode.ts | 61 + Extension/.vscode/launch.json | 184 +-- Extension/.vscode/settings.json | 21 +- Extension/.vscode/tasks.json | 194 +--- Extension/.vscodeignore | 101 +- Extension/.yarnrc | 7 + Extension/gulpfile.js | 139 +-- Extension/import_edge_strings.js | 89 -- Extension/package.json | 56 +- Extension/readme.developer.md | 339 ++++++ .../src/Debugger/configurationProvider.ts | 26 +- Extension/src/Debugger/configurations.ts | 14 +- Extension/src/Debugger/extension.ts | 16 +- Extension/src/Debugger/utils.ts | 2 +- .../Providers/codeActionProvider.ts | 2 +- .../Providers/inlayHintProvider.ts | 2 +- .../Providers/renameProvider.ts | 4 +- Extension/src/LanguageServer/client.ts | 45 +- .../src/LanguageServer/clientCollection.ts | 4 +- Extension/src/LanguageServer/codeAnalysis.ts | 8 +- .../src/LanguageServer/configurations.ts | 12 +- .../LanguageServer/cppBuildTaskProvider.ts | 6 +- .../src/LanguageServer/customProviders.ts | 2 +- Extension/src/LanguageServer/extension.ts | 6 +- .../src/LanguageServer/languageConfig.ts | 8 +- .../src/LanguageServer/referencesModel.ts | 14 +- .../src/LanguageServer/referencesView.ts | 4 +- Extension/src/LanguageServer/settings.ts | 5 +- Extension/src/LanguageServer/settingsPanel.ts | 2 +- .../LanguageServer/timeTelemetryCollector.ts | 8 +- Extension/src/LanguageServer/ui.ts | 27 +- Extension/src/LanguageServer/utils.ts | 2 +- Extension/src/SSH/sshCommandToConfig.ts | 54 +- Extension/src/SSH/sshHosts.ts | 2 +- Extension/src/Utility/Async/constructor.ts | 47 + Extension/src/Utility/Async/factory.ts | 55 + Extension/src/Utility/Async/iterators.ts | 177 +++ Extension/src/Utility/Async/lazy.ts | 25 + Extension/src/Utility/Async/map.ts | 88 ++ Extension/src/Utility/Async/signal.ts | 22 +- Extension/src/Utility/Async/sleep.ts | 7 +- Extension/src/Utility/Async/timeout.ts | 8 +- Extension/src/Utility/Eventing/descriptor.ts | 62 + Extension/src/Utility/Eventing/dispatcher.ts | 502 ++++++++ Extension/src/Utility/Eventing/emitter.ts | 279 +++++ Extension/src/Utility/Eventing/eventParser.ts | 262 +++++ Extension/src/Utility/Eventing/interfaces.ts | 49 + Extension/src/Utility/Eventing/names.ts | 48 + Extension/src/Utility/Filesystem/filepath.ts | 140 +++ Extension/src/Utility/Filesystem/find.ts | 223 ++++ Extension/src/Utility/Filesystem/ripgrep.ts | 147 +++ Extension/src/Utility/Process/commandLine.ts | 245 ++++ Extension/src/Utility/Process/process.ts | 142 +++ Extension/src/Utility/Process/program.ts | 172 +++ Extension/src/Utility/Process/streams.ts | 557 +++++++++ Extension/src/Utility/Sandbox/interfaces.ts | 44 + Extension/src/Utility/Sandbox/sandbox.ts | 104 ++ Extension/src/Utility/System/array.ts | 56 + Extension/src/Utility/System/assertions.ts | 26 + Extension/src/Utility/System/environment.ts | 26 + Extension/src/Utility/System/finalize.ts | 79 ++ .../src/Utility/System/garbageCollector.ts | 14 + Extension/src/Utility/System/guards.ts | 22 +- Extension/src/Utility/System/info.ts | 147 +++ Extension/src/Utility/System/json.ts | 39 + Extension/src/Utility/System/map.ts | 35 + Extension/src/Utility/Text/characterCodes.ts | 245 ++++ Extension/src/Utility/Text/identifiers.ts | 46 + Extension/src/Utility/Text/scanner.ts | 1018 +++++++++++++++++ Extension/src/Utility/Text/streams.ts | 10 + Extension/src/Utility/Text/taggedLiteral.ts | 254 ++++ Extension/src/common.ts | 33 +- Extension/src/constants.ts | 9 +- Extension/src/expand.ts | 10 +- Extension/src/main.ts | 2 +- Extension/src/telemetry.ts | 5 +- Extension/test.tsconfig.json | 46 +- Extension/test/.eslintrc.js | 7 - Extension/test/common/internal.ts | 89 ++ Extension/test/common/selectTests.ts | 122 ++ .../testHelpers.ts | 7 +- .../IntelliSenseFeatures/index.ts | 38 - .../IntelliSenseFeatures/runTest.ts | 75 -- .../debugAdapterDescriptorFactory.ts | 46 - .../MockDebugger/mockDebugSession.ts | 65 -- .../test/integrationTests/debug/index.ts | 39 - .../test/integrationTests/debug/runTest.ts | 65 -- .../integrationTests/languageServer/index.ts | 39 - .../languageServer/runTest.ts | 67 -- .../Debugger/tests}/integration.test.ts | 8 +- .../levelOneFolder/levelOneFile.cpp | 26 + .../levelOneFolder/levelOneFile.h | 32 + .../levelTwoFolder/levelTwoFile.cpp | 22 + .../levelTwoFolder/levelTwoFile.h | 29 + .../assets/project_A/main.cpp | 6 + .../levelOneFolder/levelOneFile.cpp | 26 + .../levelOneFolder/levelOneFile.h | 32 + .../levelTwoFolder/levelTwoFile.cpp | 22 + .../levelTwoFolder/levelTwoFile.h | 29 + .../project_A/project_subfolder_H/main.cpp | 6 + .../project_subfolder_H/quickInfo.cpp | 15 + .../project_subfolder_H/references.cpp | 54 + .../project_subfolder_H/references.h | 13 + .../semantic_colorization.cpp | 344 ++++++ .../project_A/project_subfolder_H/testIdl.idl | 12 + .../assets/project_A/quickInfo.cpp | 15 + .../assets/project_A/references.cpp | 54 + .../assets/project_A/references.h | 13 + .../project_A/semantic_colorization.cpp | 344 ++++++ .../assets/project_A/testIdl.idl | 12 + .../levelOneFolder/levelOneFile.cpp | 26 + .../levelOneFolder/levelOneFile.h | 32 + .../levelTwoFolder/levelTwoFile.cpp | 22 + .../levelTwoFolder/levelTwoFile.h | 29 + .../assets/project_B/main.cpp | 6 + .../assets/project_B/quickInfo.cpp | 15 + .../assets/project_B/references.cpp | 54 + .../assets/project_B/references.h | 13 + .../project_B/semantic_colorization.cpp | 344 ++++++ .../assets/project_B/testIdl.idl | 12 + .../levelOneFolder/levelOneFile.cpp | 26 + .../levelOneFolder/levelOneFile.h | 32 + .../levelTwoFolder/levelTwoFile.cpp | 22 + .../levelTwoFolder/levelTwoFile.h | 29 + .../assets/project_C/main.cpp | 6 + .../assets/project_C/quickInfo.cpp | 15 + .../assets/project_C/references.cpp | 54 + .../assets/project_C/references.h | 13 + .../project_C/semantic_colorization.cpp | 344 ++++++ .../assets/project_C/testIdl.idl | 12 + .../.vscode/c_cpp_properties.json | 8 + .../assets/SingleRootProject/code_folding.cpp | 56 + .../levelOneFolder/levelOneFile.cpp | 26 + .../levelOneFolder/levelOneFile.h | 32 + .../levelTwoFolder/levelTwoFile.cpp | 22 + .../levelTwoFolder/levelTwoFile.h | 29 + .../assets/SingleRootProject/doxygen.cpp | 64 ++ .../SingleRootProject/doxygen_generation.cpp | 24 + .../assets/SingleRootProject/inlay_hints.cpp | 107 ++ .../assets/SingleRootProject/main.cpp | 6 + .../assets/SingleRootProject/quickInfo.cpp | 38 + .../assets/SingleRootProject/references.cpp | 54 + .../assets/SingleRootProject/references.h | 13 + .../semantic_colorization.cpp | 373 ++++++ .../assets/SingleRootProject/testIdl.idl | 12 + .../assets/sub1/.vscode/c_cpp_properties.json | 8 + .../assets/sub1/sub2/test.cpp | 0 .../assets/test.code-workspace | 14 + .../tests}/inlayhints.test.ts | 33 +- .../tests}/quickInfo.test.ts | 36 +- .../tests}/reference.test.ts | 27 +- .../NoWorkspace/assets/open_file.cpp | 10 + .../SimpleCppProject/assets}/.gitignore | 0 .../assets}/.vscode/launch.json | 0 .../assets}/.vscode/tasks.json | 0 .../SimpleCppProject/assets}/main.cpp | 0 .../SimpleCppProject/assets}/main1.cpp | 0 .../SimpleCppProject/assets}/main2.cpp | 0 .../SimpleCppProject/assets}/main3.cpp | 0 .../assets}/simpleCppProject.code-workspace | 0 .../tests}/languageServer.integration.test.ts | 72 +- .../assets/call_hierarchy/call_test1.cpp | 16 + .../assets/call_hierarchy/call_test1.h | 9 + .../assets/call_hierarchy/call_test2.cpp | 27 + .../SingleRootProject/assets/code_folding.cpp | 56 + .../create_declaration_definition/Auto.cpp | 10 + .../create_declaration_definition/C_File.c | 5 + .../create_declaration_definition/Class.cpp | 16 + .../create_declaration_definition/Class.h | 12 + .../ClassConstructor.cpp | 11 + .../FunctionTypes.cpp | 10 + .../create_declaration_definition/Global.cpp | 13 + .../create_declaration_definition/Global.h | 6 + .../create_declaration_definition/Inline.h | 10 + .../LightBulb.cpp | 10 + .../create_declaration_definition/Multi.cpp | 5 + .../create_declaration_definition/Multi.h | 10 + .../MultiNamespace.cpp | 23 + .../Namespace.cpp | 24 + .../create_declaration_definition/Namespace.h | 19 + .../NamespaceOther.h | 8 + .../NotInProject.h | 4 + .../create_declaration_definition/Scope.cpp | 18 + .../create_declaration_definition/Scope.h | 9 + .../Templates.cpp | 19 + .../cdd_test1.cpp | 19 + .../create_declaration_definition/cdd_test1.h | 17 + .../create_declaration_definition/cdd_test2.h | 15 + .../levelOneFolder/levelOneFile.cpp | 26 + .../levelOneFolder/levelOneFile.h | 32 + .../levelTwoFolder/levelTwoFile.cpp | 22 + .../levelTwoFolder/levelTwoFile.h | 29 + .../SingleRootProject/assets/doxygen.cpp | 64 ++ .../assets/doxygen_generation.cpp | 24 + .../SingleRootProject/assets/inlay_hints.cpp | 107 ++ .../SingleRootProject/assets/main.cpp | 6 + .../SingleRootProject/assets/quickInfo.cpp | 38 + .../SingleRootProject/assets/references.cpp | 54 + .../SingleRootProject/assets/references.h | 13 + .../assets/semantic_colorization.cpp | 373 ++++++ .../SingleRootProject/assets/testIdl.idl | 12 + .../tests}/ParsedEnvironmentFile.test.ts | 20 +- .../SingleRootProject/tests/common.test.ts | 281 +++++ .../SingleRootProject/tests}/expand.test.ts | 5 +- .../tests}/extension.test.ts | 6 +- Extension/test/unit/async.test.ts | 81 ++ Extension/test/unit/asyncIterators.test.ts | 48 + .../test/unit/commandLineParsing.test.ts | 217 ++++ Extension/test/unit/eventing.test.ts | 254 ++++ .../example.test.ts | 0 Extension/test/unit/examples/someclass.ts | 63 + .../manualPromise.test.ts | 0 Extension/test/unit/parser.test.ts | 107 ++ Extension/test/unit/process.test.ts | 97 ++ .../signals.test.ts | 0 Extension/test/unit/typeinfo.test.ts | 122 ++ Extension/test/unitTests/common.test.ts | 281 ----- Extension/test/unitTests/index.ts | 39 - Extension/test/unitTests/runTest.ts | 65 -- Extension/tools/.eslintrc.js | 6 - Extension/tools/prepublish.js | 34 - Extension/tscCompileList.txt | 12 - Extension/tsconfig.json | 15 +- Extension/ui.tsconfig.json | 27 + Extension/ui/.eslintrc.js | 6 - Extension/ui/settings.ts | 8 +- Extension/webpack.config.js | 11 +- Extension/yarn.lock | 776 ++++--------- 245 files changed, 13461 insertions(+), 2486 deletions(-) create mode 100644 Extension/.scripts/clean.ts create mode 100644 Extension/.scripts/code.ts create mode 100644 Extension/.scripts/common.ts create mode 100644 Extension/.scripts/copyWalkthruMedia.ts create mode 100644 Extension/.scripts/generateNativeStrings.ts rename Extension/{tools/GenerateOptionsSchema.ts => .scripts/generateOptionsSchema.ts} (90%) create mode 100644 Extension/.scripts/import_edge_strings.ts create mode 100644 Extension/.scripts/scripts.ts create mode 100644 Extension/.scripts/test.ts create mode 100644 Extension/.scripts/tsconfig.json rename Extension/{test/integrationTests/MockDebugger/mockDebug.ts => .scripts/verify.ts} (62%) create mode 100644 Extension/.scripts/vscode.ts create mode 100644 Extension/.yarnrc delete mode 100644 Extension/import_edge_strings.js create mode 100644 Extension/readme.developer.md create mode 100644 Extension/src/Utility/Async/constructor.ts create mode 100644 Extension/src/Utility/Async/factory.ts create mode 100644 Extension/src/Utility/Async/iterators.ts create mode 100644 Extension/src/Utility/Async/lazy.ts create mode 100644 Extension/src/Utility/Async/map.ts create mode 100644 Extension/src/Utility/Eventing/descriptor.ts create mode 100644 Extension/src/Utility/Eventing/dispatcher.ts create mode 100644 Extension/src/Utility/Eventing/emitter.ts create mode 100644 Extension/src/Utility/Eventing/eventParser.ts create mode 100644 Extension/src/Utility/Eventing/interfaces.ts create mode 100644 Extension/src/Utility/Eventing/names.ts create mode 100644 Extension/src/Utility/Filesystem/filepath.ts create mode 100644 Extension/src/Utility/Filesystem/find.ts create mode 100644 Extension/src/Utility/Filesystem/ripgrep.ts create mode 100644 Extension/src/Utility/Process/commandLine.ts create mode 100644 Extension/src/Utility/Process/process.ts create mode 100644 Extension/src/Utility/Process/program.ts create mode 100644 Extension/src/Utility/Process/streams.ts create mode 100644 Extension/src/Utility/Sandbox/interfaces.ts create mode 100644 Extension/src/Utility/Sandbox/sandbox.ts create mode 100644 Extension/src/Utility/System/array.ts create mode 100644 Extension/src/Utility/System/assertions.ts create mode 100644 Extension/src/Utility/System/environment.ts create mode 100644 Extension/src/Utility/System/finalize.ts create mode 100644 Extension/src/Utility/System/garbageCollector.ts create mode 100644 Extension/src/Utility/System/info.ts create mode 100644 Extension/src/Utility/System/json.ts create mode 100644 Extension/src/Utility/System/map.ts create mode 100644 Extension/src/Utility/Text/characterCodes.ts create mode 100644 Extension/src/Utility/Text/identifiers.ts create mode 100644 Extension/src/Utility/Text/scanner.ts create mode 100644 Extension/src/Utility/Text/streams.ts create mode 100644 Extension/src/Utility/Text/taggedLiteral.ts delete mode 100644 Extension/test/.eslintrc.js create mode 100644 Extension/test/common/internal.ts create mode 100644 Extension/test/common/selectTests.ts rename Extension/test/{integrationTests => common}/testHelpers.ts (85%) delete mode 100644 Extension/test/integrationTests/IntelliSenseFeatures/index.ts delete mode 100644 Extension/test/integrationTests/IntelliSenseFeatures/runTest.ts delete mode 100644 Extension/test/integrationTests/MockDebugger/debugAdapterDescriptorFactory.ts delete mode 100644 Extension/test/integrationTests/MockDebugger/mockDebugSession.ts delete mode 100644 Extension/test/integrationTests/debug/index.ts delete mode 100644 Extension/test/integrationTests/debug/runTest.ts delete mode 100644 Extension/test/integrationTests/languageServer/index.ts delete mode 100644 Extension/test/integrationTests/languageServer/runTest.ts rename Extension/test/{integrationTests/debug => scenarios/Debugger/tests}/integration.test.ts (91%) create mode 100644 Extension/test/scenarios/MultiRootProjects/assets/project_A/documentSymbols/levelOneFolder/levelOneFile.cpp create mode 100644 Extension/test/scenarios/MultiRootProjects/assets/project_A/documentSymbols/levelOneFolder/levelOneFile.h create mode 100644 Extension/test/scenarios/MultiRootProjects/assets/project_A/documentSymbols/levelOneFolder/levelTwoFolder/levelTwoFile.cpp create mode 100644 Extension/test/scenarios/MultiRootProjects/assets/project_A/documentSymbols/levelOneFolder/levelTwoFolder/levelTwoFile.h create mode 100644 Extension/test/scenarios/MultiRootProjects/assets/project_A/main.cpp create mode 100644 Extension/test/scenarios/MultiRootProjects/assets/project_A/project_subfolder_H/documentSymbols/levelOneFolder/levelOneFile.cpp create mode 100644 Extension/test/scenarios/MultiRootProjects/assets/project_A/project_subfolder_H/documentSymbols/levelOneFolder/levelOneFile.h create mode 100644 Extension/test/scenarios/MultiRootProjects/assets/project_A/project_subfolder_H/documentSymbols/levelOneFolder/levelTwoFolder/levelTwoFile.cpp create mode 100644 Extension/test/scenarios/MultiRootProjects/assets/project_A/project_subfolder_H/documentSymbols/levelOneFolder/levelTwoFolder/levelTwoFile.h create mode 100644 Extension/test/scenarios/MultiRootProjects/assets/project_A/project_subfolder_H/main.cpp create mode 100644 Extension/test/scenarios/MultiRootProjects/assets/project_A/project_subfolder_H/quickInfo.cpp create mode 100644 Extension/test/scenarios/MultiRootProjects/assets/project_A/project_subfolder_H/references.cpp create mode 100644 Extension/test/scenarios/MultiRootProjects/assets/project_A/project_subfolder_H/references.h create mode 100644 Extension/test/scenarios/MultiRootProjects/assets/project_A/project_subfolder_H/semantic_colorization.cpp create mode 100644 Extension/test/scenarios/MultiRootProjects/assets/project_A/project_subfolder_H/testIdl.idl create mode 100644 Extension/test/scenarios/MultiRootProjects/assets/project_A/quickInfo.cpp create mode 100644 Extension/test/scenarios/MultiRootProjects/assets/project_A/references.cpp create mode 100644 Extension/test/scenarios/MultiRootProjects/assets/project_A/references.h create mode 100644 Extension/test/scenarios/MultiRootProjects/assets/project_A/semantic_colorization.cpp create mode 100644 Extension/test/scenarios/MultiRootProjects/assets/project_A/testIdl.idl create mode 100644 Extension/test/scenarios/MultiRootProjects/assets/project_B/documentSymbols/levelOneFolder/levelOneFile.cpp create mode 100644 Extension/test/scenarios/MultiRootProjects/assets/project_B/documentSymbols/levelOneFolder/levelOneFile.h create mode 100644 Extension/test/scenarios/MultiRootProjects/assets/project_B/documentSymbols/levelOneFolder/levelTwoFolder/levelTwoFile.cpp create mode 100644 Extension/test/scenarios/MultiRootProjects/assets/project_B/documentSymbols/levelOneFolder/levelTwoFolder/levelTwoFile.h create mode 100644 Extension/test/scenarios/MultiRootProjects/assets/project_B/main.cpp create mode 100644 Extension/test/scenarios/MultiRootProjects/assets/project_B/quickInfo.cpp create mode 100644 Extension/test/scenarios/MultiRootProjects/assets/project_B/references.cpp create mode 100644 Extension/test/scenarios/MultiRootProjects/assets/project_B/references.h create mode 100644 Extension/test/scenarios/MultiRootProjects/assets/project_B/semantic_colorization.cpp create mode 100644 Extension/test/scenarios/MultiRootProjects/assets/project_B/testIdl.idl create mode 100644 Extension/test/scenarios/MultiRootProjects/assets/project_C/documentSymbols/levelOneFolder/levelOneFile.cpp create mode 100644 Extension/test/scenarios/MultiRootProjects/assets/project_C/documentSymbols/levelOneFolder/levelOneFile.h create mode 100644 Extension/test/scenarios/MultiRootProjects/assets/project_C/documentSymbols/levelOneFolder/levelTwoFolder/levelTwoFile.cpp create mode 100644 Extension/test/scenarios/MultiRootProjects/assets/project_C/documentSymbols/levelOneFolder/levelTwoFolder/levelTwoFile.h create mode 100644 Extension/test/scenarios/MultiRootProjects/assets/project_C/main.cpp create mode 100644 Extension/test/scenarios/MultiRootProjects/assets/project_C/quickInfo.cpp create mode 100644 Extension/test/scenarios/MultiRootProjects/assets/project_C/references.cpp create mode 100644 Extension/test/scenarios/MultiRootProjects/assets/project_C/references.h create mode 100644 Extension/test/scenarios/MultiRootProjects/assets/project_C/semantic_colorization.cpp create mode 100644 Extension/test/scenarios/MultiRootProjects/assets/project_C/testIdl.idl create mode 100644 Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/.vscode/c_cpp_properties.json create mode 100644 Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/code_folding.cpp create mode 100644 Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/documentSymbols/levelOneFolder/levelOneFile.cpp create mode 100644 Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/documentSymbols/levelOneFolder/levelOneFile.h create mode 100644 Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/documentSymbols/levelOneFolder/levelTwoFolder/levelTwoFile.cpp create mode 100644 Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/documentSymbols/levelOneFolder/levelTwoFolder/levelTwoFile.h create mode 100644 Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/doxygen.cpp create mode 100644 Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/doxygen_generation.cpp create mode 100644 Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/inlay_hints.cpp create mode 100644 Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/main.cpp create mode 100644 Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/quickInfo.cpp create mode 100644 Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/references.cpp create mode 100644 Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/references.h create mode 100644 Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/semantic_colorization.cpp create mode 100644 Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/testIdl.idl create mode 100644 Extension/test/scenarios/MultirootDeadlockTest/assets/sub1/.vscode/c_cpp_properties.json create mode 100644 Extension/test/scenarios/MultirootDeadlockTest/assets/sub1/sub2/test.cpp create mode 100644 Extension/test/scenarios/MultirootDeadlockTest/assets/test.code-workspace rename Extension/test/{integrationTests/IntelliSenseFeatures => scenarios/MultirootDeadlockTest/tests}/inlayhints.test.ts (93%) rename Extension/test/{integrationTests/IntelliSenseFeatures => scenarios/MultirootDeadlockTest/tests}/quickInfo.test.ts (68%) rename Extension/test/{integrationTests/IntelliSenseFeatures => scenarios/MultirootDeadlockTest/tests}/reference.test.ts (84%) create mode 100644 Extension/test/scenarios/NoWorkspace/assets/open_file.cpp rename Extension/test/{integrationTests/testAssets/SimpleCppProject => scenarios/SimpleCppProject/assets}/.gitignore (100%) rename Extension/test/{integrationTests/testAssets/SimpleCppProject => scenarios/SimpleCppProject/assets}/.vscode/launch.json (100%) rename Extension/test/{integrationTests/testAssets/SimpleCppProject => scenarios/SimpleCppProject/assets}/.vscode/tasks.json (100%) rename Extension/test/{integrationTests/testAssets/SimpleCppProject => scenarios/SimpleCppProject/assets}/main.cpp (100%) rename Extension/test/{integrationTests/testAssets/SimpleCppProject => scenarios/SimpleCppProject/assets}/main1.cpp (100%) rename Extension/test/{integrationTests/testAssets/SimpleCppProject => scenarios/SimpleCppProject/assets}/main2.cpp (100%) rename Extension/test/{integrationTests/testAssets/SimpleCppProject => scenarios/SimpleCppProject/assets}/main3.cpp (100%) rename Extension/test/{integrationTests/testAssets/SimpleCppProject => scenarios/SimpleCppProject/assets}/simpleCppProject.code-workspace (100%) rename Extension/test/{integrationTests/languageServer => scenarios/SimpleCppProject/tests}/languageServer.integration.test.ts (89%) create mode 100644 Extension/test/scenarios/SingleRootProject/assets/call_hierarchy/call_test1.cpp create mode 100644 Extension/test/scenarios/SingleRootProject/assets/call_hierarchy/call_test1.h create mode 100644 Extension/test/scenarios/SingleRootProject/assets/call_hierarchy/call_test2.cpp create mode 100644 Extension/test/scenarios/SingleRootProject/assets/code_folding.cpp create mode 100644 Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Auto.cpp create mode 100644 Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/C_File.c create mode 100644 Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Class.cpp create mode 100644 Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Class.h create mode 100644 Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/ClassConstructor.cpp create mode 100644 Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/FunctionTypes.cpp create mode 100644 Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Global.cpp create mode 100644 Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Global.h create mode 100644 Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Inline.h create mode 100644 Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/LightBulb.cpp create mode 100644 Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Multi.cpp create mode 100644 Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Multi.h create mode 100644 Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/MultiNamespace.cpp create mode 100644 Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Namespace.cpp create mode 100644 Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Namespace.h create mode 100644 Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/NamespaceOther.h create mode 100644 Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/NotInProject.h create mode 100644 Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Scope.cpp create mode 100644 Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Scope.h create mode 100644 Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Templates.cpp create mode 100644 Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/cdd_test1.cpp create mode 100644 Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/cdd_test1.h create mode 100644 Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/cdd_test2.h create mode 100644 Extension/test/scenarios/SingleRootProject/assets/documentSymbols/levelOneFolder/levelOneFile.cpp create mode 100644 Extension/test/scenarios/SingleRootProject/assets/documentSymbols/levelOneFolder/levelOneFile.h create mode 100644 Extension/test/scenarios/SingleRootProject/assets/documentSymbols/levelOneFolder/levelTwoFolder/levelTwoFile.cpp create mode 100644 Extension/test/scenarios/SingleRootProject/assets/documentSymbols/levelOneFolder/levelTwoFolder/levelTwoFile.h create mode 100644 Extension/test/scenarios/SingleRootProject/assets/doxygen.cpp create mode 100644 Extension/test/scenarios/SingleRootProject/assets/doxygen_generation.cpp create mode 100644 Extension/test/scenarios/SingleRootProject/assets/inlay_hints.cpp create mode 100644 Extension/test/scenarios/SingleRootProject/assets/main.cpp create mode 100644 Extension/test/scenarios/SingleRootProject/assets/quickInfo.cpp create mode 100644 Extension/test/scenarios/SingleRootProject/assets/references.cpp create mode 100644 Extension/test/scenarios/SingleRootProject/assets/references.h create mode 100644 Extension/test/scenarios/SingleRootProject/assets/semantic_colorization.cpp create mode 100644 Extension/test/scenarios/SingleRootProject/assets/testIdl.idl rename Extension/test/{unitTests => scenarios/SingleRootProject/tests}/ParsedEnvironmentFile.test.ts (83%) create mode 100644 Extension/test/scenarios/SingleRootProject/tests/common.test.ts rename Extension/test/{unitTests => scenarios/SingleRootProject/tests}/expand.test.ts (90%) rename Extension/test/{unitTests => scenarios/SingleRootProject/tests}/extension.test.ts (98%) create mode 100644 Extension/test/unit/async.test.ts create mode 100644 Extension/test/unit/asyncIterators.test.ts create mode 100644 Extension/test/unit/commandLineParsing.test.ts create mode 100644 Extension/test/unit/eventing.test.ts rename Extension/test/{internalUnitTests => unit}/example.test.ts (100%) create mode 100644 Extension/test/unit/examples/someclass.ts rename Extension/test/{internalUnitTests => unit}/manualPromise.test.ts (100%) create mode 100644 Extension/test/unit/parser.test.ts create mode 100644 Extension/test/unit/process.test.ts rename Extension/test/{internalUnitTests => unit}/signals.test.ts (100%) create mode 100644 Extension/test/unit/typeinfo.test.ts delete mode 100644 Extension/test/unitTests/common.test.ts delete mode 100644 Extension/test/unitTests/index.ts delete mode 100644 Extension/test/unitTests/runTest.ts delete mode 100644 Extension/tools/.eslintrc.js delete mode 100644 Extension/tools/prepublish.js delete mode 100644 Extension/tscCompileList.txt create mode 100644 Extension/ui.tsconfig.json delete mode 100644 Extension/ui/.eslintrc.js diff --git a/.github/workflows/ci_linux.yml b/.github/workflows/ci_linux.yml index 236d563855..f6efb06813 100644 --- a/.github/workflows/ci_linux.yml +++ b/.github/workflows/ci_linux.yml @@ -1,47 +1,47 @@ -name: CI (Linux) - -on: - push: - branches: [ main ] - pull_request: - branches: [ main ] - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v3 - - - name: Use Node.js 16 - uses: actions/setup-node@v3 - with: - node-version: 16 - - - name: Install Dependencies - run: yarn install - working-directory: Extension - - - name: Compile Sources - run: yarn run compile - working-directory: Extension - - - name: Run Linter - run: yarn run lint - working-directory: Extension - - - name: Compile Test Sources - run: yarn run pretest - working-directory: Extension - - - name: Run unit tests - uses: GabrielBB/xvfb-action@v1.6 - with: - run: yarn run unitTests - working-directory: Extension - -# - name: Run languageServer integration tests -# uses: GabrielBB/xvfb-action@v1.6 -# with: -# run: yarn run integrationTests -# working-directory: Extension +name: CI (Linux) + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + build: + runs-on: ubuntu-22.04 + + steps: + - uses: actions/checkout@v3 + + - name: Use Node.js 16 + uses: actions/setup-node@v3 + with: + node-version: 16 + + - name: Install Dependencies + run: yarn install + working-directory: Extension + + - name: Compile Sources + run: yarn run compile + working-directory: Extension + + - name: Run Linter + run: yarn run lint + working-directory: Extension + + - name: Run unit tests + run: yarn test + working-directory: Extension + + - name: Run simple vscode unit tests + uses: GabrielBB/xvfb-action@v1.6 + with: + run: yarn test --scenario=SingleRootProject + working-directory: Extension + +# - name: Run languageServer integration tests +# uses: GabrielBB/xvfb-action@v1.6 +# with: +# run: yarn run integrationTests +# working-directory: Extension diff --git a/.github/workflows/ci_mac.yml b/.github/workflows/ci_mac.yml index 94068f652a..268ad872a8 100644 --- a/.github/workflows/ci_mac.yml +++ b/.github/workflows/ci_mac.yml @@ -1,47 +1,47 @@ -name: CI (Mac) - -on: - push: - branches: [ main ] - pull_request: - branches: [ main ] - -jobs: - build: - runs-on: macos-latest - - steps: - - uses: actions/checkout@v3 - - - name: Use Node.js 16 - uses: actions/setup-node@v3 - with: - node-version: 16 - - - name: Install Dependencies - run: yarn install --network-timeout 100000 - working-directory: Extension - - - name: Compile Sources - run: yarn run compile - working-directory: Extension - - - name: Run Linter - run: yarn run lint - working-directory: Extension - - - name: Compile Test Sources - run: yarn run pretest - working-directory: Extension - - - name: Run unit tests - uses: GabrielBB/xvfb-action@v1.6 - with: - run: yarn run unitTests - working-directory: Extension - -# - name: Run languageServer integration tests -# uses: GabrielBB/xvfb-action@v1.6 -# with: -# run: yarn run integrationTests -# working-directory: Extension +name: CI (Mac) + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + build: + runs-on: macos-12 + + steps: + - uses: actions/checkout@v3 + + - name: Use Node.js 16 + uses: actions/setup-node@v3 + with: + node-version: 16 + + - name: Install Dependencies + run: yarn install --network-timeout 100000 + working-directory: Extension + + - name: Compile Sources + run: yarn run compile + working-directory: Extension + + - name: Run Linter + run: yarn run lint + working-directory: Extension + + - name: Run unit tests + run: yarn test + working-directory: Extension + + - name: Run simple vscode unit tests + uses: GabrielBB/xvfb-action@v1.6 + with: + run: yarn test --scenario=SingleRootProject + working-directory: Extension + +# - name: Run languageServer integration tests +# uses: GabrielBB/xvfb-action@v1.6 +# with: +# run: yarn run integrationTests +# working-directory: Extension diff --git a/.github/workflows/ci_windows.yml b/.github/workflows/ci_windows.yml index 0f3d5fa535..7bc07e4ccf 100644 --- a/.github/workflows/ci_windows.yml +++ b/.github/workflows/ci_windows.yml @@ -1,43 +1,43 @@ -name: CI (Windows) - -on: - push: - branches: [ main ] - pull_request: - branches: [ main ] - -jobs: - build: - runs-on: windows-latest - - steps: - - uses: actions/checkout@v3 - - - name: Use Node.js 16 - uses: actions/setup-node@v3 - with: - node-version: 16 - - - name: Install Dependencies - run: yarn install - working-directory: Extension - - - name: Compile Sources - run: yarn run compile - working-directory: Extension - - - name: Run Linter - run: yarn run lint - working-directory: Extension - - - name: Compile Test Sources - run: yarn run pretest - working-directory: Extension - - - name: Run unit tests - run: yarn run unitTests - working-directory: Extension - -# - name: Run languageServer integration tests -# run: yarn run integrationTests -# working-directory: Extension +name: CI (Windows) + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + build: + runs-on: windows-2022 + + steps: + - uses: actions/checkout@v3 + + - name: Use Node.js 16 + uses: actions/setup-node@v3 + with: + node-version: 16 + + - name: Install Dependencies + run: yarn install + working-directory: Extension + + - name: Compile Sources + run: yarn run compile + working-directory: Extension + + - name: Run Linter + run: yarn run lint + working-directory: Extension + + - name: Run unit tests + run: yarn test + working-directory: Extension + + - name: Run simple vscode unit tests + run: yarn test --scenario=SingleRootProject + working-directory: Extension + +# - name: Run languageServer integration tests +# run: yarn run integrationTests +# working-directory: Extension diff --git a/Extension/.eslintignore b/Extension/.eslintignore index 9efcacb852..37c9042eb4 100644 --- a/Extension/.eslintignore +++ b/Extension/.eslintignore @@ -1,5 +1,4 @@ *.js -test/**/index.ts -test/**/runTest.ts -tools/prepublish.js + +dist/ vscode*.d.ts diff --git a/Extension/.eslintrc.js b/Extension/.eslintrc.js index 49084067f2..3e74a06850 100644 --- a/Extension/.eslintrc.js +++ b/Extension/.eslintrc.js @@ -11,7 +11,7 @@ module.exports = { }, "parser": "@typescript-eslint/parser", "parserOptions": { - "project": "tsconfig.json", + "project": ["tsconfig.json", ".scripts/tsconfig.json"], "ecmaVersion": 2022, "sourceType": "module", "warnOnUnsupportedTypeScriptVersion": false, @@ -64,6 +64,8 @@ module.exports = { "no-floating-decimal": "error", "keyword-spacing": ["error", { "before": true, "overrides": { "this": { "before": false } } }], "arrow-spacing": ["error", { "before": true, "after": true }], + "semi-spacing": ["error", { "before": false, "after": true }], + "no-extra-parens": ["error", "all", { "nestedBinaryExpressions": false, "ternaryOperandBinaryExpressions": false }], "@typescript-eslint/no-for-in-array": "error", "@typescript-eslint/no-misused-new": "error", "@typescript-eslint/no-misused-promises": "error", @@ -82,6 +84,7 @@ module.exports = { "@typescript-eslint/unified-signatures": "error", "@typescript-eslint/no-floating-promises": "error", "@typescript-eslint/method-signature-style": ["error", "method"], + "@typescript-eslint/space-infix-ops": "error", "no-unused-vars": "off", "@typescript-eslint/no-unused-vars": ["error", { "argsIgnorePattern": "^_" }], "@typescript-eslint/no-unnecessary-boolean-literal-compare": "error", @@ -110,12 +113,14 @@ module.exports = { "no-fallthrough": "error", "no-invalid-this": "error", "no-irregular-whitespace": "error", + "rest-spread-spacing": ["error", "never"], "no-multiple-empty-lines": ["error", { "max": 1, "maxEOF": 1, "maxBOF": 0 }], "no-new-wrappers": "error", "no-return-await": "error", "no-sequences": "error", "no-sparse-arrays": "error", "no-trailing-spaces": "error", + "no-multi-spaces": "error", "no-undef-init": "error", "no-unsafe-finally": "error", "no-unused-expressions": "error", diff --git a/Extension/.gitignore b/Extension/.gitignore index 3126fe08bf..1adad30d07 100644 --- a/Extension/.gitignore +++ b/Extension/.gitignore @@ -34,3 +34,4 @@ localized_string_ids.h src/nativeStrings.ts vscode*.d.ts +.scripts/_* diff --git a/Extension/.scripts/clean.ts b/Extension/.scripts/clean.ts new file mode 100644 index 0000000000..9d3ac258e6 --- /dev/null +++ b/Extension/.scripts/clean.ts @@ -0,0 +1,64 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +import { error } from 'node:console'; +import { resolve, sep } from 'node:path'; +import { filepath } from '../src/Utility/Filesystem/filepath'; +import { verbose } from '../src/Utility/Text/streams'; +import { $root, Git, brightGreen, cyan, getModifiedIgnoredFiles, rimraf } from './common'; + +// notes: +// list all gitignore'd files that are modified: `git clean -Xd -n` +// list all untracked and ignored files that are modified/created: `git clean -Xd -n` + +export async function main() { + await rimraf(resolve($root, 'dist')); +} + +export async function all() { + await rimraf(...(await getModifiedIgnoredFiles()).filter(each => !each.includes('node_modules'))); +} + +export async function reset() { + verbose(`Resetting all .gitignored files in extension`); + await rimraf(...await getModifiedIgnoredFiles()); +} + +async function details(files: string[]) { + let all = await Promise.all(files.filter(each => each).map(async (each) => { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const [filename, stats ] = await filepath.stats(each); + return { + filename: stats.isDirectory() ? cyan(`${each}${sep}**`) : brightGreen(`${each}`), + date: stats.mtime.toLocaleDateString().replace(/\b(\d)\//g, '0$1\/'), + time: stats.mtime.toLocaleTimeString().replace(/^(\d)\:/g, '0$1:'), + modified: stats.mtime + }; + })); + all = all.sort((a, b) => a.modified.getTime() - b.modified.getTime()); + // print a formatted table so the date and time are aligned + const max = all.reduce((max, each) => Math.max(max, each.filename.length), 0); + all.forEach(each => console.log(` ${each.filename.padEnd(max)} [${each.date} ${each.time}]`)); + console.log(''); +} + +export async function show(opt?: string) { + switch (opt?.toLowerCase()) { + case 'new': + console.log(cyan('\n\nNew files:')); + const r = await Git('ls-files', '--others', '--exclude-standard', '-z'); + return details(r.stdio.all().map(each => resolve(each.trim().replace(/\0/g, '')))); + + case undefined: + case '': + case 'ignored': + case 'untracked': + console.log(cyan('\n\nUntracked+Ignored files:')); + return details(await getModifiedIgnoredFiles()); + + default: + return error(`Unknown option '${opt}'`); + } +} diff --git a/Extension/.scripts/code.ts b/Extension/.scripts/code.ts new file mode 100644 index 0000000000..6d222b64a5 --- /dev/null +++ b/Extension/.scripts/code.ts @@ -0,0 +1,40 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +import { spawnSync } from 'child_process'; +import { verbose } from '../src/Utility/Text/streams'; +import { $args, $root, $scenario, brightGreen, checkFile, gray, green, pwd } from './common'; + +import { resolve } from 'path'; +import { getTestInfo } from '../test/common/selectTests'; +import { install, options } from "./vscode"; + +export { install, reset } from './vscode'; + +export async function main() { + let ti = await getTestInfo($scenario); + if (!ti) { + // try using the first arg as a scenario name or location + ti = await getTestInfo($args[0], $args[0] ? resolve(pwd, $args[0]) : undefined); + if (ti) { + $args[0] = ti.workspace; + } + } else { + // we found it + $args.unshift(ti.workspace); + } + await checkFile('dist/src/main.js', `The extension entry point '${$root}/dist/src/main.js is missing. You should run ${brightGreen("yarn compile")}\n\n`); + + const { cli, args } = await install(); + + // example of installing an extension into code + //verbose(`Installing release version of 'ms-vscode.cpptools'`); + //spawnSync(cli, [...args, '--install-extension', 'ms-vscode.cpptools'], { encoding: 'utf-8', stdio: 'ignore' }) + verbose(green('Launch VSCode')); + const ARGS = [...args, ...options.launchArgs.filter(each => !each.startsWith('--extensions-dir=') && !each.startsWith('--user-data-dir=')), `--extensionDevelopmentPath=${$root}`, ...$args ]; + verbose(gray(`${cli}\n ${ [...ARGS ].join('\n ')}`)); + + spawnSync(cli, ARGS, { encoding: 'utf-8', stdio: 'ignore', env: { ...process.env, DONT_PROMPT_WSL_INSTALL:"1" } }); +} diff --git a/Extension/.scripts/common.ts b/Extension/.scripts/common.ts new file mode 100644 index 0000000000..c3be3b6d69 --- /dev/null +++ b/Extension/.scripts/common.ts @@ -0,0 +1,290 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +import { Command, CommandFunction } from '../src/Utility/Process/program'; + +import { ok } from 'assert'; +import { CommentJSONValue, parse, stringify } from 'comment-json'; +import { mkdir as md, readFile, rm, writeFile } from 'fs/promises'; +import { IOptions, glob as globSync } from 'glob'; +import { dirname, resolve } from 'path'; +import { chdir, cwd, env } from 'process'; +import { setImmediate } from 'timers/promises'; +import { promisify } from 'util'; +import { filepath } from '../src/Utility/Filesystem/filepath'; +import { is } from '../src/Utility/System/guards'; +import { verbose } from '../src/Utility/Text/streams'; + +export const $root = resolve(`${__dirname}/..`); +export let $cmd = 'main'; +export let $scenario = ''; + +// loop through the args and pick out --scenario=... and remove it from the $args and set $scenario +export const $args = process.argv.slice(2).filter(each => !(each.startsWith('--scenario=') && ($scenario = each.substring('--scenario='.length)))); + +/** enqueue the call to the callback function to happen on the next available tick, and return a promise to the result */ +export function then(callback: () => Promise | T): Promise { + return setImmediate().then(callback); +} + +export const pwd = env.INIT_CWD ?? cwd(); +verbose(yellow(`pwd: ${pwd}`)); + +// ensure we're in the extension folder. +chdir($root); + +// dump unhandled async errors to the console and exit. +process.on('unhandledRejection', (reason: any, _promise) => { + error(`${reason?.stack?.split(/\r?\n/).filter(l => !l.includes('node:internal') && !l.includes('node_modules')).join('\n')}`); + process.exit(1); +}); + +const git = new Command('git'); +export const Git = async (...args: Parameters>) => (await git)(...args); +export const GitClean = async (...args: Parameters>) => (await new Command(await git, 'clean'))(...args); + +export async function getModifiedIgnoredFiles() { + const {code, error, stdio } = await GitClean('-Xd', '-n'); + if (code) { + throw new Error(`\n${error.all().join('\n')}`); + } + + // return the full path of files that would be removed. + return Promise.all(stdio.filter("Would remove").map((s) => filepath.exists(s.replace(/^Would remove /, ''), $root)).filter(p => p)); +} + +export async function rimraf(...paths: string[]) { + const all = []; + for (const each of paths) { + if (!each) { + continue; + } + if (await filepath.isFolder(each)) { + verbose(`Removing folder ${red(each)}`); + all.push(rm(each, {recursive: true, force: true})); + continue; + } + verbose(`Removing file ${red(each)}`); + all.push(rm(each, {force: true})); + } + await Promise.all(all); +} + +export async function mkdir(filePath: string) { + const [fullPath, info] = await filepath.stats(filePath, $root); + if (info) { + if (info.isDirectory()) { + return fullPath; + } + throw new Error(`Cannot create directory '${filePath}' because there is a file there.`); + } + + await md(fullPath, { recursive: true }); + return fullPath; +} + +export const glob: (pattern: string, options?: IOptions) => Promise = promisify(globSync); + +export async function write(filePath: string, data: Buffer | string) { + await mkdir(dirname(filePath)); + + if (await filepath.isFile(filePath)) { + const content = await readFile(filePath); + if (is.string(data)) { + // if we're passed a text file, we should match the line endings of the existing file. + const textContent = content.toString(); + + // normalize the line endings to the same as the current file. + data = textContent.indexOf('\r\n') > -1 ? data.replace(/\r\n|\n/g, '\r\n') : data.replace(/\r\n|\n/g, '\n'); + + // if the text content is a match, we don't have to change anything + if (textContent === data) { + verbose(`Text file at '${filePath}' is up to date.`); + return; + } + } else { + // if the binary content is a match, we don't have to change anything + if (content.equals(data)) { + verbose(`File at '${filePath}' is up to date.`); + return; + } + } + } + + verbose(`Writing file '${filePath}'`); + await writeFile(filePath, data); +} + +export async function updateFiles(files: string[], dest: string | Promise) { + const target = is.promise(dest) ? await dest : dest; + await Promise.all(files.map(async (each) => { + const sourceFile = await filepath.isFile(each, $root); + if (sourceFile) { + const targetFile = resolve(target, each); + await write(targetFile, await readFile(sourceFile)); + } + })); +} + +export async function go() { + if (require.main) { + // loop through the args and pick out the first non --arg and remove it from the $args and set $cmd + for (let i = 0; i < $args.length; i++) { + const each = $args[i]; + if (!each.startsWith('--') && require.main.exports[each]) { + $cmd = each; + $args.splice(i, 1); + break; + } + } + + verbose(`${yellow("Running task:")} ${green($cmd)} ${green($args.join(' '))}`); + require.main.exports[$cmd](...$args); + } +} +void then(go); + +export async function read(filename: string) { + const content = await readFile(filename); + ok(content, `File '${filename}' has no content`); + return content.toString(); +} + +export async function readJson(filename: string, fallback?: {}): Promise { + try { + return parse(await read(filename)); + } catch { + return fallback as CommentJSONValue; + } +} + +export async function writeJson(filename: string, object: CommentJSONValue) { + await write(filename, stringify(object, null, 4)); +} + +export function error(text: string) { + console.error(`\n${red('ERROR')}: ${text}`); +} + +export function warn(text: string) { + console.error(`\n${yellow('WARNING')}: ${text}`); +} + +export function note(text: string) { + console.error(`\n${cyan('NOTE')}: ${text}`); +} + +export function underline(text: string) { + return `\u001b[4m${text}\u001b[0m`; +} + +export function bold(text: string) { + return `\u001b[1m${text}\u001b[0m`; +} + +export function dim(text: string) { + return `\u001b[2m${text}\u001b[0m`; +} + +export function brightGreen(text: string) { + return `\u001b[38;2;19;161;14m${text}\u001b[0m`; +} + +export function green(text: string) { + return `\u001b[38;2;78;154;6m${text}\u001b[0m`; +} + +export function brightWhite(text: string) { + return `\u001b[38;2;238;238;236m${text}\u001b[0m`; +} + +export function gray(text: string) { + return `\u001b[38;2;117;113;94m${text}\u001b[0m`; +} + +export function yellow(text: string) { + return `\u001b[38;2;252;233;79m${text}\u001b[0m`; +} + +export function red(text: string) { + return `\u001b[38;2;197;15;31m${text}\u001b[0m`; +} + +export function cyan(text: string) { + return `\u001b[38;2;0;174;239m${text}\u001b[0m`; +} + +export const hr = "==============================================================================="; + +export function heading(text: string, level = 1) { + switch (level) { + case 1: + return `${underline(bold(text))}`; + case 2: + return `${brightGreen(text)}`; + case 3: + return `${green(text)}`; + } + return `${bold(text)}\n`; +} + +export function optional(text: string) { + return gray(text); +} + +export function cmdSwitch(text: string) { + return optional(`--${text}`); +} + +export function command(text: string) { + return brightWhite(bold(text)); +} + +export function hint(text: string) { + return green(dim(text)); +} + +export function count(num: number) { + return gray(`${num}`); +} + +export function position(text: string) { + return gray(`${text}`); +} + +export async function checkFolder(folder: string | string[], errMsg: string){ + for (const each of is.array(folder) ? folder : [folder]) { + const result = await filepath.isFolder(each, $root); + if (result) { + return result; + } + } + error(errMsg); + process.exit(1); +} + +export async function checkFile(file: string | string[], errMsg: string){ + for (const each of is.array(file) ? file : [file]) { + const result = await filepath.isFile(each, $root); + if (result) { + return result; + } + } + error(errMsg); + process.exit(1); +} + +export async function checkPrep() { + await checkFolder('dist/walkthrough', `The walkthrough files are not in place. You should run ${brightGreen("yarn prep")}\n\n`); + await checkFolder('dist/html', `The html files are not in place. You should run ${brightGreen("yarn prep")}\n\n`); + await checkFolder('dist/schema', `The html files are not in place. You should run ${brightGreen("yarn prep")}\n\n`); + await checkFile('dist/nls.metadata.json', `The extension translation file '${$root}/dist/nls.metadata.json is missing. You should run ${brightGreen("yarn prep")}\n\n`); + verbose('Prep files appear to be in place.'); +} + +export async function checkCompiled() { + await checkFile('dist/src/main.js', `The extension entry point '${$root}/dist/src/main.js is missing. You should run ${brightGreen("yarn compile")}\n\n`); + verbose('Compiled files appear to be in place.'); +} diff --git a/Extension/.scripts/copyWalkthruMedia.ts b/Extension/.scripts/copyWalkthruMedia.ts new file mode 100644 index 0000000000..e2b18823d7 --- /dev/null +++ b/Extension/.scripts/copyWalkthruMedia.ts @@ -0,0 +1,28 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +import { watch as watchFiles } from 'fs/promises'; +import { filepath } from '../src/Utility/Filesystem/filepath'; +import { verbose } from '../src/Utility/Text/streams'; +import { $root, glob, mkdir, updateFiles } from './common'; + +export async function main() { + verbose(`Copying walkthrough media to extension/dist folder`); + await updateFiles(await glob('walkthrough/images/**/*'), mkdir('dist')); +} + +export async function watch() { + const source = await filepath.isFolder('walkthrough/images', $root); + if (source) { + verbose(`Watching ${source} folder for changes.`); + console.log('Press Ctrl+C to exit.'); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + for await (const event of watchFiles(source, {recursive: true })) { + await main(); + } + } + +} + diff --git a/Extension/.scripts/generateNativeStrings.ts b/Extension/.scripts/generateNativeStrings.ts new file mode 100644 index 0000000000..cb70d380da --- /dev/null +++ b/Extension/.scripts/generateNativeStrings.ts @@ -0,0 +1,134 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +import { parse } from 'comment-json'; +import { resolve } from 'path'; +import { read, write } from './common'; + +// **************************** +// Command: generate-native-strings +// The following is used to generate nativeStrings.ts and localized_string_ids.h from ./src/nativeStrings.json +// If adding localized strings to the native side, start by adding it to nativeStrings.json and use this to generate the others. +// **************************** +export async function main() { + const $root = resolve(`${__dirname}/..`); + const stringTable = parse(await read(`${$root}/src/nativeStrings.json`)) as any; + + let nativeEnumContent = ""; + let nativeStringTableContent = ""; + let typeScriptSwitchContent = ""; + + let stringIndex = 1; + for (const property in stringTable) { + let stringValue = stringTable[property]; + let hintValue; + if (typeof stringValue !== "string") { + hintValue = stringValue.hint; + stringValue = stringValue.text; + } + + // Add to native enum + nativeEnumContent += ` ${property} = ${stringIndex},\n`; + + // Add to native string table + nativeStringTableContent += ` ${JSON.stringify(stringValue)},\n`; + + // Add to TypeScript switch + // Skip empty strings, which can be used to prevent enum/index reordering + if (stringValue !== "") { + // It's possible that a translation may skip "{#}" entries, so check for up to 50 of them. + let numArgs = 0; + for (let i = 0; i < 50; i++) { + if (stringValue.includes(`{${i}}`)) { + numArgs = i + 1; + } + } + typeScriptSwitchContent += ` case ${stringIndex}:\n`; + if (numArgs !== 0) { + typeScriptSwitchContent += ` if (stringArgs) {\n`; + if (hintValue) { + typeScriptSwitchContent += ` message = localize({ key: ${JSON.stringify(property)}, comment: [${JSON.stringify(hintValue)}] }, ${JSON.stringify(stringValue)}`; + } else { + typeScriptSwitchContent += ` message = localize(${JSON.stringify(property)}, ${JSON.stringify(stringValue)}`; + } + for (let i = 0; i < numArgs; i++) { + typeScriptSwitchContent += `, stringArgs[${i}]`; + } + typeScriptSwitchContent += `);\n break;\n }\n`; + } + if (hintValue) { + typeScriptSwitchContent += ` message = localize({ key: ${JSON.stringify(property)}, comment: [${JSON.stringify(hintValue)}] }, ${JSON.stringify(stringValue)}`; + } else { + typeScriptSwitchContent += ` message = localize(${JSON.stringify(property)}, ${JSON.stringify(stringValue)}`; + } + typeScriptSwitchContent += `);\n break;\n`; + } + ++stringIndex; + } + + // -------------------------------------------------------------------------------------------- + // Generate the TypeScript file + // -------------------------------------------------------------------------------------------- + + const typeScriptContent = `/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +// ****** This file is generated from nativeStrings.json. Do not edit this file directly. ****** + +'use strict'; + +import * as nls from 'vscode-nls'; + +nls.config({ messageFormat: nls.MessageFormat.bundle, bundleFormat: nls.BundleFormat.standalone })(); +const localize: nls.LocalizeFunc = nls.loadMessageBundle(); + +export const localizedStringCount: number = ${stringIndex}; + +export function lookupString(stringId: number, stringArgs?: string[]): string { + let message: string = ""; + switch (stringId) { + case 0: + // Special case for blank string + break; +${typeScriptSwitchContent} + default: + console.assert(\"Unrecognized string ID\"); + break; + } + return message; +} +`; + + // If the file isn't there, or the contents are different, write it out + await write(`${$root}/src/nativeStrings.ts`, typeScriptContent); + + // -------------------------------------------------------------------------------------------- + // Generate the native string header file + // -------------------------------------------------------------------------------------------- + const nativeContents = `/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +// ****** This file is generated from nativeStrings.json. Do not edit this file directly. ****** + +#pragma once +// NOLINTBEGIN(modernize-raw-string-literal) +enum class localized_string_id : unsigned int +{ + blank = 0, +${nativeEnumContent}}; + +inline static const char *localizable_strings[] = { + "", +${nativeStringTableContent}}; +// NOLINTEND(modernize-raw-string-literal) +`; + + // If the file isn't there, or the contents are different, write it out + await write(`${$root}/localized_string_ids.h`, nativeContents); +} diff --git a/Extension/tools/GenerateOptionsSchema.ts b/Extension/.scripts/generateOptionsSchema.ts similarity index 90% rename from Extension/tools/GenerateOptionsSchema.ts rename to Extension/.scripts/generateOptionsSchema.ts index 8702cc7174..8200761b27 100644 --- a/Extension/tools/GenerateOptionsSchema.ts +++ b/Extension/.scripts/generateOptionsSchema.ts @@ -5,8 +5,8 @@ /* eslint-disable no-prototype-builtins */ -import * as fs from 'fs'; -import * as os from 'os'; +import { resolve } from 'path'; +import { $root, read, write } from './common'; function appendFieldsToObject(reference: any, obj: any): any { // Make sure it is an object type @@ -116,10 +116,10 @@ function mergeReferences(baseDefinitions: any, additionalDefinitions: any): void } } -function generateOptionsSchema(): void { - const packageJSON: any = JSON.parse(fs.readFileSync('package.json').toString()); - const schemaJSON: any = JSON.parse(fs.readFileSync('tools/OptionsSchema.json').toString()); - const symbolSettingsJSON: any = JSON.parse(fs.readFileSync('tools/VSSymbolSettings.json').toString()); +export async function main() { + const packageJSON: any = JSON.parse(await read(resolve($root, 'package.json'))); + const schemaJSON: any = JSON.parse(await read(resolve($root, 'tools/OptionsSchema.json'))); + const symbolSettingsJSON: any = JSON.parse(await read(resolve($root, 'tools/VSSymbolSettings.json'))); mergeReferences(schemaJSON.definitions, symbolSettingsJSON.definitions); @@ -135,15 +135,10 @@ function generateOptionsSchema(): void { packageJSON.contributes.debuggers[1].configurationAttributes.attach = schemaJSON.definitions.CppvsdbgAttachOptions; let content: string = JSON.stringify(packageJSON, null, 4); - if (os.platform() === 'win32') { - content = content.replace(/\n/gm, "\r\n"); - } // We use '\u200b' (unicode zero-length space character) to break VS Code's URL detection regex for URLs that are examples. This process will // convert that from the readable espace sequence, to just an invisible character. Convert it back to the visible espace sequence. - content = content.replace(/\u200b/gm, "\\u200b"); + content = content.replace(/\u200b/gm, "\\u200b") + "\n"; - fs.writeFileSync('package.json', content); + await write('package.json', content); } - -generateOptionsSchema(); diff --git a/Extension/.scripts/import_edge_strings.ts b/Extension/.scripts/import_edge_strings.ts new file mode 100644 index 0000000000..73e094bd0b --- /dev/null +++ b/Extension/.scripts/import_edge_strings.ts @@ -0,0 +1,95 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ +import * as fs from "fs"; +import * as path from 'path'; +import { parseString } from 'xml2js'; +import { mkdir, write } from './common'; + +export async function main() { + + const localizeRepoPath = process.argv[2]; + const cpptoolsRepoPath = process.argv[3]; + + if (!localizeRepoPath || !cpptoolsRepoPath) { + console.error(`ERROR: Usage: ${path.parse(process.argv[0]).base} ${path.parse(process.argv[1]).base} `); + return; + } + + console.log("Importing EDGE strings from Localize repo: " + localizeRepoPath); + console.log("Writing to cpptools repo: " + cpptoolsRepoPath); + + if (!fs.existsSync(path.join(localizeRepoPath, ".git"))) { + console.error("ERROR: Localize repo submodule is not initialized in Localize repo"); + return; + } + + const languages = [ + { id: "zh-tw", folderName: "cht", transifexId: "zh-hant" }, + { id: "zh-cn", folderName: "chs", transifexId: "zh-hans" }, + { id: "fr", folderName: "fra" }, + { id: "de", folderName: "deu" }, + { id: "it", folderName: "ita" }, + { id: "es", folderName: "esn" }, + { id: "ja", folderName: "jpn" }, + { id: "ko", folderName: "kor" }, + { id: "ru", folderName: "rus" }, + { id: "bg", folderName: "bul" }, // VS Code supports Bulgarian, but VS is not currently localized for those languages. + { id: "hu", folderName: "hun" }, // VS Code supports Hungarian, but VS is not currently localized for those languages. + { id: "pt-br", folderName: "ptb", transifexId: "pt-BR" }, + { id: "tr", folderName: "trk" }, + { id: "cs", folderName: "csy" }, + { id: "pl", folderName: "plk" } + ]; + + const locFolderNames = fs.readdirSync(localizeRepoPath).filter(f => fs.lstatSync(path.join(localizeRepoPath, f)).isDirectory()); + for (const locFolderName of locFolderNames) { + const lclPath = path.join(localizeRepoPath, locFolderName, "vc/vc/cpfeui.dll.lcl"); + const languageInfo = languages.find(l => l.folderName === locFolderName); + if (!languageInfo) { + return; + } + const languageId = languageInfo.id; + const outputLanguageFolder = path.join(cpptoolsRepoPath, "Extension/bin/messages", languageId); + const outputPath = path.join(outputLanguageFolder, "messages.json"); + const sourceContent = fs.readFileSync(lclPath, 'utf-8'); + + // Scan once, just to determine how many there are the size of the array we need + let highestValue = 0; + parseString(sourceContent, function (err, result) { + result.LCX.Item.forEach((item) => { + if (item.$.ItemId === ";String Table") { + item.Item.forEach((subItem) => { + const itemId = parseInt(subItem.$.ItemId, 10); + if (subItem.Str[0].Tgt) { + if (highestValue < itemId) { + highestValue = itemId; + } + } + }); + } + }); + }); + + const resultArray = new Array(highestValue); + parseString(sourceContent, function (err, result) { + result.LCX.Item.forEach((item) => { + if (item.$.ItemId === ";String Table") { + item.Item.forEach((subItem) => { + const itemId = parseInt(subItem.$.ItemId, 10); + if (subItem.Str[0].Tgt) { + resultArray[itemId] = subItem.Str[0].Tgt[0].Val[0].replace(/\]5D;/g, "]"); + if (highestValue < itemId) { + highestValue = itemId; + } + } + }); + } + }); + }); + + await mkdir(outputLanguageFolder); + await write(outputPath, JSON.stringify(resultArray, null, 4) + "\n"); + } +} diff --git a/Extension/.scripts/scripts.ts b/Extension/.scripts/scripts.ts new file mode 100644 index 0000000000..81514b700f --- /dev/null +++ b/Extension/.scripts/scripts.ts @@ -0,0 +1,17 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +import { gray, green, readJson } from './common'; + +export async function main() { + const pkg = await readJson('package.json') as Record; + if (pkg.scripts) { + console.log(green('\n\nAvailable script commands:\n')); + for (const key of Object.keys(pkg.scripts)) { + console.log(green(`yarn ${key} - ${gray(pkg.scripts[key])}`)); + } + console.log(''); + } +} diff --git a/Extension/.scripts/test.ts b/Extension/.scripts/test.ts new file mode 100644 index 0000000000..c9851b280b --- /dev/null +++ b/Extension/.scripts/test.ts @@ -0,0 +1,230 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +import { runTests } from '@vscode/test-electron'; +import { spawnSync } from 'child_process'; +import { CommentArray, CommentObject } from 'comment-json'; +import { readdir } from 'fs/promises'; +import { resolve } from 'path'; +import { env } from 'process'; +import { returns } from '../src/Utility/Async/returns'; +import { filepath } from '../src/Utility/Filesystem/filepath'; +import { is } from '../src/Utility/System/guards'; +import { verbose } from '../src/Utility/Text/streams'; +import { getTestInfo } from '../test/common/selectTests'; +import { $args, $root, $scenario, brightGreen, checkFile, checkFolder, cmdSwitch, cyan, error, gray, green, readJson, red, writeJson } from './common'; +import { install, isolated, options } from './vscode'; + +export { install, reset } from './vscode'; + +const sowrite = process.stdout.write.bind(process.stdout) as (...args: unknown[]) => boolean; +const sewrite = process.stderr.write.bind(process.stderr) as (...args: unknown[]) => boolean; + +const filters = [ + /^\[(.*)\].*/, + /^Unexpected token A/, + /Cannot register 'cmake.cmakePath'/, + /\[DEP0005\] DeprecationWarning/, + /--trace-deprecation/, + /Iconv-lite warning/, + /^Extension '/, + /^Found existing install/ +]; + +// remove unwanted messages from stdio +function filterStdio() { + process.stdout.write = function (...args: unknown[]) { + if (typeof args[0] === 'string') { + const text = args[0]; + + if (filters.some(each => text.match(each))) { + return true; + } + } + if (args[0] instanceof Buffer) { + const text = args[0].toString(); + if (filters.some(each => text.match(each))) { + return true; + } + } + return sowrite(...args); + }; + + process.stderr.write = function (...args: unknown[]) { + if (typeof args[0] === 'string') { + const text = args[0]; + + if (filters.some(each => text.match(each))) { + return true; + } + } + if (args[0] instanceof Buffer) { + const text = args[0].toString(); + if (filters.some(each => text.match(each))) { + return true; + } + } + return sewrite(...args); + }; +} + +filterStdio(); + +async function unitTests() { + await checkFolder('dist/test/unit', `The folder '${$root}/dist/test/unit is missing. You should run ${brightGreen("yarn compile")}\n\n`); + const mocha = await checkFile(["node_modules/.bin/mocha.cmd", "node_modules/.bin/mocha"], `Can't find the mocha testrunner. You might need to run ${brightGreen("yarn install")}\n\n`); + const result = spawnSync(mocha, [`${$root}/dist/test/unit/**/*.test.js`, '--timeout', '30000'], { stdio:'inherit'}); + verbose(`\n${green("NOTE:")} If you want to run a scenario test (end-to-end) use ${cmdSwitch('scenario=')} \n\n`); + return result.status; +} + +async function scenarioTests(assets: string, name: string, workspace: string) { + return runTests({ + ...options, + extensionDevelopmentPath: $root, + extensionTestsPath: resolve($root, 'dist/test/common/selectTests'), + launchArgs: workspace ? [...options.launchArgs, workspace] : options.launchArgs, + extensionTestsEnv: { + SCENARIO: assets + } + }); +} + +export async function main() { + await checkFolder('dist/test/', `The folder '${$root}/dist/test is missing. You should run ${brightGreen("yarn compile")}\n\n`); + const arg = $args.find(each => !each.startsWith("--")); + const specifiedScenario = $scenario || env.SCENARIO || await getScenarioFolder(arg); + const testInfo = await getTestInfo(specifiedScenario); + + if (!testInfo) { + if (arg) { + return error(`Could not find scenario ${arg}`); + } + // lets just run the unit tests + process.exit(await unitTests()); + } + + // at this point, we're going to run some vscode tests + if (!await filepath.isFolder(isolated)) { + await install(); + } + process.exit(await scenarioTests(testInfo.assets, testInfo.name, testInfo.workspace)); +} + +export async function all() { + const finished: string[] = []; + + if (await unitTests() !== 0) { + console.log(`${cyan(" UNIT TESTS: ")}${red("failed")}`); + process.exit(1); + } + finished.push(`${cyan(" UNIT TESTS: ")}${green("success")}`); + + // at this point, we're going to run some vscode tests + if (!await filepath.isFolder(isolated)) { + await install(); + } + try { + const scenarios = await getScenarioNames(); + for (const each of scenarios) { + if (await filepath.isFolder(`${$root}/test/scenarios/${each}/tests`)) { + const ti = await getTestInfo(each); + + if (ti) { + console.log(`\n\nRunning scenario ${each}`); + const result = await scenarioTests(ti.assets, ti.name, ti.workspace); + if (result) { + console.log(finished.join('\n')); + console.log(` ${cyan(`${ti.name} Tests:`)}${red("failed")}`); + process.exit(result); + } + finished.push(` ${cyan(`${ti.name} Tests:`)}${green("success")}`); + } + } + } + } catch (e) { + error(e); + } finally { + console.log(finished.join('\n')); + } +} + +interface Input { + id: string; + type: string; + description: string; + options: CommentArray<{label: string; value: string}>; +} + +export async function getScenarioNames() { + return (await readdir(`${$root}/test/scenarios`).catch(returns.none)).filter(each => each !== 'Debugger'); +} + +export async function getScenarioFolder(scenarioName: string) { + return scenarioName ? resolve(`${$root}/test/scenarios/${(await getScenarioNames()).find(each => each.toLowerCase() === scenarioName.toLowerCase())}`) : undefined; +} + +export async function list() { + console.log(`\n${cyan("Scenarios: ")}\n`); + const names = await getScenarioNames(); + const max = names.reduce((max, each) => Math.max(max, each), 0); + for (const each of names) { + console.log(` ${green(each.padEnd(max))}: ${gray(await getScenarioFolder(each))}`); + } +} + +export async function regen() { + // update the .vscode/launch.json file with the scenarios + const scenarios = await getScenarioNames(); + const launch = await readJson(`${$root}/.vscode/launch.json`) as CommentObject; + if (!is.object(launch)) { + return error(`The file ${$root}/.vscode/launch.json is not valid json`); + } + if (!is.array(launch.inputs)) { + return error(`The file ${$root}/.vscode/launch.json is missing the 'inputs' array`); + } + + const inputs = launch.inputs as unknown as CommentArray; + const pickScenario = inputs.find(each => each.id === 'pickScenario'); + if (!pickScenario) { + return error(`The file ${$root}/.vscode/launch.json is missing the 'pickScenario' input`); + } + const pickWorkspace = inputs.find(each => each.id === 'pickWorkspace'); + if (!pickWorkspace) { + return error(`The file ${$root}/.vscode/launch.json is missing the 'pickWorkspace' input`); + } + + for (const scenarioFolder of scenarios) { + + const prefix = $root.replace(/\\/g, '/'); + + if (await filepath.isFolder(`${$root}/test/scenarios/${scenarioFolder}/tests`)) { + const testInfo = await getTestInfo(scenarioFolder); + if (testInfo) { + const label = `${scenarioFolder} `; + const value = testInfo.workspace.replace(/\\/g, '/').replace(prefix, '${workspaceFolder}'); + + const scenario = pickScenario.options.find(s => s.label === label); + if (!scenario) { + console.log(`Adding scenario ${green(scenarioFolder)} to pickScenario`); + pickScenario.options.push({ label, value }); + } else { + verbose(`Skipping scenario ${scenarioFolder} because it already exists`); + } + + const wrkspace = pickWorkspace.options.find(s => s.label === label); + if (!wrkspace) { + console.log(`Adding workspace ${green(scenarioFolder)} to pickWorkspace`); + pickWorkspace.options.push({ label, value }); + } else { + verbose(`Skipping workspace ${scenarioFolder} because it already exists`); + } + } else { + verbose(`Skipping scenario ${scenarioFolder} because it doesn't look like there are any tests. (maybe try and run ${brightGreen("yarn compile")})`); + } + } + } + await writeJson(`${$root}/.vscode/launch.json`, launch); +} diff --git a/Extension/.scripts/tsconfig.json b/Extension/.scripts/tsconfig.json new file mode 100644 index 0000000000..526b2cf1b3 --- /dev/null +++ b/Extension/.scripts/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "CommonJS", + "moduleResolution": "node16", + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "allowSyntheticDefaultImports": true, + "sourceMap": true, + "esModuleInterop": true + } +} diff --git a/Extension/test/integrationTests/MockDebugger/mockDebug.ts b/Extension/.scripts/verify.ts similarity index 62% rename from Extension/test/integrationTests/MockDebugger/mockDebug.ts rename to Extension/.scripts/verify.ts index 119ca4e0a5..a309b149f0 100644 --- a/Extension/test/integrationTests/MockDebugger/mockDebug.ts +++ b/Extension/.scripts/verify.ts @@ -3,6 +3,13 @@ * See 'LICENSE' in the project root for license information. * ------------------------------------------------------------------------------------------ */ -import { MockDebugSession } from './mockDebugSession'; +import { checkCompiled, checkPrep } from './common'; -MockDebugSession.run(MockDebugSession); +export async function main() { + await checkPrep(); + await checkCompiled(); +} + +export async function prep() { + await checkPrep(); +} diff --git a/Extension/.scripts/vscode.ts b/Extension/.scripts/vscode.ts new file mode 100644 index 0000000000..fcd5ac7e3f --- /dev/null +++ b/Extension/.scripts/vscode.ts @@ -0,0 +1,61 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +import { downloadAndUnzipVSCode, resolveCliArgsFromVSCodeExecutablePath } from '@vscode/test-electron'; +import { createHash } from 'crypto'; +import { tmpdir } from 'os'; +import { resolve } from 'path'; +import { verbose } from '../src/Utility/Text/streams'; +import { mkdir, readJson, rimraf, write } from './common'; + +export const isolated = resolve(tmpdir(), '.vscode-test', createHash('sha256').update(__dirname).digest('hex').substring(0, 6)); +export const extensionsDir = resolve(isolated, 'extensions'); +export const userDir = resolve(isolated, 'user-data'); +export const settings = resolve(userDir, "User", 'settings.json'); + +export const options = { + cachePath: `${isolated}/cache`, + launchArgs: ['--no-sandbox', '--disable-updates', '--skip-welcome', '--skip-release-notes', `--extensions-dir=${extensionsDir}`, `--user-data-dir=${userDir}`, '--disable-workspace-trust'] +}; + +export async function install() { + try { + // Create a new isolated directory for VS Code instance in the test folder, and make it specific to the extension folder so we can avoid collisions. + // keeping this out of the Extension folder means we're not worried about VS Code getting weird with locking files and such. + + verbose(`Isolated VSCode test folder: ${isolated}`); + await mkdir(isolated); + + const vscodeExecutablePath = await downloadAndUnzipVSCode(options); + const [cli, ...args] = resolveCliArgsFromVSCodeExecutablePath(vscodeExecutablePath).filter(each => !each.startsWith('--extensions-dir=') && !each.startsWith('--user-data-dir=')); + + args.push(`--extensions-dir=${extensionsDir}`, `--user-data-dir=${userDir}`); + + // install the appropriate extensions + // spawnSync(cli, [...args, '--install-extension', 'ms-vscode.cpptools'], { encoding: 'utf-8', stdio: 'ignore' }); + // spawnSync(cli, [...args, '--install-extension', 'twxs.cmake'], { encoding: 'utf-8', stdio: 'ignore' }); + // spawnSync(cli, [...args, '--install-extension', 'ms-vscode.cmake-tools'], { encoding: 'utf-8', stdio: 'ignore' }); + const settingsJson = await readJson(settings, {}); + if (!settingsJson["workbench.colorTheme"]) { + settingsJson["workbench.colorTheme"] = "Tomorrow Night Blue"; + } + + settingsJson["git.openRepositoryInParentFolders"] = "never"; + await write(settings, JSON.stringify(settingsJson, null, 4)); + + return { + cli, args + }; + + } catch (err: unknown) { + console.log(err); + } + +} + +export async function reset() { + verbose(`Removing VSCode test folder: ${isolated}`); + await rimraf(isolated); +} diff --git a/Extension/.vscode/launch.json b/Extension/.vscode/launch.json index 6d781b3fd6..4323f133dd 100644 --- a/Extension/.vscode/launch.json +++ b/Extension/.vscode/launch.json @@ -3,128 +3,75 @@ "version": "0.1.0", "configurations": [ { - "name": "Launch Extension (development)", + // debugs the extension + "name": "Run Extension", "type": "extensionHost", "request": "launch", - "runtimeExecutable": "${execPath}", - "args": [ - "--extensionDevelopmentPath=${workspaceFolder}" - ], - "sourceMaps": true, - "outFiles": [ - "${workspaceFolder}/dist/**/*.js" - ], - "preLaunchTask": "Compile Dev", - }, - { - "name": "Launch Extension (production)", - "type": "extensionHost", - "request": "launch", - "runtimeExecutable": "${execPath}", - "args": [ - "--extensionDevelopmentPath=${workspaceFolder}" - ], - "sourceMaps": true, - "outFiles": [ - "${workspaceFolder}/dist/**/*.js" - ], - "preLaunchTask": "TypeScript Compile", - }, - { - "name": "Launch Extension (do not build)", - "type": "extensionHost", - "request": "launch", - "runtimeExecutable": "${execPath}", - "args": [ - "--extensionDevelopmentPath=${workspaceFolder}" - ], - "sourceMaps": true, - "outFiles": [ - "${workspaceFolder}/dist/**/*.js" - ] - }, - { - "name": "Launch Extension (watch, development)", - "type": "extensionHost", - "request": "launch", - "runtimeExecutable": "${execPath}", - "args": [ - "--extensionDevelopmentPath=${workspaceFolder}" - ], - "sourceMaps": true, - "outFiles": [ - "${workspaceFolder}/dist/**/*.js" - ], - "preLaunchTask": "Compile Dev Watch", - }, - { - "name": "Launch Extension (watch, production)", - "type": "extensionHost", - "request": "launch", - "runtimeExecutable": "${execPath}", - "args": [ - "--extensionDevelopmentPath=${workspaceFolder}" - ], - "sourceMaps": true, - "outFiles": [ - "${workspaceFolder}/dist/**/*.js" - ], - "preLaunchTask": "TypeScript Compile Watch", - }, - { - "name": "Launch Unit Tests", - "type": "extensionHost", - "request": "launch", - "runtimeExecutable": "${execPath}", "args": [ + "--no-sandbox", + "--disable-updates", + "--skip-welcome", + "--skip-release-notes", + "--disable-workspace-trust", "--extensionDevelopmentPath=${workspaceFolder}", - "--extensionTestsPath=${workspaceFolder}/out/test/unitTests/index" ], "sourceMaps": true, "outFiles": [ - "${workspaceFolder}/out/test/**/*.js" + "${workspaceFolder}/dist/**" ], - "preLaunchTask": "Pretest" + // you can use a watch task as a prelaunch task and it works like you'd want it to. + "preLaunchTask": "watch" }, { - "name": "Launch Integration Tests", + // debugs the extension (selecting the workspace) + "name": "Run Extension-Select Workspace", "type": "extensionHost", "request": "launch", - "runtimeExecutable": "${execPath}", "args": [ - "${workspaceFolder}/test/integrationTests/testAssets/SimpleCppProject/simpleCppProject.code-workspace", + "--no-sandbox", + "--disable-updates", + "--skip-welcome", + "--skip-release-notes", + "--disable-workspace-trust", "--extensionDevelopmentPath=${workspaceFolder}", - "--extensionTestsPath=${workspaceFolder}/out/test/integrationTests/languageServer/index" + "${input:pickWorkspace}" ], "sourceMaps": true, "outFiles": [ - "${workspaceFolder}/out/test/**/*.js" + "${workspaceFolder}/dist/**" ], - "preLaunchTask": "Pretest", + // you can use a watch task as a prelaunch task and it works like you'd want it to. + "preLaunchTask": "watch" }, { - "name": "Launch E2E IntelliSense features tests", + // debug scenario tests (selecting the workspace) + "name": "VSCode Tests", "type": "extensionHost", "request": "launch", "runtimeExecutable": "${execPath}", + "env": { + "SCENARIO": "${input:pickScenario}" + }, "args": [ - "${workspaceFolder}/../../Vcls-vscode-test/MultirootDeadlockTest/test.code-workspace", + "--no-sandbox", + "--disable-updates", + "--skip-welcome", + "--skip-release-notes", + "--disable-extensions", "--extensionDevelopmentPath=${workspaceFolder}", - "--extensionTestsPath=${workspaceFolder}/out/test/integrationTests/IntelliSenseFeatures/index" + "--extensionTestsPath=${workspaceFolder}/dist/test/common/selectTests", + "--scenario=${input:pickScenario}", + "${input:pickScenario}" ], "sourceMaps": true, "outFiles": [ - "${workspaceFolder}/out/test/**/*.js" + "${workspaceFolder}/dist/**" ], - "preLaunchTask": "Pretest" - }, - { - "name": "Node Attach", - "type": "node", - "request": "attach", - "port": 5858 + // you can use a watch task as a prelaunch task and it works like you'd want it to. + "preLaunchTask": "watch" }, { + // used for debugging unit tests "name": "MochaTest", "type": "node", "request": "attach", @@ -135,9 +82,62 @@ "/**" ], "outFiles": [ - "${workspaceFolder}/**/out/**/*.js", + "${workspaceFolder}/dist/**", "!**/node_modules/**" ] } + ], + "inputs": [ + { + "type": "pickString", + "id": "pickScenario", + "description": "Select which scenario to debug VSCode tests.", + "options": [ + { + "label": "MultirootDeadlockTest ", + "value": "${workspaceFolder}/test/scenarios/MultirootDeadlockTest/assets/test.code-workspace" + }, + { + "label": "SimpleCppProject ", + "value": "${workspaceFolder}/test/scenarios/SimpleCppProject/assets/simpleCppProject.code-workspace" + }, + { + "label": "SingleRootProject ", + "value": "${workspaceFolder}/test/scenarios/SingleRootProject/assets/" + }, + { + "label": "CompilerDetection ", + "value": "${workspaceFolder}/test/scenarios/CompilerDetection/assets" + } + ] + }, + { + "type": "pickString", + "id": "pickWorkspace", + "description": "Select which workspace scenario to debug VSCode.", + "default": "-n", + "options": [ + { + "label": "(Debug with new window) ", + "value": "-n" + }, + { + "label": "MultirootDeadlockTest ", + "value": "${workspaceFolder}/test/scenarios/MultirootDeadlockTest/assets/test.code-workspace" + }, + { + "label": "SimpleCppProject ", + "value": "${workspaceFolder}/test/scenarios/SimpleCppProject/assets/simpleCppProject.code-workspace" + }, + { + "label": "SingleRootProject ", + "value": "${workspaceFolder}/test/scenarios/SingleRootProject/assets/" + }, + { + "label": "CompilerDetection ", + "value": "${workspaceFolder}/test/scenarios/CompilerDetection/assets" + } + ] + } ] } diff --git a/Extension/.vscode/settings.json b/Extension/.vscode/settings.json index c450fb5835..ed0b053847 100644 --- a/Extension/.vscode/settings.json +++ b/Extension/.vscode/settings.json @@ -9,8 +9,8 @@ "typescript.tsdk": "./node_modules/typescript/lib", // we want to use the TS server from our node_modules folder to control its version // if you install the mocha test explorer extension, you can run the unit tests from the test explorer UI "testExplorer.useNativeTesting": true, - "mochaExplorer.files": "./**/internalUnitTests/**/*.test.js", - "mochaExplorer.watch": "./**/internalUnitTests/**/*.test.js", + "mochaExplorer.files": "./**/unit/**/*.test.js", + "mochaExplorer.watch": "./**/unit/**/*.test.js", "mochaExplorer.ignore": [ "**/*skip*", "**/dist/test/**/*.d.ts", @@ -48,5 +48,20 @@ "eslint.format.enable": true, "[javascript]": { "editor.tabSize": 4, - } + }, + "markdown.extension.list.indentationSize": "inherit", + "markdown.extension.toc.levels": "2..6", + "[markdown]": { + "editor.tabSize": 4, + }, + "eslint.workingDirectories": [ + { + "changeProcessCWD": true, + "directory": "./", + }, + { + "changeProcessCWD": true, + "directory": "./.scripts", + } + ], } diff --git a/Extension/.vscode/tasks.json b/Extension/.vscode/tasks.json index c31a18d425..76b0fac632 100644 --- a/Extension/.vscode/tasks.json +++ b/Extension/.vscode/tasks.json @@ -4,203 +4,25 @@ "version": "2.0.0", "tasks": [ { - "label": "TypeScript Compile", + "label": "compile", + "type": "npm", + "script": "compile", + "problemMatcher": "$tsc", "group": { "kind": "build", "isDefault": true - }, - "isBackground": false, - "type": "shell", - "presentation": { - "echo": true, - "reveal": "silent", - "focus": false, - "panel": "shared" - }, - "command": "yarn", - "args": [ - "run", - "compile" - ] - }, - { - "label": "TypeScript Lint", - "group": "build", - "isBackground": false, - "type": "shell", - "command": "yarn", - "args": [ - "run", - "lint" - ], - "problemMatcher": { - "fileLocation": "absolute", - "source": "lint", - "pattern": [ - { - "regexp": "(ERROR:) ([a-zA-Z/:\\-\\.]*)\\[(\\d+), (\\d+)\\]: (.*)", - "severity": 1, - "file": 2, - "line": 3, - "column": 4, - "message": 5 - } - ] - }, - "dependsOn": [ - "Compile Dev" - ] - }, - { - "label": "Compile Dev", - "group": "build", - "isBackground": false, - "type": "shell", - "command": "yarn", - "args": [ - "run", - "compile-dev" - ] - }, - { - "label": "Pretest", - "group": "build", - "isBackground": false, - "type": "shell", - "command": "yarn", - "args": [ - "run", - "pretest" - ], - "dependsOn": [ - "Compile Dev" - ] + } }, { - "label": "TypeScript Compile Watch", + "label": "watch", + "type": "npm", + "script": "watch", "group": { "kind": "build", "isDefault": true }, "isBackground": true, - "type": "shell", - "presentation": { - "echo": true, - "reveal": "silent", - "focus": false, - "panel": "shared" - }, - "command": "yarn", - "args": [ - "run", - "compile-watch" - ], - "problemMatcher": [ - { - "owner": "typescript", - "source": "ts", - "applyTo": "closedDocuments", - "fileLocation": "absolute", - "severity": "error", - "pattern": [ - { - "regexp": "\\[tsl\\] ERROR in (.*)?\\((\\d+),(\\d+)\\)", - "file": 1, - "line": 2, - "column": 3 - }, - { - "regexp": "\\s*TS\\d+:\\s*(.*)", - "message": 1 - } - ], - "background": { - "activeOnStart": true, - "beginsPattern": { - "regexp": "asset" - }, - "endsPattern": { - "regexp": "webpack (.*?) compiled (.*?) ms" - } - } - } - ] - }, - { - "label": "Compile Dev Watch", - "group": "build", - "isBackground": true, - "type": "shell", - "command": "yarn", - "args": [ - "run", - "compile-dev-watch" - ], - "problemMatcher": [ - { - "owner": "typescript", - "source": "ts", - "applyTo": "closedDocuments", - "fileLocation": "absolute", - "severity": "error", - "pattern": [ - { - "regexp": "\\[tsl\\] ERROR in (.*)?\\((\\d+),(\\d+)\\)", - "file": 1, - "line": 2, - "column": 3 - }, - { - "regexp": "\\s*TS\\d+:\\s*(.*)", - "message": 1 - } - ], - "background": { - "activeOnStart": true, - "beginsPattern": { - "regexp": "asset" - }, - "endsPattern": { - "regexp": "webpack (.*?) compiled (.*?) ms" - } - } - } - ] - }, - { - "label": "Compile:Watch (unit-tests)", - "type": "shell", - "options": { - "cwd": "${workspaceFolder}" - }, - "command": "yarn", - "args": [ - "run", - "compile-watch-unit-tests" - ], - "isBackground": true, "problemMatcher": "$tsc-watch", - "group": { - "kind": "build", - "isDefault": false - } - }, - { - "label": "Compile (unit-tests)", - "type": "shell", - "options": { - "cwd": "${workspaceFolder}" - }, - "command": "yarn", - "args": [ - "run", - "compile-unit-tests" - ], - "problemMatcher": "$tsc", - "group": { - "kind": "build", - "isDefault": false - } } ] } diff --git a/Extension/.vscodeignore b/Extension/.vscodeignore index 98c39069e4..8cbf739a51 100644 --- a/Extension/.vscodeignore +++ b/Extension/.vscodeignore @@ -1,47 +1,54 @@ - -# ignore vscode settings for extension development -.vscode/** - -# ignore binaries -obj/** - -# ignore source files -tools/** -notices/** -test/** -src/** - -# ignore .js files that are webpacked or only used for development -out/src/** -out/tools/** - -# ignore ts files in ui -ui/*.ts - -# ignore Azure-Pipelines files -jobs/** -cgmanifest.json - -# ignore development files -tsconfig.json -test.tsconfig.json -tslint.json -.eslintrc.js -webpack.config.js -tscCompileList.txt -gulpfile.js -.gitattributes -.gitignore -CMakeLists.txt -debugAdapters/install.lock* -typings/** -**/*.map -import_edge_strings.js -localized_string_ids.h -translations_auto_pr.js - -# ignore i18n language files -i18n/** - -# ignore node_modules -node_modules/ + +# ignore vscode settings for extension development +.vscode/** + +# ignore binaries +obj/** + +# ignore source files +tools/** +notices/** +test/** +src/** + +# ignore .js files that are webpacked or only used for development +out/src/** +out/tools/** + +# don't include the local code and tests compiled files +dist/test/** + +# no project scripts +.scripts/** + +# ignore ts files in ui +ui/*.ts + +# ignore Azure-Pipelines files +jobs/** +cgmanifest.json + +# ignore development files +tsconfig.json +test.tsconfig.json +ui.tsconfig.json +tslint.json +.eslintrc.js +webpack.config.js +tscCompileList.txt +gulpfile.js +.gitattributes +.gitignore +CMakeLists.txt +debugAdapters/install.lock* +typings/** +**/*.map +import_edge_strings.js +localized_string_ids.h +translations_auto_pr.js + +# ignore i18n language files +i18n/** + +# ignore node_modules +node_modules/ diff --git a/Extension/.yarnrc b/Extension/.yarnrc new file mode 100644 index 0000000000..c5ea157687 --- /dev/null +++ b/Extension/.yarnrc @@ -0,0 +1,7 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +ignore-engines true +disable-self-update-check true +--run.silent true \ No newline at end of file diff --git a/Extension/gulpfile.js b/Extension/gulpfile.js index 260dfc2f08..66888cac5e 100644 --- a/Extension/gulpfile.js +++ b/Extension/gulpfile.js @@ -6,7 +6,7 @@ 'use strict'; const gulp = require('gulp'); -const eslint = require('gulp-eslint-new'); + const fs = require('fs'); const nls = require('vscode-nls-dev'); const path = require('path'); @@ -58,24 +58,6 @@ const languages = [ { id: "pl", folderName: "plk" } ]; -/// Misc Tasks -const allTypeScript = [ - 'src/**/*.ts', - '!**/*.d.ts', - '!**/typings**' -]; - -gulp.task('lint', function () { - return gulp.src(allTypeScript) - .pipe(eslint({ overrideConfigFile: ".eslintrc.js" })) - .pipe(eslint.format()) - .pipe(eslint.failAfterError()); -}); - -gulp.task('copy-walkthrough-media', function () { - return gulp.src('walkthrough/images/**/*') - .pipe(gulp.dest('dist/walkthrough/images')); -}); // **************************** // Command: translations-export @@ -462,122 +444,3 @@ const generateJsonSchemaLoc = () => { gulp.task('translations-generate', gulp.series(generateSrcLocBundle, generateAdditionalLocFiles, generateHtmlLoc, generateWalkthroughHtmlLoc, generateJsonSchemaLoc)); -// **************************** -// Command: generate-native-strings -// The following is used to generate nativeStrings.ts and localized_string_ids.h from ./src/nativeStrings.json -// If adding localized strings to the native side, start by adding it to nativeStrings.json and use this to generate the others. -// **************************** - -// A gulp task to parse ./src/nativeStrings.json and generate nativeStrings.ts, and localized_string_ids.h -gulp.task("generate-native-strings", (done) => { - const stringTable = jsonc.parse(fs.readFileSync('./src/nativeStrings.json').toString()); - - let nativeEnumContent = "" - let nativeStringTableContent = ""; - let typeScriptSwitchContent = ""; - - let stringIndex = 1; - for (let property in stringTable) { - let stringValue = stringTable[property]; - let hintValue; - if (typeof stringValue !== "string") { - hintValue = stringValue.hint; - stringValue = stringValue.text; - } - - // Add to native enum - nativeEnumContent += ` ${property} = ${stringIndex},\n`; - - // Add to native string table - nativeStringTableContent += ` ${JSON.stringify(stringValue)},\n`; - - // Add to TypeScript switch - // Skip empty strings, which can be used to prevent enum/index reordering - if (stringValue != "") { - // It's possible that a translation may skip "{#}" entries, so check for up to 50 of them. - let numArgs = 0; - for (let i = 0; i < 50; i++) { - if (stringValue.includes(`{${i}}`)) { - numArgs = i + 1; - } - } - typeScriptSwitchContent += ` case ${stringIndex}:\n`; - if (numArgs != 0) { - typeScriptSwitchContent += ` if (stringArgs) {\n`; - if (hintValue) { - typeScriptSwitchContent += ` message = localize({ key: ${JSON.stringify(property)}, comment: [${JSON.stringify(hintValue)}] }, ${JSON.stringify(stringValue)}`; - } else { - typeScriptSwitchContent += ` message = localize(${JSON.stringify(property)}, ${JSON.stringify(stringValue)}`; - } - for (let i = 0; i < numArgs; i++) { - typeScriptSwitchContent += `, stringArgs[${i}]`; - } - typeScriptSwitchContent += `);\n break;\n }\n`; - } - if (hintValue) { - typeScriptSwitchContent += ` message = localize({ key: ${JSON.stringify(property)}, comment: [${JSON.stringify(hintValue)}] }, ${JSON.stringify(stringValue)}`; - } else { - typeScriptSwitchContent += ` message = localize(${JSON.stringify(property)}, ${JSON.stringify(stringValue)}`; - } - typeScriptSwitchContent += `);\n break;\n`; - } - ++stringIndex; - }; - - let typeScriptContent = `/* -------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All Rights Reserved. - * See 'LICENSE' in the project root for license information. - * ------------------------------------------------------------------------------------------ */ - -// ****** This file is generated from nativeStrings.json. Do not edit this file directly. ****** - -'use strict'; - -import * as nls from 'vscode-nls'; - -nls.config({ messageFormat: nls.MessageFormat.bundle, bundleFormat: nls.BundleFormat.standalone })(); -const localize: nls.LocalizeFunc = nls.loadMessageBundle(); - -export const localizedStringCount: number = ${stringIndex}; - -export function lookupString(stringId: number, stringArgs?: string[]): string { - let message: string = ""; - switch (stringId) { - case 0: - // Special case for blank string - break; -${typeScriptSwitchContent} - default: - console.assert(\"Unrecognized string ID\"); - break; - } - return message; -} -`; - console.log("Writing file: ./src/nativeStrings.ts"); - fs.writeFileSync("./src/nativeStrings.ts", typeScriptContent, 'utf8'); - - let nativeContents = `/* -------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All Rights Reserved. - * See 'LICENSE' in the project root for license information. - * ------------------------------------------------------------------------------------------ */ - -// ****** This file is generated from nativeStrings.json. Do not edit this file directly. ****** - -#pragma once -// NOLINTBEGIN(modernize-raw-string-literal) -enum class localized_string_id : unsigned int -{ - blank = 0, -${nativeEnumContent}}; - -inline static const char *localizable_strings[] = { - "", -${nativeStringTableContent}}; -// NOLINTEND(modernize-raw-string-literal) -`; - - console.log("Writing file: localized_string_ids.h -- If changed, copy to VS repo: src/vc/designtime/vscode/Common/generated/"); - fs.writeFileSync("localized_string_ids.h", nativeContents, 'utf8'); - done(); -}); diff --git a/Extension/import_edge_strings.js b/Extension/import_edge_strings.js deleted file mode 100644 index 197794a0cc..0000000000 --- a/Extension/import_edge_strings.js +++ /dev/null @@ -1,89 +0,0 @@ -'use strict'; - -const fs = require('fs'); -const path = require('path'); -const parseString = require('xml2js').parseString; - -let localizeRepoPath = process.argv[2]; -let cpptoolsRepoPath = process.argv[3]; - -if (!localizeRepoPath || !cpptoolsRepoPath) { - console.error(`ERROR: Usage: ${path.parse(process.argv[0]).base} ${path.parse(process.argv[1]).base} `); - return; -} - -console.log("Importing EDGE strings from Localize repo: " + localizeRepoPath); -console.log("Writing to cpptools repo: " + cpptoolsRepoPath); - -if (!fs.existsSync(path.join(localizeRepoPath, ".git"))) { - console.error("ERROR: Localize repo submodule is not initialized in Localize repo"); - return; -} - -const languages = [ - { id: "zh-tw", folderName: "cht", transifexId: "zh-hant" }, - { id: "zh-cn", folderName: "chs", transifexId: "zh-hans" }, - { id: "fr", folderName: "fra" }, - { id: "de", folderName: "deu" }, - { id: "it", folderName: "ita" }, - { id: "es", folderName: "esn" }, - { id: "ja", folderName: "jpn" }, - { id: "ko", folderName: "kor" }, - { id: "ru", folderName: "rus" }, - { id: "bg", folderName: "bul" }, // VS Code supports Bulgarian, but VS is not currently localized for those languages. - { id: "hu", folderName: "hun" }, // VS Code supports Hungarian, but VS is not currently localized for those languages. - { id: "pt-br", folderName: "ptb", transifexId: "pt-BR" }, - { id: "tr", folderName: "trk" }, - { id: "cs", folderName: "csy" }, - { id: "pl", folderName: "plk" } -]; - -var locFolderNames = fs.readdirSync(localizeRepoPath).filter(f => fs.lstatSync(path.join(localizeRepoPath, f)).isDirectory()); -locFolderNames.forEach((locFolderName) => { - let lclPath = path.join(localizeRepoPath, locFolderName, "vc/vc/cpfeui.dll.lcl"); - let languageInfo = languages.find(l => l.folderName == locFolderName); - if (!languageInfo) { - return; - } - let languageId = languageInfo.id; - let outputLanguageFolder = path.join(cpptoolsRepoPath, "Extension/bin/messages", languageId); - let outputPath = path.join(outputLanguageFolder, "messages.json"); - let sourceContent = fs.readFileSync(lclPath, 'utf-8'); - - // Scan once, just to determine how many there are the size of the array we need - let highestValue = 0; - parseString(sourceContent, function (err, result) { - result.LCX.Item.forEach((item) => { - if (item.$.ItemId == ";String Table") { - item.Item.forEach((subItem) => { - let itemId = parseInt(subItem.$.ItemId, 10); - if (subItem.Str[0].Tgt) { - if (highestValue < itemId) { - highestValue = itemId; - } - } - }); - } - }); - }); - - let resultArray = new Array(highestValue); - parseString(sourceContent, function (err, result) { - result.LCX.Item.forEach((item) => { - if (item.$.ItemId == ";String Table") { - item.Item.forEach((subItem) => { - let itemId = parseInt(subItem.$.ItemId, 10); - if (subItem.Str[0].Tgt) { - resultArray[itemId] = subItem.Str[0].Tgt[0].Val[0].replace(/\]5D;/g, "]"); - if (highestValue < itemId) { - highestValue = itemId; - } - } - }); - } - }); - }); - - fs.mkdirSync(outputLanguageFolder, { recursive: true }); - fs.writeFileSync(outputPath, JSON.stringify(resultArray, null, 4) + '\n', 'utf8'); -}); diff --git a/Extension/package.json b/Extension/package.json index 94efd0bbbc..14ee2d89a6 100644 --- a/Extension/package.json +++ b/Extension/package.json @@ -58,7 +58,7 @@ "workspaceContains:/.vscode/c_cpp_properties.json", "onFileSystem:cpptools-schema" ], - "main": "./dist/main", + "main": "./dist/src/main", "contributes": { "walkthroughs": [ { @@ -6118,28 +6118,27 @@ ] }, "scripts": { - "vscode:prepublish": "yarn run compile", - "compile": "node ./tools/prepublish.js && gulp copy-walkthrough-media && gulp generate-native-strings && gulp translations-generate && webpack --mode production --env vscode_nls", - "compile-dev": "node ./tools/prepublish.js && gulp copy-walkthrough-media && gulp generate-native-strings && webpack --mode development", - "compile-watch": "node ./tools/prepublish.js && gulp copy-walkthrough-media && gulp generate-native-strings && gulp translations-generate && webpack --mode production --env vscode_nls --watch --progress", - "compile-dev-watch": "node ./tools/prepublish.js && gulp copy-walkthrough-media && gulp generate-native-strings && webpack --mode development --watch --progress", - "compile-unit-tests": "tsc --build test.tsconfig.json", - "compile-watch-unit-tests": "tsc --build test.tsconfig.json --watch", - "generateOptionsSchema": "node ./tools/prepublish.js && node ./out/tools/generateOptionsSchema.js", - "generate-native-strings": "node ./tools/prepublish.js && gulp generate-native-strings", - "translations-export": "node ./tools/prepublish.js && gulp generate-native-strings && gulp translations-export", - "translations-generate": "node ./tools/prepublish.js && set NODE_OPTIONS=--no-experimental-fetch && gulp translations-generate", - "translations-import": "node ./tools/prepublish.js && gulp translations-import", - "copy-walkthrough-media": "node ./tools/prepublish.js && gulp copy-walkthrough-media", - "prepublishjs": "node ./tools/prepublish.js", - "pretest": "tsc -p test.tsconfig.json", - "lint": "gulp lint", - "unitTests": "tsc -p test.tsconfig.json && node ./out/test/unitTests/runTest.js", - "internalUnitTests": "tsc -p test.tsconfig.json && mocha ./out/test/internalUnitTests/test*.js", - "integrationTests": "tsc -p test.tsconfig.json && node ./out/test/integrationTests/languageServer/runTest.js", - "intelliSenseFeaturesTests": "tsc -p test.tsconfig.json && node ./out/test/integrationTests/IntelliSenseFeatures/runTest.js", - "import-edge-strings": "node ./import_edge_strings.js", - "postinstall": "npx vscode-dts dev && npx vscode-dts main" + "scripts": "ts-node -T .scripts/scripts.ts", + "show": "ts-node -T .scripts/clean.ts show", + "clean": "ts-node -T .scripts/clean.ts", + "test": "ts-node -T .scripts/test.ts", + "code": "ts-node -T .scripts/code.ts", + "verify": "ts-node -T .scripts/verify.ts", + "prep": "yarn copy-walkthrough-media && yarn generate-native-strings && yarn translations-generate", + "lint": "eslint -c .eslintrc.js src test ui .scripts", + "compile": "(yarn verify prep || yarn prep) && tsc --build tsconfig.json", + "watch": "(yarn verify prep || yarn prep )&& tsc --build tsconfig.json --watch", + "rebuild": "yarn clean && yarn prep && yarn compile", + "vscode:prepublish": "yarn clean && yarn webpack", + "webpack": "yarn prep && tsc --build ui.tsconfig.json && webpack --mode production --env vscode_nls", + "generate-native-strings": "ts-node -T ./.scripts/generateNativeStrings.ts", + "generate-options-schema": "ts-node -T ./.scripts/generateOptionsSchema.ts", + "copy-walkthrough-media": "ts-node -T ./.scripts/copyWalkthruMedia.ts", + "translations-export": "yarn generate-native-strings && gulp translations-export", + "translations-generate": "set NODE_OPTIONS=--no-experimental-fetch && gulp translations-generate", + "translations-import": "gulp translations-import", + "import-edge-strings": "ts-node -T ./.scripts/import_edge_strings.ts", + "postinstall": "npx vscode-dts dev && npx vscode-dts main && yarn prep" }, "devDependencies": { "@octokit/rest": "^18.12.0", @@ -6154,23 +6153,21 @@ "@types/tmp": "^0.1.0", "@types/which": "^1.3.2", "@types/yauzl": "^2.9.1", - "@typescript-eslint/eslint-plugin": "^5.59.11", - "@typescript-eslint/parser": "^5.59.11", + "@typescript-eslint/eslint-plugin": "^6.1.0", + "@typescript-eslint/parser": "^6.1.0", "eslint-plugin-header": "^3.1.1", "@vscode/test-electron": "^2.3.3", "@vscode/dts": "^0.4.0", "async-child-process": "^1.1.1", "await-notify": "^1.0.1", - "eslint": "^8.42.0", + "eslint": "^8.45.0", "eslint-plugin-import": "^2.27.5", - "eslint-plugin-jsdoc": "^46.2.6", + "eslint-plugin-jsdoc": "^46.4.4", "event-stream": "^4.0.1", "fs-extra": "^8.1.0", "gulp": "^4.0.2", "gulp-env": "^0.4.0", - "gulp-eslint-new": "^1.8.0", "gulp-filter": "^6.0.0", - "gulp-mocha": "^8.0.0", "gulp-sourcemaps": "^2.6.5", "gulp-typescript": "^5.0.1", "minimist": "^1.2.7", @@ -6179,6 +6176,7 @@ "parse5": "^5.1.0", "parse5-traverse": "^1.0.3", "ts-loader": "^8.1.0", + "ts-node": "10.9.1", "typescript": "^5.1.3", "@vscode/debugadapter": "^1.61.0", "@vscode/debugprotocol": "^1.61.0", diff --git a/Extension/readme.developer.md b/Extension/readme.developer.md new file mode 100644 index 0000000000..daa6223967 --- /dev/null +++ b/Extension/readme.developer.md @@ -0,0 +1,339 @@ +# Developer Documentation + +## Table of Contents +- [Table of Contents](#table-of-contents) +- [Setup](#setup) + - [Required Tools](#required-tools) + - [Setting up the repository](#setting-up-the-repository) +- [Building the Extension](#building-the-extension) + - [When using F5 Debug](#when-using-f5-debug) + - [From Inside VS Code](#from-inside-vs-code) + - [From Command line](#from-command-line) +- [Use of an isolated VS Code environment](#use-of-an-isolated-vs-code-environment) +- [Testing](#testing) + - [Unit tests](#unit-tests) + - [Scenario Tests](#scenario-tests) +- [Scripts](#scripts) + - [`yarn scripts`](#yarn-scripts) + - [`yarn show`](#yarn-show) + - [`yarn clean`](#yarn-clean) + - [`yarn test`](#yarn-test) + - [`yarn code`](#yarn-code) + - [`yarn generate-native-strings`](#yarn-generate-native-strings) + - [`yarn generate-options-schema`](#yarn-generate-options-schema) + - [`yarn copy-walkthrough-media`](#yarn-copy-walkthrough-media) + - [`yarn prep`](#yarn-prep) + - [`yarn lint`](#yarn-lint) + - [`yarn compile`](#yarn-compile) + - [`yarn watch`](#yarn-watch) + - [`yarn verify`](#yarn-verify) + - [`yarn webpack`](#yarn-webpack) + - [`yarn install`](#yarn-install) + +## Setup + +### Required Tools + +* [Node.js](https://nodejs.org/en/download/) v16.* +* Yarn - use `npm install -g yarn` to install + +### Setting up the repository + +`git clone https://github.com/microsoft/vscode-cpptools.git` + +`yarn install` + +It's also good practice to run `yarn install` after merging from upstream or switching branches. + +## Building the Extension + +### When using F5 Debug +The `launch.json` entries now specify a `preLaunchTask` that will build the extension before launching using +the `yarn watch` command, and will wait until the build is ready. The watch command will continue to watch from +that point. + +If the extension is already built, the the watch will be very quick. + +### From Inside VS Code +There are two tasks that can be run from inside VS Code to build the extension. + +When you select `ctrl-shift-b` - there is a `Compile` task and a `Watch` task. + +During regular development, you probably want to use the `Watch` task as it will +compile changed files as you save them. + + + +### From Command line +To build the extension from the command line, use the [`yarn compile`](#yarn-compile) command, or +[`yarn watch`](#yarn-watch) to watch for changes and recompile as needed. + +
+ +## Use of an isolated VS Code environment +The scripts for this repository now support running VS Code and the extension in a +completely isolated environment (separate install of VS Code, private extensions and +user folders, etc). + +The scripts that install VS Code place it in a `$ENV:TMP/.vscode-test/` folder where +`` is a has calculated from the extension folder (this permits multiple checkouts of +the source repository and each gets it's own isolated environment). + +The [`test scripts`](#yarn-test) will automatically install and use this isolated environment. + +You can invoke VS Code from the command line using the [`yarn code`](#yarn-code) script. + +If you want to remove the isolate environment use the `yarn code reset` or `yarn test reset` scripts +to delete the folders and remove all of the configuration files. Next time you use the `yarn test` or +`yarn code` commands, it will reinstall a fresh isolated environment. + +The Isolated environment has the theme automatically set to blue so that it is visually distinct from +your normal VS Code environment. + +> #### Note +> When debugging the scenario tests from VS Code, it has to use the same VS Code binary +> as the debugger instance, so the isolated environment can't be used. + +## Testing +The test architecture has been reorganized and the layout refactored a bit. + +``` yaml +test/ : the test folder for all the tests + common/: : infrastructure/common code for tests + scenarios: : contains a folder for each scenario test + : : a folder for a set of scenario tests + assets/ : the folder that contains the workspace files for the test + # if the assets folder contains a '*.code-workspace' file, + # the test runner will use that for the workspace otherwise + # it will use the assets folder itself as the workspace. + + tests/ : location of the VS Code mocha tests for the scenario + # the tests must be in `*.test.ts` files + + unit/ : low-level unit tests (not in the VS Code environment) + # the tests must be in `*.test.ts` files +``` + +To create a new scenario, create a folder in the `scenarios` folder, and add a `assets` and `tests` folder +inside of it. + +### Unit tests +Unit tests can be run with the VS Code Test Explorer (install mocha test explorer to enable it). +The Test Explorer allows you to debug into the tests as well. + +You can also run the unit tests from the command line (see [`yarn test`](#yarn-test) below) + + +### Scenario Tests +Scenario tests (which use `@vscode/test-electron`) can be debugged from VS Code, but VS Code requires +that the extension host is the same binary as the debugger, so the isolated environment can't be used. + +Selecting the `VS Code Tests` option in the debugger and pressing F5 will prompt for the the scenario to +run the tests for under the debugger. + +> #### Note +> There are a few rough cases where the debugging the extension isn't working quite correctly. In +> `MultiRootDeadlockTests` we are getting a deadlock in the `executeCommand` when the debugger is attached. +> +> This is being investigated. + +## Scripts +The `package.json` file contains a number of scripts intended to be run via `Yarn`. + +A number of the scripts that used to use `gulp` have been extracted and put into the +`.scripts/` folder, and are run directly using `tsnode` -- this makes them easier to +reuse, and doesn't rely on `gulp` and `gulp` plugins. + +More of the scripts will be converted out of `gulp` in the future. + +
+ +### `yarn scripts` +> #### `yarn scripts` - shows the commands available in the `package.json` +This shows the commands available in the `scripts` section of the `package.json` file along with their definition + +
+ + +### `yarn show` +> #### `yarn show` - shows the files in the repository that are untracked and .gitignored +This shows the files in the repository that are not tracked (i.e. not in .git) and are +ignored by `git` This will not show untracked files that are not ignored (i.e. new files +that you could add to the repository) + +> #### `yarn show new` - shows new files that are not git ignored +This shows the files in the repository that are not tracked and are not +ignored by `git`. + + +
+ +### `yarn clean` + +> #### `yarn clean` - cleans out the `dist` files out of the repository. +Removes all of the files in the `dist` folder (where all the compiled .js files are) + +> #### `yarn clean all` - cleans all the untracked/ignored files out of the repository except for `node_modules` +Removes all of the `untracked` and `.gitignored` in the repository except for files in the `node_modules` folder. +(this is useful to reset the repository to a clean state, but not have to reinstall all of the dependencies) +Will not touch any files that could be added to the repo (i.e. new .ts files, etc) + +> #### `yarn clean reset` - cleans all the untracked/ignored files out of the repository + +Removes all of the `untracked` and `.gitignored` in the repository except. +(this is useful to reset the repository to a clean state) +Will not touch any files that could be added to the repo (i.e. new .ts files, etc) +
+ +### `yarn test` + +> `yarn test` - run just the unit tests + +The mocha test runner is invoked for the unit tests. This does not use VS Code in any way. + +> `yarn test all` - run all the tests + +The unit tests are run, and then each of the scenario test sets are run in turn. +This will install the isolated VS Code environment if it is not already installed. + +> `yarn test --scenario=` - run a single set of scenario tests +> `yarn test ` - run a single set of scenario tests + +This will just run the tests for the given scenario. You can pass in the folder name +(in `test/scenarios` or a full path to a folder with `assets` and `tests`) + +> `yarn test reset` - remove the isolated VS Code environment + +This will completely remove the isolated VS Code environment for this repository, +including cache, extensions, and configuration for the isolated environment. + +> `yarn test install` - install the isolated VS Code environment + +This installs the isolated VS Code environment if it is not currently installed for this +repository. This is done automatically when running the tests, but can be run manually. + +> `yarn test regen` - update the pick lists in `.vscode/launch.json` for any new scenarios. + +This adds new entries in the the pick lists in `.vscode/launch.json` to include any new scenarios +that you have added to the `test/scenarios` folder. It will add scenarios that have `assets` and `tests` folders +(and have been compiled at least once). It does not overwrite or update existing entries. + +This saves you the effort of having to manually update the launch.json file. + + +--- +### `yarn code` +> #### `yarn code ` - run VS Code + +This runs the isolated VS Code environment, with the cpptools extension that is built in this repo + +You can treat this essentially like using `code` from the command line. Settings can be configured, and +extensions can be installed into the isolated environment, and will be persisted across runs. + +Use `yarn code reset` to remove the isolated environment and start fresh. + +> `yarn code reset` - remove the isolated VS Code environment + +This will completely remove the isolated VS Code environment for this repository, +including cache, extensions, and configuration for the isolated environment. + +> `yarn code install` - install the isolated VS Code environment + +This installs the isolated VS Code environment if it is not currently installed for this +repository. This is done automatically when running the `yarn code`, but can be run manually. + +--- +### `yarn generate-native-strings` +> #### `yarn generate-native-strings` - generates the native strings + +This used to generate nativeStrings.ts and localized_string_ids.h from ./src/nativeStrings.json +If adding localized strings to the native side, start by adding it to nativeStrings.json and use this to generate the others. + +> #### Note +> The use of the `.scripts/common.ts:write()` function ensures that if the contents don't change the file won't be touched + +--- +### `yarn generate-options-schema` +> #### `yarn generate-options-schema` - generates the options schema + +Inserts the options schema into `package.json` from the `tools/OptionsSchema.json` and the `tools/VSSymbolSettings.json` file. + +> #### Note +> The use of the `.scripts/common.ts:write()` function ensures that if the contents don't change the file won't be touched + +--- +### `yarn copy-walkthrough-media` +> #### `yarn copy-walkthrough-media` - copies the walkthrough media + +This copies the walkthrough media into the `dist` folder. + +> #### Note +> The use of the `.scripts/common.ts:updateFiles()` function ensures that if the contents don't change the files won't be touched + +> #### `yarn copy-walkthrough-media watch` - watches for changes and automatically copies the walkthrough media + +This will watch for changes to the walkthrough files and automatically copy them across when they change. + +--- +### `yarn prep` +> #### `yarn prep` - extension preparation + +This will call `yarn copy-walkthrough-media`, `yarn generate-native-strings`, `yarn translations-generate` to ensure +that the generated files are up to date. + +--- +### `yarn lint` +> #### `yarn lint` - lint all the source files (tests, ui, src, and .scripts) + +This will lint all the source files and report errors. + +> #### `yarn lint --fix` - lint all the source files and auto fix anything it can. + +--- +### `yarn compile` +> #### `yarn compile` - compile the typescript source code + +Runs the typescript compiler on the source code (`test`,`src`,`ui`) and the output is placed in the `dist` folder. + +This means we don't use webpack for day-to-day use anymore. + +This will also verify that the repository is prepped and tries to prep it if it's not. + +--- +### `yarn watch` +> #### `yarn watch` - compile the source code and watch for changes + +Runs the typescript compiler in watch mode on the source code (`test`,`src`,`ui`) and the output is placed in the `dist` folder. + +Any changes to the source files will be automatically compiled when saved. + +This will also verify that the repository is prepped and tries to prep it if it's not. + +--- + +### `yarn verify` +> #### `yarn verify [--verbose]` - verifies that the repository is built correctly + +Checks for the presence of the compiled files and the prepped files (see [`yarn verify prep`](#yarn-verify)) +(no output unless it fails) +> #### `yarn verify prep [--verbose]` - verifies that the repository has been prepped to build + +Checks for the presence of the generated loc files and other files that are necessary to build. +(no output unless it fails) + +--- + + +### `yarn webpack` +> #### `yarn webpack` - uses webpack to build the extension + +This will use webpack to build the extension. This is only necessary when packaging the extension. + + +--- +### `yarn install` +> #### `yarn install` - post `yarn install` steps (runs the `postinstall` script) + +Installs the VS Code `*.d.ts` files and then runs `yarn prep` + +You should run `yarn install` after merging from upstream or switching branches. diff --git a/Extension/src/Debugger/configurationProvider.ts b/Extension/src/Debugger/configurationProvider.ts index b10a5a7d42..575414f6bd 100644 --- a/Extension/src/Debugger/configurationProvider.ts +++ b/Extension/src/Debugger/configurationProvider.ts @@ -204,7 +204,7 @@ export class DebugConfigurationProvider implements vscode.DebugConfigurationProv Telemetry.logDebuggerEvent(config.debuggerEvent || DebuggerEvent.debugPanel, { "debugType": config.debugType || DebugType.debug, "configSource": config.configSource || ConfigSource.unknown, "configMode": configMode, "cancelled": "false", "succeeded": "true" }); if (!resolveByVsCode) { - if ((singleFile || (isDebugPanel && !folder && isExistingTask))) { + if (singleFile || (isDebugPanel && !folder && isExistingTask)) { await this.resolvePreLaunchTask(config, configMode); config.preLaunchTask = undefined; } else { @@ -384,7 +384,7 @@ export class DebugConfigurationProvider implements vscode.DebugConfigurationProv await this.loadDetectedTasks(); // Remove the tasks that are already configured once in tasks.json. const dedupDetectedBuildTasks: CppBuildTask[] = DebugConfigurationProvider.detectedBuildTasks.filter(taskDetected => - (!configuredBuildTasks.some(taskJson => (taskJson.definition.label === taskDetected.definition.label)))); + !configuredBuildTasks.some(taskJson => taskJson.definition.label === taskDetected.definition.label)); buildTasks = buildTasks.concat(configuredBuildTasks, dedupDetectedBuildTasks); // Filter out build tasks that don't match the currently selected debug configuration type. @@ -419,7 +419,7 @@ export class DebugConfigurationProvider implements vscode.DebugConfigurationProv // Absolute path, just check if it exists await util.checkFileExists(compilerPath) : // Non-absolute. Check on $PATH - ((await util.whichAsync(compilerPath)) !== undefined); + (await util.whichAsync(compilerPath) !== undefined); if (!compilerPathExists) { logger.getOutputChannelLogger().appendLine(localize('compiler.path.not.exists', "Unable to find {0}. {1} task is ignored.", compilerPath, definition.label)); } @@ -442,7 +442,7 @@ export class DebugConfigurationProvider implements vscode.DebugConfigurationProv newConfig.detail = localize("pre.Launch.Task", "preLaunchTask: {0}", task.name); newConfig.taskDetail = task.detail; newConfig.taskStatus = task.existing ? - ((task.name === DebugConfigurationProvider.recentBuildTaskLabelStr) ? TaskStatus.recentlyUsed : TaskStatus.configured) : + (task.name === DebugConfigurationProvider.recentBuildTaskLabelStr) ? TaskStatus.recentlyUsed : TaskStatus.configured : TaskStatus.detected; if (task.isDefault) { newConfig.isDefault = true; @@ -484,11 +484,11 @@ export class DebugConfigurationProvider implements vscode.DebugConfigurationProv // Check if debuggerPath exists. if (await util.checkFileExists(debuggerPath)) { newConfig.miDebuggerPath = debuggerPath; - } else if ((await util.whichAsync(debuggerName)) !== undefined) { + } else if (await util.whichAsync(debuggerName) !== undefined) { // Check if debuggerName exists on $PATH newConfig.miDebuggerPath = debuggerName; } else { - // Try the usr path for non-windows platforms. + // Try the usr path for non-Windows platforms. const usrDebuggerPath: string = path.join("/usr", "bin", debuggerName); if (!isWindows && await util.checkFileExists(usrDebuggerPath)) { newConfig.miDebuggerPath = usrDebuggerPath; @@ -669,7 +669,7 @@ export class DebugConfigurationProvider implements vscode.DebugConfigurationProv const newSourceFileMapTarget: string = util.resolveVariables(sourceFileMapTarget, undefined); if (sourceFileMapTarget !== newSourceFileMapTarget) { // Add a space if source was changed, else just tab the target message. - message += (message ? ' ' : '\t'); + message += message ? ' ' : '\t'; message += localize("replacing.targetpath", "Replacing {0} '{1}' with '{2}'.", "targetPath", sourceFileMapTarget, newSourceFileMapTarget); target = newSourceFileMapTarget; } @@ -679,7 +679,7 @@ export class DebugConfigurationProvider implements vscode.DebugConfigurationProv if (sourceFileMapTarget !== newSourceFileMapTarget) { // Add a space if source was changed, else just tab the target message. - message += (message ? ' ' : '\t'); + message += message ? ' ' : '\t'; message += localize("replacing.editorPath", "Replacing {0} '{1}' with '{2}'.", "editorPath", sourceFileMapTarget, newSourceFileMapTarget["editorPath"]); target = newSourceFileMapTarget; } @@ -741,7 +741,7 @@ export class DebugConfigurationProvider implements vscode.DebugConfigurationProv private findDefaultConfig(configs: CppDebugConfiguration[]): CppDebugConfiguration[] { // eslint-disable-next-line no-prototype-builtins - return configs.filter((config: CppDebugConfiguration) => (config.hasOwnProperty("isDefault") && config.isDefault)); + return configs.filter((config: CppDebugConfiguration) => config.hasOwnProperty("isDefault") && config.isDefault); } private async isExistingTask(config: CppDebugConfiguration, folder?: vscode.WorkspaceFolder): Promise { @@ -812,7 +812,7 @@ export class DebugConfigurationProvider implements vscode.DebugConfigurationProv return item; })); } - detailedConfigs = detailedConfigs.filter((config: any) => (config.name && config.request === "launch" && type ? (config.type === type) : true)); + detailedConfigs = detailedConfigs.filter((config: any) => config.name && config.request === "launch" && type ? (config.type === type) : true); return detailedConfigs; } @@ -914,7 +914,7 @@ export class DebugConfigurationProvider implements vscode.DebugConfigurationProv // If the configs are coming from workspace or global settings and the task is not found in tasks.json, let that to be resolved by VsCode. if (selectedConfig.preLaunchTask && selectedConfig.configSource && (selectedConfig.configSource === ConfigSource.global || selectedConfig.configSource === ConfigSource.workspace) && - !(await this.isExistingTask(selectedConfig))) { + !await this.isExistingTask(selectedConfig)) { folder = undefined; } selectedConfig.debugType = debugModeOn ? DebugType.debug : DebugType.run; @@ -950,7 +950,7 @@ export class DebugConfigurationProvider implements vscode.DebugConfigurationProv } else { let sortedItems: ConfigMenu[] = []; // Find the recently used task and place it at the top of quickpick list. - const recentTask: ConfigMenu[] = items.filter(item => (item.configuration.preLaunchTask && item.configuration.preLaunchTask === DebugConfigurationProvider.recentBuildTaskLabelStr)); + const recentTask: ConfigMenu[] = items.filter(item => item.configuration.preLaunchTask && item.configuration.preLaunchTask === DebugConfigurationProvider.recentBuildTaskLabelStr); if (recentTask.length !== 0 && recentTask[0].detail !== TaskStatus.detected) { recentTask[0].detail = TaskStatus.recentlyUsed; sortedItems.push(recentTask[0]); @@ -960,7 +960,7 @@ export class DebugConfigurationProvider implements vscode.DebugConfigurationProv sortedItems = sortedItems.concat(items.filter(item => item.detail === undefined)); selection = await vscode.window.showQuickPick(this.localizeConfigDetail(sortedItems), { - placeHolder: (items.length === 0 ? localize("no.compiler.found", "No compiler found") : localize("select.debug.configuration", "Select a debug configuration")) + placeHolder: items.length === 0 ? localize("no.compiler.found", "No compiler found") : localize("select.debug.configuration", "Select a debug configuration") }); } if (selection && this.isClConfiguration(selection.configuration.name) && this.showErrorIfClNotAvailable(selection.configuration.name)) { diff --git a/Extension/src/Debugger/configurations.ts b/Extension/src/Debugger/configurations.ts index 16c4025d10..08a1c34118 100644 --- a/Extension/src/Debugger/configurations.ts +++ b/Extension/src/Debugger/configurations.ts @@ -26,8 +26,8 @@ export enum DebuggerType { } export enum DebuggerEvent { - debugPanel = "debugPanel", // F5 or "Run and Debug" Panel - playButton = "playButton", // "Run and Debug" play button + debugPanel = "debugPanel", // F5 or "Run and Debug" Panel + playButton = "playButton", // "Run and Debug" play button addConfigGear = "AddConfigGear" } @@ -35,14 +35,14 @@ export enum TaskStatus { recentlyUsed = "Recently Used Task", // A configured task that has been used recently. configured = "Configured Task", // The tasks that are configured in tasks.json file. - detected = "Detected Task" // The tasks that are available based on detected compilers. + detected = "Detected Task" // The tasks that are available based on detected compilers. } export enum ConfigSource { - singleFile = "singleFile", // a debug config defined for a single mode file - workspaceFolder = "workspaceFolder", // a debug config defined in launch.json - workspace = "workspace", // a debug config defined in workspace level - global = "global", // a debug config defined in user level + singleFile = "singleFile", // a debug config defined for a single mode file + workspaceFolder = "workspaceFolder", // a debug config defined in launch.json + workspace = "workspace", // a debug config defined in workspace level + global = "global", // a debug config defined in user level unknown = "unknown" } diff --git a/Extension/src/Debugger/extension.ts b/Extension/src/Debugger/extension.ts index 7b4b152f80..3fc651b59d 100644 --- a/Extension/src/Debugger/extension.ts +++ b/Extension/src/Debugger/extension.ts @@ -8,14 +8,14 @@ import * as os from 'os'; import { Configuration } from 'ssh-config'; import * as vscode from 'vscode'; import * as nls from 'vscode-nls'; -import { pathAccessible } from '../common'; import { CppSettings } from '../LanguageServer/settings'; -import { getSshChannel } from '../logger'; +import { BaseNode, addSshTargetCmd, refreshCppSshTargetsViewCmd } from '../SSH/TargetsView/common'; +import { SshTargetsProvider, getActiveSshTarget, initializeSshTargets, selectSshTarget } from '../SSH/TargetsView/sshTargetsProvider'; +import { TargetLeafNode, setActiveSshTarget } from '../SSH/TargetsView/targetNodes'; import { sshCommandToConfig } from '../SSH/sshCommandToConfig'; import { getSshConfiguration, getSshConfigurationFiles, parseFailures, writeSshConfiguration } from '../SSH/sshHosts'; -import { addSshTargetCmd, BaseNode, refreshCppSshTargetsViewCmd } from '../SSH/TargetsView/common'; -import { getActiveSshTarget, initializeSshTargets, selectSshTarget, SshTargetsProvider } from '../SSH/TargetsView/sshTargetsProvider'; -import { setActiveSshTarget, TargetLeafNode } from '../SSH/TargetsView/targetNodes'; +import { pathAccessible } from '../common'; +import { getSshChannel } from '../logger'; import { AttachItemsProvider, AttachPicker, RemoteAttachPicker } from './attachToProcess'; import { ConfigurationAssetProviderFactory, ConfigurationSnippetProvider, DebugConfigurationProvider, IConfigurationAssetProvider } from './configurationProvider'; import { DebuggerType } from './configurations'; @@ -42,7 +42,7 @@ export async function initialize(context: vscode.ExtensionContext): Promise { if (e.affectsConfiguration('C_Cpp.sshTargetsView')) { - sshTargetsViewSetting = (new CppSettings()).sshTargetsView; + sshTargetsViewSetting = new CppSettings().sshTargetsView; if (sshTargetsViewSetting === 'enabled' || (sshTargetsViewSetting === 'default' && await getActiveSshTarget(false))) { await enableSshTargetsView(); } else if (sshTargetsViewSetting === 'disabled') { diff --git a/Extension/src/Debugger/utils.ts b/Extension/src/Debugger/utils.ts index 7f686b1fde..173a627618 100644 --- a/Extension/src/Debugger/utils.ts +++ b/Extension/src/Debugger/utils.ts @@ -12,7 +12,7 @@ export class ArchitectureReplacer { public static checkAndReplaceWSLPipeProgram(pipeProgramStr: string, expectedArch: ArchType): string | undefined { let replacedPipeProgram: string | undefined; const winDir: string | undefined = process.env.WINDIR ? process.env.WINDIR.toLowerCase() : undefined; - const winDirAltDirSep: string | undefined = process.env.WINDIR ? process.env.WINDIR.replace('\\', '/').toLowerCase() : undefined; + const winDirAltDirSep: string | undefined = process.env.WINDIR ? process.env.WINDIR.replace('\\', '/').toLowerCase() : undefined; const winDirEnv: string = "${env:windir}"; if (winDir && winDirAltDirSep && (pipeProgramStr.indexOf(winDir) === 0 || pipeProgramStr.indexOf(winDirAltDirSep) === 0 || pipeProgramStr.indexOf(winDirEnv) === 0)) { diff --git a/Extension/src/LanguageServer/Providers/codeActionProvider.ts b/Extension/src/LanguageServer/Providers/codeActionProvider.ts index 9bf726c24f..f3beee3dc6 100644 --- a/Extension/src/LanguageServer/Providers/codeActionProvider.ts +++ b/Extension/src/LanguageServer/Providers/codeActionProvider.ts @@ -173,7 +173,7 @@ export class CodeActionProvider implements vscode.CodeActionProvider { } if (showClear !== "None") { let showClearAllAvailable: boolean = false; - if ((codeActionDiagnosticInfo.length > 1 || codeAnalysisFileToCodeActions.size > 1)) { + if (codeActionDiagnosticInfo.length > 1 || codeAnalysisFileToCodeActions.size > 1) { showClearAllAvailable = true; } if (!showClearAllAvailable || showClear !== "AllOnly") { diff --git a/Extension/src/LanguageServer/Providers/inlayHintProvider.ts b/Extension/src/LanguageServer/Providers/inlayHintProvider.ts index 2ac6abba9f..d117b0b6df 100644 --- a/Extension/src/LanguageServer/Providers/inlayHintProvider.ts +++ b/Extension/src/LanguageServer/Providers/inlayHintProvider.ts @@ -104,7 +104,7 @@ export class InlayHintsProvider implements vscode.InlayHintsProvider { const inlayHint: vscode.InlayHint = new vscode.InlayHint( new vscode.Position(hint.position.line, hint.position.character + (showOnLeft ? 0 : hint.identifierLength)), - (showOnLeft ? hint.label : ": " + hint.label), + showOnLeft ? hint.label : ": " + hint.label, vscode.InlayHintKind.Type); inlayHint.paddingRight = showOnLeft || hint.rightPadding; inlayHint.paddingLeft = showOnLeft && hint.leftPadding; diff --git a/Extension/src/LanguageServer/Providers/renameProvider.ts b/Extension/src/LanguageServer/Providers/renameProvider.ts index f8f46b9282..4ee347df18 100644 --- a/Extension/src/LanguageServer/Providers/renameProvider.ts +++ b/Extension/src/LanguageServer/Providers/renameProvider.ts @@ -7,7 +7,7 @@ import { Position, RequestType } from 'vscode-languageclient'; import * as nls from 'vscode-nls'; import * as util from '../../common'; import { DefaultClient, workspaceReferences } from '../client'; -import { CancellationSender, getReferenceItemIconPath, getReferenceTagString, ReferencesParams, ReferencesResult, ReferenceType } from '../references'; +import { CancellationSender, ReferenceType, ReferencesParams, ReferencesResult, getReferenceItemIconPath, getReferenceTagString } from '../references'; import { CppSettings } from '../settings'; nls.config({ messageFormat: nls.MessageFormat.bundle, bundleFormat: nls.BundleFormat.standalone })(); @@ -23,7 +23,7 @@ export class RenameProvider implements vscode.RenameProvider { this.client = client; } - public async provideRenameEdits(document: vscode.TextDocument, position: vscode.Position, newName: string, _token: vscode.CancellationToken): Promise { + public async provideRenameEdits(document: vscode.TextDocument, position: vscode.Position, newName: string, _token: vscode.CancellationToken): Promise { await this.client.ready; workspaceReferences.cancelCurrentReferenceRequest(CancellationSender.NewRequest); diff --git a/Extension/src/LanguageServer/client.ts b/Extension/src/LanguageServer/client.ts index 5e533cae67..2422d9e779 100644 --- a/Extension/src/LanguageServer/client.ts +++ b/Extension/src/LanguageServer/client.ts @@ -35,6 +35,7 @@ import { CustomConfigurationProvider1, getCustomConfigProviders, isSameProviderE import { ManualPromise } from '../Utility/Async/manualPromise'; import { ManualSignal } from '../Utility/Async/manualSignal'; import { logAndReturn, returns } from '../Utility/Async/returns'; +import { is } from '../Utility/System/guards'; import * as util from '../common'; import { DebugProtocolParams, Logger, ShowWarningParams, getDiagnosticsChannel, getOutputChannelLogger, logDebugProtocol, logLocalized, showWarning } from '../logger'; import { localizedStringCount, lookupString } from '../nativeStrings'; @@ -484,6 +485,7 @@ export interface GenerateDoxygenCommentParams { isCodeAction: boolean; isCursorAboveSignatureLine: boolean | undefined; } + export interface GenerateDoxygenCommentResult { contents: string; initPosition: Position; @@ -496,6 +498,7 @@ export interface GenerateDoxygenCommentResult { export interface IndexableQuickPickItem extends vscode.QuickPickItem { index: number; } + export interface UpdateTrustedCompilerPathsResult { compilerPath: string; } @@ -838,7 +841,7 @@ export class DefaultClient implements Client { private showConfigureIntelliSenseButton: boolean = false; /** A queue of asynchronous tasks that need to be processed befofe ready is considered active. */ - private static queue = new Array<[ManualPromise, () => Promise]|[ManualPromise]>(); + private static queue = new Array<[ManualPromise, () => Promise] | [ManualPromise]>(); /** returns a promise that waits initialization and/or a change to configuration to complete (i.e. language client is ready-to-use) */ private static readonly isStarted = new ManualSignal(true); @@ -846,8 +849,8 @@ export class DefaultClient implements Client { /** * Indicates if the blocking task dispatcher is currently running * - * This will be in the Set state when the dispatcher is not running (ie, if you await this it will be resolved immediately) - * If the dispatcher is running, this will be in the Reset state (ie, if you await this it will be resolved when the dispatcher is done) + * This will be in the Set state when the dispatcher is not running (i.e. if you await this it will be resolved immediately) + * If the dispatcher is running, this will be in the Reset state (i.e. if you await this it will be resolved when the dispatcher is done) */ private static readonly dispatching = new ManualSignal(); @@ -875,13 +878,13 @@ export class DefaultClient implements Client { * don't use this.rootFolder directly since it can be undefined */ public get RootPath(): string { - return (this.rootFolder) ? this.rootFolder.uri.fsPath : ""; + return this.rootFolder ? this.rootFolder.uri.fsPath : ""; } public get RootRealPath(): string { return this.rootRealPath; } public get RootUri(): vscode.Uri | undefined { - return (this.rootFolder) ? this.rootFolder.uri : undefined; + return this.rootFolder ? this.rootFolder.uri : undefined; } public get RootFolder(): vscode.WorkspaceFolder | undefined { return this.rootFolder; @@ -948,9 +951,9 @@ export class DefaultClient implements Client { const options: vscode.QuickPickOptions = {}; options.placeHolder = compilersOnly || !vscode.workspace.workspaceFolders || !this.RootFolder ? localize("select.compiler", "Select a compiler to configure for IntelliSense") : - (vscode.workspace.workspaceFolders.length > 1 ? + vscode.workspace.workspaceFolders.length > 1 ? localize("configure.intelliSense.forFolder", "How would you like to configure IntelliSense for the '{0}' folder?", this.RootFolder.name) : - localize("configure.intelliSense.thisFolder", "How would you like to configure IntelliSense for this folder?")); + localize("configure.intelliSense.thisFolder", "How would you like to configure IntelliSense for this folder?"); const items: IndexableQuickPickItem[] = []; let isCompilerSection: boolean = false; @@ -976,7 +979,7 @@ export class DefaultClient implements Client { } const selection: IndexableQuickPickItem | undefined = await vscode.window.showQuickPick(items, options); - return (selection) ? selection.index : -1; + return selection ? selection.index : -1; } public async showPrompt(buttonMessage: string, showSecondPrompt: boolean, sender?: any): Promise { @@ -1283,7 +1286,7 @@ export class DefaultClient implements Client { } this.rootFolder = workspaceFolder; - this.rootRealPath = this.RootPath ? (fs.existsSync(this.RootPath) ? fs.realpathSync(this.RootPath) : this.RootPath) : ""; + this.rootRealPath = this.RootPath ? fs.existsSync(this.RootPath) ? fs.realpathSync(this.RootPath) : this.RootPath : ""; let storagePath: string | undefined; if (util.extensionContext) { @@ -1320,7 +1323,7 @@ export class DefaultClient implements Client { } catch (errJS) { const err: NodeJS.ErrnoException = errJS as NodeJS.ErrnoException; - this.isSupported = false; // Running on an OS we don't support yet. + this.isSupported = false; // Running on an OS we don't support yet. if (!failureMessageShown) { failureMessageShown = true; let additionalInfo: string; @@ -1410,7 +1413,7 @@ export class DefaultClient implements Client { }); } } catch (err) { - this.isSupported = false; // Running on an OS we don't support yet. + this.isSupported = false; // Running on an OS we don't support yet. if (!failureMessageShown) { failureMessageShown = true; void vscode.window.showErrorMessage(localize("unable.to.start", "Unable to start the C/C++ language server. IntelliSense features will be disabled. Error: {0}", String(err))); @@ -1448,7 +1451,7 @@ export class DefaultClient implements Client { clangTidyPath: util.resolveVariables(settings.clangTidyPath, this.AdditionalEnvironment), clangTidyConfig: settings.clangTidyConfig, clangTidyFallbackConfig: settings.clangTidyFallbackConfig, - clangTidyHeaderFilter: (settings.clangTidyHeaderFilter !== null ? util.resolveVariables(settings.clangTidyHeaderFilter, this.AdditionalEnvironment) : null), + clangTidyHeaderFilter: settings.clangTidyHeaderFilter !== null ? util.resolveVariables(settings.clangTidyHeaderFilter, this.AdditionalEnvironment) : null, clangTidyArgs: util.resolveVariablesArray(settings.clangTidyArgs, this.AdditionalEnvironment), clangTidyUseBuildPath: settings.clangTidyUseBuildPath, clangTidyFixWarnings: settings.clangTidyFixWarnings, @@ -2113,7 +2116,7 @@ export class DefaultClient implements Client { return; } const settings: CppSettings = new CppSettings(this.RootUri); - if (settings.configurationWarnings === true && !this.isExternalHeader(docUri) && !vscode.debug.activeDebugSession) { + if (settings.configurationWarnings && !this.isExternalHeader(docUri) && !vscode.debug.activeDebugSession) { const dismiss: string = localize("dismiss.button", "Dismiss"); const disable: string = localize("diable.warnings.button", "Disable Warnings"); const configName: string | undefined = this.configuration.CurrentConfiguration?.name; @@ -2184,7 +2187,7 @@ export class DefaultClient implements Client { public getVcpkgEnabled(): Promise { const cppSettings: CppSettings = new CppSettings(this.RootUri); - return Promise.resolve(cppSettings.vcpkgEnabled === true); + return Promise.resolve(!!cppSettings.vcpkgEnabled); } public async getKnownCompilers(): Promise { @@ -2283,7 +2286,7 @@ export class DefaultClient implements Client { // pick items up off the queue and run then one at a time until the queue is empty const [promise, task] = DefaultClient.queue.shift() ?? []; - if (promise) { + if (is.promise(promise)) { try { promise.resolve(task ? await task() : undefined); } catch (e) { @@ -2366,13 +2369,13 @@ export class DefaultClient implements Client { if (cppSettings.autoAddFileAssociations) { const is_c: boolean = languageStr.startsWith("c;"); const is_cuda: boolean = languageStr.startsWith("cu;"); - languageStr = languageStr.substring(is_c ? 2 : (is_cuda ? 3 : 1)); - this.addFileAssociations(languageStr, is_c ? "c" : (is_cuda ? "cuda-cpp" : "cpp")); + languageStr = languageStr.substring(is_c ? 2 : is_cuda ? 3 : 1); + this.addFileAssociations(languageStr, is_c ? "c" : is_cuda ? "cuda-cpp" : "cpp"); } } private async setTemporaryTextDocumentLanguage(params: SetTemporaryTextDocumentLanguageParams): Promise { - const languageId: string = params.isC ? "c" : (params.isCuda ? "cuda-cpp" : "cpp"); + const languageId: string = params.isC ? "c" : params.isCuda ? "cuda-cpp" : "cpp"; const document: vscode.TextDocument = await vscode.workspace.openTextDocument(params.path); if (!!document && document.languageId !== languageId) { if (document.languageId === "cpp" && languageId === "c") { @@ -2704,7 +2707,7 @@ export class DefaultClient implements Client { // Handle config providers const provider: CustomConfigurationProvider1 | undefined = !this.configStateReceived.configProviders ? undefined : - (this.configStateReceived.configProviders.length === 0 ? undefined : this.configStateReceived.configProviders[0]); + this.configStateReceived.configProviders.length === 0 ? undefined : this.configStateReceived.configProviders[0]; let showConfigStatus: boolean = false; if (rootFolder && configProviderNotSetAndNoCache && provider && (statusBarIndicatorEnabled || sender === "configProviders")) { const ask: PersistentFolderState = new PersistentFolderState("Client.registerProvider", true, rootFolder); @@ -3069,13 +3072,13 @@ export class DefaultClient implements Client { } else { areOptionalsValid = util.isOptionalString(input.configuration.intelliSenseMode) && util.isOptionalString(input.configuration.standard); } - return (input && (util.isString(input.uri) || util.isUri(input.uri)) && + return input && (util.isString(input.uri) || util.isUri(input.uri)) && input.configuration && areOptionalsValid && util.isArrayOfString(input.configuration.includePath) && util.isArrayOfString(input.configuration.defines) && util.isOptionalArrayOfString(input.configuration.compilerArgs) && - util.isOptionalArrayOfString(input.configuration.forcedInclude)); + util.isOptionalArrayOfString(input.configuration.forcedInclude); } private sendCustomConfigurations(configs: any, providerVersion: Version): void { diff --git a/Extension/src/LanguageServer/clientCollection.ts b/Extension/src/LanguageServer/clientCollection.ts index 05a71895d5..5e558018fa 100644 --- a/Extension/src/LanguageServer/clientCollection.ts +++ b/Extension/src/LanguageServer/clientCollection.ts @@ -101,7 +101,7 @@ export class ClientCollection { public checkOwnership(client: cpptools.Client, document: vscode.TextDocument): boolean { - return (this.getClientFor(document.uri) === client); + return this.getClientFor(document.uri) === client; } /** @@ -154,7 +154,7 @@ export class ClientCollection { const path: string = util.asFolder(folder.uri); const client: cpptools.Client | undefined = this.languageClients.get(path); if (client) { - this.languageClients.delete(path); // Do this first so that we don't iterate on it during the ownership transfer process. + this.languageClients.delete(path); // Do this first so that we don't iterate on it during the ownership transfer process. // Transfer ownership of the client's documents to another client. // (this includes calling textDocument/didOpen on the new client so that the server knows it's open too) diff --git a/Extension/src/LanguageServer/codeAnalysis.ts b/Extension/src/LanguageServer/codeAnalysis.ts index abce5597d0..e59446f292 100644 --- a/Extension/src/LanguageServer/codeAnalysis.ts +++ b/Extension/src/LanguageServer/codeAnalysis.ts @@ -8,7 +8,7 @@ import { LanguageClient, NotificationType, Range } from 'vscode-languageclient/n import * as nls from 'vscode-nls'; import { Location, WorkspaceEdit } from './commonTypes'; import { CppSourceStr } from './extension'; -import { getLocalizedString, LocalizeStringParams } from './localization'; +import { LocalizeStringParams, getLocalizedString } from './localization'; import { CppSettings } from './settings'; import { makeVscodeLocation, makeVscodeRange, makeVscodeTextEdits, rangeEquals } from './utils'; @@ -187,7 +187,7 @@ function rebuildCodeAnalysisCodeAndAllFixes(): void { if (new CppSettings().clangTidyCodeActionShowDisable) { codeToFixes[1].disableAllTypeCodeAction = { - title: localize("disable_all_type_problems", "Disable all {0} problems", codeToFixes[0]), + title: localize("disable_all_type_problems", "Disable all {0} problems", codeToFixes[0]), command: { title: 'DisableAllTypeCodeAnalysisProblems', command: 'C_Cpp.DisableAllTypeCodeAnalysisProblems', @@ -512,8 +512,8 @@ export function removeCodeAnalysisProblems(identifiersAndUris: CodeAnalysisDiagn const newDiagnostics: vscode.Diagnostic[] = []; for (const diagnostic of diagnostics) { const code: string = typeof diagnostic.code === "string" ? diagnostic.code : - (typeof diagnostic.code === "object" && typeof diagnostic.code.value === "string" ? - diagnostic.code.value : ""); + typeof diagnostic.code === "object" && typeof diagnostic.code.value === "string" ? + diagnostic.code.value : ""; let removed: boolean = false; for (const identifier of identifiersAndUri.identifiers) { if (code !== identifier.code || !rangeEquals(diagnostic.range, identifier.range)) { diff --git a/Extension/src/LanguageServer/configurations.ts b/Extension/src/LanguageServer/configurations.ts index 3334a01430..0c240df5ca 100644 --- a/Extension/src/LanguageServer/configurations.ts +++ b/Extension/src/LanguageServer/configurations.ts @@ -595,10 +595,10 @@ export class CppProperties { const settings: CppSettings = new CppSettings(this.rootUri); const compilerPathAndArgs: util.CompilerPathAndArgs = util.extractCompilerPathAndArgs(!!settings.legacyCompilerArgsBehavior, resolvedCompilerPath); - const isValid: boolean = ((compilerPathAndArgs.compilerName.toLowerCase() === "cl.exe" || compilerPathAndArgs.compilerName.toLowerCase() === "cl") === configuration.intelliSenseMode.includes("msvc") + const isValid: boolean = (compilerPathAndArgs.compilerName.toLowerCase() === "cl.exe" || compilerPathAndArgs.compilerName.toLowerCase() === "cl") === configuration.intelliSenseMode.includes("msvc") // We can't necessarily determine what host compiler nvcc will use, without parsing command line args (i.e. for -ccbin) // to determine if the user has set it to something other than the default. So, we don't squiggle IntelliSenseMode when using nvcc. - || (compilerPathAndArgs.compilerName.toLowerCase() === "nvcc.exe") || (compilerPathAndArgs.compilerName.toLowerCase() === "nvcc")); + || (compilerPathAndArgs.compilerName.toLowerCase() === "nvcc.exe") || (compilerPathAndArgs.compilerName.toLowerCase() === "nvcc"); if (isValid) { return ""; } else { @@ -762,7 +762,7 @@ export class CppProperties { } paths = this.resolveDefaults(paths, defaultValue); paths.forEach(entry => { - const entries: string[] = util.resolveVariables(entry, env).split(util.envDelimiter).map(e => glob ? this.resolvePath(e, false) : e).filter(e => e); + const entries: string[] = util.resolveVariables(entry, env).split(path.delimiter).map(e => glob ? this.resolvePath(e, false) : e).filter(e => e); resolvedVariables.push(...entries); }); if (!glob) { @@ -1314,7 +1314,7 @@ export class CppProperties { } if (!this.configurationJson) { - this.resetToDefaultSettings(true); // I don't think there's a case where this will be hit anymore. + this.resetToDefaultSettings(true); // I don't think there's a case where this will be hit anymore. } void this.applyDefaultIncludePathsAndFrameworks().catch(logAndReturn.undefined); @@ -1604,7 +1604,7 @@ export class CppProperties { errors.forcedInclude = this.validatePath(config.forcedInclude, {isDirectory: false, skipRelativePaths: true}); errors.compileCommands = this.validatePath(config.compileCommands, {isDirectory: false}); errors.dotConfig = this.validatePath(config.dotConfig, {isDirectory: false}); - errors.databaseFilename = this.validatePath((config.browse ? config.browse.databaseFilename : undefined), {isDirectory: false}); + errors.databaseFilename = this.validatePath(config.browse ? config.browse.databaseFilename : undefined, {isDirectory: false}); // Validate intelliSenseMode if (isWindows) { @@ -1833,7 +1833,7 @@ export class CppProperties { // Check for path-related squiggles. let paths: string[] = []; let compilerPath: string | undefined; - for (const pathArray of [ (currentConfiguration.browse ? currentConfiguration.browse.path : undefined), + for (const pathArray of [ currentConfiguration.browse ? currentConfiguration.browse.path : undefined, currentConfiguration.includePath, currentConfiguration.macFrameworkPath ]) { if (pathArray) { for (const curPath of pathArray) { diff --git a/Extension/src/LanguageServer/cppBuildTaskProvider.ts b/Extension/src/LanguageServer/cppBuildTaskProvider.ts index b6b2dd6ac3..edc1ceab3e 100644 --- a/Extension/src/LanguageServer/cppBuildTaskProvider.ts +++ b/Extension/src/LanguageServer/cppBuildTaskProvider.ts @@ -137,9 +137,9 @@ export class CppBuildTaskProvider implements TaskProvider { !isWindows || !info.path.startsWith("/") ); const cl_to_add: configs.KnownCompiler | undefined = userCompilerIsCl ? undefined : knownCompilers.find(info => - ((path.basename(info.path) === "cl.exe") && compiler_condition(info))); + (path.basename(info.path) === "cl.exe") && compiler_condition(info)); knownCompilers = knownCompilers.filter(info => - ((info === cl_to_add) || (path.basename(info.path) !== "cl.exe" && compiler_condition(info)))); + (info === cl_to_add) || (path.basename(info.path) !== "cl.exe" && compiler_condition(info))); knownCompilers.map(info => { knownCompilerPathsSet.add(info.path); }); @@ -222,7 +222,7 @@ export class CppBuildTaskProvider implements TaskProvider { public async getJsonTasks(): Promise { const rawJson: any = await this.getRawTasksJson(); - const rawTasksJson: any = (!rawJson.tasks) ? new Array() : rawJson.tasks; + const rawTasksJson: any = !rawJson.tasks ? new Array() : rawJson.tasks; const buildTasksJson: CppBuildTask[] = rawTasksJson.map((task: any) => { if (!task.label || !task.type || task.type !== CppBuildTaskProvider.CppBuildScriptType) { return null; diff --git a/Extension/src/LanguageServer/customProviders.ts b/Extension/src/LanguageServer/customProviders.ts index 94195b87f7..5e9a7439ad 100644 --- a/Extension/src/LanguageServer/customProviders.ts +++ b/Extension/src/LanguageServer/customProviders.ts @@ -172,7 +172,7 @@ export class CustomConfigurationProviderCollection { let exists: boolean = false; const existing: CustomProviderWrapper | undefined = this.providers.get(wrapper.extensionId); if (existing) { - exists = (existing.version === Version.v0 && wrapper.version === Version.v0); + exists = existing.version === Version.v0 && wrapper.version === Version.v0; } if (!exists) { diff --git a/Extension/src/LanguageServer/extension.ts b/Extension/src/LanguageServer/extension.ts index c53014057f..a0fe492a35 100644 --- a/Extension/src/LanguageServer/extension.ts +++ b/Extension/src/LanguageServer/extension.ts @@ -812,7 +812,7 @@ async function onVcpkgClipboardInstallSuggested(ports?: string[]): Promise portsPromises.push(lookupIncludeInVcpkg(docAndLineNumbers[0], line)); }); }); - ports = ([] as string[]).concat(...(await Promise.all(portsPromises))); + ports = ([] as string[]).concat(...await Promise.all(portsPromises)); if (!ports.length) { return; } @@ -1004,8 +1004,8 @@ function handleMacCrashFileRead(err: NodeJS.ErrnoException | undefined | null, d lines.forEach((line: string) => { if (!line.includes(".dylib") && !line.includes("???")) { line = line.replace(/^\d+\s+/, ""); // Remove from the start of the line. - line = line.replace(/std::__1::/g, "std::"); // __1:: is not helpful. - data += (line + "\n"); + line = line.replace(/std::__1::/g, "std::"); // __1:: is not helpful. + data += line + "\n"; } }); data = data.trimRight(); diff --git a/Extension/src/LanguageServer/languageConfig.ts b/Extension/src/LanguageServer/languageConfig.ts index 4ab74284ad..c9112ef170 100644 --- a/Extension/src/LanguageServer/languageConfig.ts +++ b/Extension/src/LanguageServer/languageConfig.ts @@ -24,7 +24,7 @@ interface Rules { end: vscode.OnEnterRule[]; } -const escapeChars: RegExp = /[\\\^\$\*\+\?\{\}\(\)\.\!\=\|\[\]\ \/]/; // characters that should be escaped. +const escapeChars: RegExp = /[\\\^\$\*\+\?\{\}\(\)\.\!\=\|\[\]\ \/]/; // characters that should be escaped. // Insert '\\' in front of regexp escape chars. function escape(chars: string): string { @@ -238,8 +238,8 @@ export function getLanguageConfig(languageId: string): vscode.LanguageConfigurat } export function getLanguageConfigFromPatterns(languageId: string, patterns?: (string | CommentPattern)[]): vscode.LanguageConfiguration { - const beginPatterns: string[] = []; // avoid duplicate rules - const continuePatterns: string[] = []; // avoid duplicate rules + const beginPatterns: string[] = []; // avoid duplicate rules + const continuePatterns: string[] = []; // avoid duplicate rules let duplicates: boolean = false; let beginRules: vscode.OnEnterRule[] = []; let continueRules: vscode.OnEnterRule[] = []; @@ -271,7 +271,7 @@ export function getLanguageConfigFromPatterns(languageId: string, patterns?: (st if (duplicates) { getOutputChannel().appendLine(localize("duplicate.multiline.patterns", "Duplicate multiline comment patterns detected.")); } - return { onEnterRules: beginRules.concat(continueRules).concat(endRules).filter(e => (e)) }; // Remove any 'undefined' entries + return { onEnterRules: beginRules.concat(continueRules).concat(endRules).filter(e => e) }; // Remove any 'undefined' entries } function constructCommentRules(comment: CommentPattern, languageId: string): Rules { diff --git a/Extension/src/LanguageServer/referencesModel.ts b/Extension/src/LanguageServer/referencesModel.ts index 97e2049347..134ab587ae 100644 --- a/Extension/src/LanguageServer/referencesModel.ts +++ b/Extension/src/LanguageServer/referencesModel.ts @@ -24,7 +24,7 @@ export class ReferencesModel { // Currently, the hierarchy is built each time referencesTreeDataProvider requests nodes. for (const r of results) { // Add reference to file - const noReferenceLocation: boolean = (r.position.line === 0 && r.position.character === 0); + const noReferenceLocation: boolean = r.position.line === 0 && r.position.character === 0; if (noReferenceLocation) { const node: TreeNode = new TreeNode(this, NodeType.fileWithPendingRef); node.fileUri = vscode.Uri.file(r.file); @@ -79,7 +79,7 @@ export class ReferencesModel { for (const n of filteredFiles) { const i: number = result.findIndex(item => item.filename === n.filename); if (i < 0) { - const nodeType: NodeType = (n.node === NodeType.fileWithPendingRef ? NodeType.fileWithPendingRef : NodeType.file); + const nodeType: NodeType = n.node === NodeType.fileWithPendingRef ? NodeType.fileWithPendingRef : NodeType.file; const node: TreeNode = new TreeNode(this, nodeType); node.filename = n.filename; node.fileUri = n.fileUri; @@ -140,11 +140,11 @@ export class ReferencesModel { } export enum NodeType { - undefined, // Use undefined for creating a flat raw list of reference results. - referenceType, // A node to group reference types. - file, // File node that has reference nodes. - fileWithPendingRef, // File node with pending references to find (e.g. it has no reference children yet). - reference // A reference node, which is either a string, comment, inactive reference, etc. + undefined, // Use undefined for creating a flat raw list of reference results. + referenceType, // A node to group reference types. + file, // File node that has reference nodes. + fileWithPendingRef, // File node with pending references to find (e.g. it has no reference children yet). + reference // A reference node, which is either a string, comment, inactive reference, etc. } export class TreeNode { diff --git a/Extension/src/LanguageServer/referencesView.ts b/Extension/src/LanguageServer/referencesView.ts index af53cd768b..8604397cc1 100644 --- a/Extension/src/LanguageServer/referencesView.ts +++ b/Extension/src/LanguageServer/referencesView.ts @@ -77,8 +77,8 @@ export class FindAllRefsView { const fileReferences: TreeNode[] = this.referencesModel.getAllFilesWithPendingReferenceNodes(); for (const fileRef of fileReferences) { const line: string = - ("[" + getReferenceTagString(ReferenceType.ConfirmationInProgress, this.referencesModel.isCanceled) + "] " - + fileRef.filename); + "[" + getReferenceTagString(ReferenceType.ConfirmationInProgress, this.referencesModel.isCanceled) + "] " + + fileRef.filename; fileRefs.push(line); } diff --git a/Extension/src/LanguageServer/settings.ts b/Extension/src/LanguageServer/settings.ts index 4f5a1b174f..0504d20ea6 100644 --- a/Extension/src/LanguageServer/settings.ts +++ b/Extension/src/LanguageServer/settings.ts @@ -4,6 +4,8 @@ * ------------------------------------------------------------------------------------------ */ 'use strict'; +/* eslint-disable @typescript-eslint/no-unnecessary-boolean-literal-compare */ + import { execSync } from 'child_process'; import * as editorConfig from 'editorconfig'; import * as fs from 'fs'; @@ -159,7 +161,7 @@ export interface SettingsParams { } function getTarget(): vscode.ConfigurationTarget { - return (vscode.workspace.workspaceFolders) ? vscode.ConfigurationTarget.WorkspaceFolder : vscode.ConfigurationTarget.Global; + return vscode.workspace.workspaceFolders ? vscode.ConfigurationTarget.WorkspaceFolder : vscode.ConfigurationTarget.Global; } class Settings { @@ -371,6 +373,7 @@ export class CppSettings extends Settings { public get simplifyStructuredComments(): boolean | undefined { return super.Section.get("simplifyStructuredComments"); } public get doxygenGeneratedCommentStyle(): string | undefined { return super.Section.get("doxygen.generatedStyle"); } public get doxygenGenerateOnType(): boolean | undefined { return super.Section.get("doxygen.generateOnType"); } + // eslint-disable-next-line no-extra-parens public get commentContinuationPatterns(): (string | CommentPattern)[] | undefined { return super.Section.get<(string | CommentPattern)[]>("commentContinuationPatterns"); } public get configurationWarnings(): boolean | undefined { return super.Section.get("configurationWarnings")?.toLowerCase() !== "disabled"; } public get preferredPathSeparator(): string | undefined { return super.Section.get("preferredPathSeparator"); } diff --git a/Extension/src/LanguageServer/settingsPanel.ts b/Extension/src/LanguageServer/settingsPanel.ts index 9e591929d3..4ff7ffd1ed 100644 --- a/Extension/src/LanguageServer/settingsPanel.ts +++ b/Extension/src/LanguageServer/settingsPanel.ts @@ -229,7 +229,7 @@ export class SettingsPanel { private updateWebview(configSelection: string[], configuration: config.Configuration, errors: config.ConfigurationErrors | null): void { this.configValues = deepCopy(configuration); // Copy configuration values - this.isIntelliSenseModeDefined = (this.configValues.intelliSenseMode !== undefined); + this.isIntelliSenseModeDefined = this.configValues.intelliSenseMode !== undefined; if (this.panel && this.initialized) { void this.panel.webview.postMessage({ command: 'setKnownCompilers', compilers: this.compilerPaths }); void this.panel.webview.postMessage({ command: 'updateConfigSelection', selections: configSelection, selectedIndex: this.configIndexSelected }); diff --git a/Extension/src/LanguageServer/timeTelemetryCollector.ts b/Extension/src/LanguageServer/timeTelemetryCollector.ts index 1caf78fd05..ea353bc2fa 100644 --- a/Extension/src/LanguageServer/timeTelemetryCollector.ts +++ b/Extension/src/LanguageServer/timeTelemetryCollector.ts @@ -69,13 +69,13 @@ export class TimeTelemetryCollector { const startTime: number = timeStamps.firstFile ? timeStamps.firstFile : timeStamps.didOpen; let properties: any = {}; let metrics: any = { - "setupTime": (timeStamps.setup - timeStamps.didOpen), - "updateRangeTime": (timeStamps.updateRange - timeStamps.setup), - "totalTime": (timeStamps.updateRange - startTime) + "setupTime": timeStamps.setup - timeStamps.didOpen, + "updateRangeTime": timeStamps.updateRange - timeStamps.setup, + "totalTime": timeStamps.updateRange - startTime }; if (timeStamps.firstFile) { properties = { "coldstart": "true" }; - metrics = { "activationTime": (timeStamps.didOpen - startTime), ...metrics }; + metrics = { "activationTime": timeStamps.didOpen - startTime, ...metrics }; } telemetry.logLanguageServerEvent("timeStamps", properties, metrics); diff --git a/Extension/src/LanguageServer/ui.ts b/Extension/src/LanguageServer/ui.ts index 76585a96b7..d5fac7a0b2 100644 --- a/Extension/src/LanguageServer/ui.ts +++ b/Extension/src/LanguageServer/ui.ts @@ -7,6 +7,7 @@ import * as vscode from 'vscode'; import * as nls from 'vscode-nls'; import { sleep } from '../Utility/Async/sleep'; +import { is } from '../Utility/System/guards'; import * as util from '../common'; import * as telemetry from '../telemetry'; import { Client } from './client'; @@ -238,8 +239,8 @@ export class LanguageStatusUI { if (this.isParsingWorkspacePaused) { const displayTwoStatus: boolean = this.isParsingFiles && this.isParsingWorkspace; return (this.isParsingFiles ? this.parsingFilesTooltip : "") - + (displayTwoStatus ? " | " : "") - + (this.isParsingWorkspace ? this.workspaceParsingPausedText : ""); + + (displayTwoStatus ? " | " : "") + + (this.isParsingWorkspace ? this.workspaceParsingPausedText : ""); } else { return this.isParsingWorkspace ? this.workspaceParsingRunningText : this.parsingFilesTooltip; } @@ -390,7 +391,7 @@ export class LanguageStatusUI { } items.push({ label: localize("another.analysis", "Start Another..."), description: "", index: 3 }); const selection: IndexableQuickPickItem | undefined = await vscode.window.showQuickPick(items, options); - return (selection) ? selection.index : -1; + return selection ? selection.index : -1; } public async showIdleCodeAnalysisCommands(): Promise { @@ -402,7 +403,7 @@ export class LanguageStatusUI { items.push({ label: localize("all.analysis", "Run Code Analysis on All Files"), description: "", index: 1 }); items.push({ label: localize("open.analysis", "Run Code Analysis on Open Files"), description: "", index: 2 }); const selection: IndexableQuickPickItem | undefined = await vscode.window.showQuickPick(items, options); - return (selection) ? selection.index : -1; + return selection ? selection.index : -1; } //#endregion Code analysis language status @@ -421,9 +422,9 @@ export class LanguageStatusUI { private get ReferencesCommand(): ReferencesCommandMode { return this.referencesStatusBarItem.tooltip === "" ? ReferencesCommandMode.None : - (this.referencesStatusBarItem.tooltip === referencesCommandModeToString(ReferencesCommandMode.Find) ? ReferencesCommandMode.Find : - (this.referencesStatusBarItem.tooltip === referencesCommandModeToString(ReferencesCommandMode.Rename) ? ReferencesCommandMode.Rename : - ReferencesCommandMode.Peek)); + this.referencesStatusBarItem.tooltip === referencesCommandModeToString(ReferencesCommandMode.Find) ? ReferencesCommandMode.Find : + this.referencesStatusBarItem.tooltip === referencesCommandModeToString(ReferencesCommandMode.Rename) ? ReferencesCommandMode.Rename : + ReferencesCommandMode.Peek; } private set ReferencesCommand(val: ReferencesCommandMode) { @@ -544,7 +545,7 @@ export class LanguageStatusUI { // TODO: Check some "AlwaysShow" setting here. this.ShowConfiguration = isCppOrRelated || (util.getWorkspaceIsCpp() && (activeEditor.document.fileName.endsWith("tasks.json") || - activeEditor.document.fileName.endsWith("launch.json"))); + activeEditor.document.fileName.endsWith("launch.json"))); if (this.showConfigureIntelliSenseButton) { if (isCppOrRelated && !!this.currentClient && this.currentClient.getShowConfigureIntelliSenseButton()) { @@ -574,7 +575,7 @@ export class LanguageStatusUI { items.push({ label: localize("edit.configuration.json", "Edit Configurations (JSON)"), description: "", index: configurationNames.length + 1 }); const selection: IndexableQuickPickItem | undefined = await vscode.window.showQuickPick(items, options); - return (selection) ? selection.index : -1; + return selection ? selection.index : -1; } public async showConfigurationProviders(currentProvider?: string): Promise { @@ -593,7 +594,7 @@ export class LanguageStatusUI { items.push({ label: `(${localize("none", "none")})`, description: localize("disable.configuration.provider", "Disable the active configuration provider, if applicable."), key: "" }); const selection: KeyedQuickPickItem | undefined = await vscode.window.showQuickPick(items, options); - return (selection) ? selection.key : undefined; + return selection ? selection.key : undefined; } public async showCompileCommands(paths: string[]): Promise { @@ -606,7 +607,7 @@ export class LanguageStatusUI { } const selection: IndexableQuickPickItem | undefined = await vscode.window.showQuickPick(items, options); - return (selection) ? selection.index : -1; + return selection ? selection.index : -1; } public async showWorkspaces(workspaceNames: { name: string; key: string }[]): Promise { @@ -617,7 +618,7 @@ export class LanguageStatusUI { workspaceNames.forEach(name => items.push({ label: name.name, description: "", key: name.key })); const selection: KeyedQuickPickItem | undefined = await vscode.window.showQuickPick(items, options); - return (selection) ? selection.key : ""; + return selection ? selection.key : ""; } public async showConfigureIncludePathMessage(prompt: () => Promise, onSkip: () => void): Promise { @@ -644,7 +645,7 @@ export class LanguageStatusUI { }); }; - if (this.curConfigurationStatus) { + if (is.promise(this.curConfigurationStatus)) { this.curConfigurationStatus = this.curConfigurationStatus.then(result => { if (priority > result.priority) { return showPrompt(); diff --git a/Extension/src/LanguageServer/utils.ts b/Extension/src/LanguageServer/utils.ts index 2ebd0e3dc5..b71e0c3bc0 100644 --- a/Extension/src/LanguageServer/utils.ts +++ b/Extension/src/LanguageServer/utils.ts @@ -34,7 +34,7 @@ export function rangeEquals(range1: vscode.Range | Range, range2: vscode.Range | // Check this before attempting to switch a document from C to C++. export function shouldChangeFromCToCpp(document: vscode.TextDocument): boolean { - if ((document.fileName.endsWith(".C") || document.fileName.endsWith(".H"))) { + if (document.fileName.endsWith(".C") || document.fileName.endsWith(".H")) { const cppSettings: CppSettings = new CppSettings(); if (cppSettings.autoAddFileAssociations) { return !docsChangedFromCppToC.has(document.fileName); diff --git a/Extension/src/SSH/sshCommandToConfig.ts b/Extension/src/SSH/sshCommandToConfig.ts index c149c2d882..b23ecf50e4 100644 --- a/Extension/src/SSH/sshCommandToConfig.ts +++ b/Extension/src/SSH/sshCommandToConfig.ts @@ -14,27 +14,27 @@ import { parse } from 'shell-quote'; const flags: { [flag: string]: ((entries: { [key: string]: string }, value: string) => void) | null; } = { - 1: entries => (entries.Protocol = '1'), - 2: entries => (entries.Protocol = '2'), - 4: entries => (entries.AddressFamily = 'inet'), - 6: entries => (entries.AddressFamily = 'inet6'), - A: entries => (entries.ForwardAgent = 'yes'), - b: (entries, address) => (entries.BindAddress = address), - C: entries => (entries.Compression = 'yes'), - c: (entries, cipher) => (entries.Cipher = cipher), - D: (entries, address) => (entries.DynamicForward = address), + 1: entries => entries.Protocol = '1', + 2: entries => entries.Protocol = '2', + 4: entries => entries.AddressFamily = 'inet', + 6: entries => entries.AddressFamily = 'inet6', + A: entries => entries.ForwardAgent = 'yes', + b: (entries, address) => entries.BindAddress = address, + C: entries => entries.Compression = 'yes', + c: (entries, cipher) => entries.Cipher = cipher, + D: (entries, address) => entries.DynamicForward = address, // -e (escape code) is used as it's not useful for us and could mess with script execution e: null, // -F (config file) is irrelevant F: null, // -f (running in background) would interfere with execution f: null, - g: entries => (entries.GatewayPorts = 'yes'), - I: (entries, device) => (entries.SmartcardDevice = device), - i: (entries, identity) => (entries.IdentityFile = identity), - J: (entries, address) => (entries.ProxyJump = address), - K: entries => (entries.GSSAPIAuthentication = 'yes'), - k: entries => (entries.GSSAPIDelegateCredentials = 'no'), + g: entries => entries.GatewayPorts = 'yes', + I: (entries, device) => entries.SmartcardDevice = device, + i: (entries, identity) => entries.IdentityFile = identity, + J: (entries, address) => entries.ProxyJump = address, + K: entries => entries.GSSAPIAuthentication = 'yes', + k: entries => entries.GSSAPIDelegateCredentials = 'no', L: (entries, args) => { /** * For the cases of: @@ -69,9 +69,9 @@ const flags: { entries.LocalForward = `${args.substring(0, delimiter)} ${args.substring(delimiter + 1)}`; }, - l: (entries, user) => (entries.User = user), - M: entries => (entries.ControlMaster = 'yes'), - m: (entries, specs) => (entries.MACs = specs), + l: (entries, user) => entries.User = user, + M: entries => entries.ControlMaster = 'yes', + m: (entries, specs) => entries.MACs = specs, // -N (don't execute remote command) would interfere with execution N: null, // -n (redirect stdin) would interfere with execution @@ -86,11 +86,11 @@ const flags: { entries[option.slice(0, delimiter)] = option.slice(delimiter + 1); }, - p: (entries, port) => (entries.Port = port), + p: (entries, port) => entries.Port = port, // -q (quiet mode) not useful for us q: null, - R: (entries, address) => (entries.RemoteForward = address), - S: (entries, path) => (entries.ControlPath = path), + R: (entries, address) => entries.RemoteForward = address, + S: (entries, path) => entries.ControlPath = path, // -s (remote subsystem invocation), no setting in the config for this s: null, // -T (disable pseudo tty), no setting in the config for this @@ -99,12 +99,12 @@ const flags: { t: null, // -V (display the version) not relevant for us V: null, - v: entries => (entries.LogLevel = 'verbose'), - W: (entries, address) => (entries.RemoteForward = address), - w: (entries, value) => (entries.TunnelDevice = value), - X: entries => (entries.ForwardX11 = 'yes'), - x: entries => (entries.ForwardX11 = 'no'), - Y: entries => (entries.ForwardX11Trusted = 'yes'), + v: entries => entries.LogLevel = 'verbose', + W: (entries, address) => entries.RemoteForward = address, + w: (entries, value) => entries.TunnelDevice = value, + X: entries => entries.ForwardX11 = 'yes', + x: entries => entries.ForwardX11 = 'no', + Y: entries => entries.ForwardX11Trusted = 'yes', // output logging y: null }; diff --git a/Extension/src/SSH/sshHosts.ts b/Extension/src/SSH/sshHosts.ts index 579ea6839b..2a30014285 100644 --- a/Extension/src/SSH/sshHosts.ts +++ b/Extension/src/SSH/sshHosts.ts @@ -47,7 +47,7 @@ export async function getSshConfigHostInfos(): Promise (hostInfos.set(name, { hostName: hosts[name], file: configPath }))); + Object.keys(hosts).forEach(name => hostInfos.set(name, { hostName: hosts[name], file: configPath })); } return hostInfos; diff --git a/Extension/src/Utility/Async/constructor.ts b/Extension/src/Utility/Async/constructor.ts new file mode 100644 index 0000000000..027533c9a8 --- /dev/null +++ b/Extension/src/Utility/Async/constructor.ts @@ -0,0 +1,47 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +import { is } from '../System/guards'; +import { ConstructorReturn, Reject, Resolve, AsyncConstructor } from '../System/types'; + +// eslint-disable-next-line @typescript-eslint/naming-convention +export function Async) => ConstructorReturn>(ctor: TClass) { + class AsyncConstructed extends Promise { + static class: TClass = ctor; + constructor(...args: ConstructorParameters); + constructor(...args: any[]) { + + if (args.length === 1 && typeof args[0] === 'function') { + // this is being called because a new Promise is being created for an async function invocation (not user code) + super(args[0]); + return; + } + + // this is being called because a user is creating an instance of the class, and we want to call the init() method + super((resolve: Resolve, reject: Reject) => { + try { + // call the constructor with the arguments that they provided + const instance = new ctor(...(args as any)) as any; + + // if .init is a function, call it + const pInit = typeof instance.init === 'function' ? instance.init(...args) : instance.init; + + // if the result of .init is a promise (or is a promise itself), then on completion, it should propogate the result (or error) to the promise + if (is.promise(pInit)) { + pInit.then(() => resolve(instance)).catch(reject); + } else { + // otherwise, the result of init is not a promise (or it didn't have an init), so just resolve the promise with the result + resolve(instance); + } + } catch (error) { + // if the constructor throws, we should reject the promise with that error. + reject(error); + } + }); + } + } + // return a new constructor as a type that creates a Promise + return AsyncConstructed as any as AsyncConstructor; +} diff --git a/Extension/src/Utility/Async/factory.ts b/Extension/src/Utility/Async/factory.ts new file mode 100644 index 0000000000..8223f0c32c --- /dev/null +++ b/Extension/src/Utility/Async/factory.ts @@ -0,0 +1,55 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +/* eslint-disable @typescript-eslint/naming-convention */ + +import { is } from '../System/guards'; +import { Reject, Resolve } from '../System/types'; + +type WithInit = TOutput & { init?(...args: any[]): any | Promise }; + +export function Factory) => ReturnType>(factory: TFactory): new (...args: Parameters) => Promise>> { + /** calls/awaits any .init in the result from the factory */ + async function initialize(instance: WithInit> | Promise>>, args: any[]) { + if (instance !== null && instance !== undefined) { + if (is.promise(instance)) { + instance = await instance; + } + + // if .init is a function, call it, if it's a promise, await it + const pInit = typeof instance.init === 'function' ? instance.init(args) : instance.init; + if (is.promise(pInit)) { + await pInit; + } + } + return instance; + } + + class AsyncFactory extends Promise> { + protected factory: TFactory; + constructor(...args: any[]) { + if (args.length === 1 && typeof args[0] === 'function') { + // this is being called because a new Promise is being created for an async function invocation (not user code) + super(args[0]); + this.factory = factory; + return; + } + + // this is being called because a user is creating an instance of the class, and we want to call the init() method + super((resolve: Resolve>, reject: Reject) => { + try { + // call the factory with the arguments that they provided, then initialize it + initialize(factory(...(args as any)) as any, args).then(resolve).catch(reject); + } catch (error) { + // if the constructor throws, we should reject the promise with that error. + reject(error); + } + }); + this.factory = factory; + } + } + + return AsyncFactory as any as new (...args: Parameters) => Promise>>; +} diff --git a/Extension/src/Utility/Async/iterators.ts b/Extension/src/Utility/Async/iterators.ts new file mode 100644 index 0000000000..29a32f991c --- /dev/null +++ b/Extension/src/Utility/Async/iterators.ts @@ -0,0 +1,177 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +/* eslint-disable @typescript-eslint/no-non-null-assertion */ +import { is } from '../System/guards'; +import { Signal } from './signal'; + +/** an async foreach function to iterate over any iterable/async iterable, calling a function on each item in parallel as possible */ +export async function foreach(items: undefined | Iterable | Promise | undefined> | Promise | AsyncIterable | Promise>, predicate: (item: T) => Promise): Promise { + items = is.promise(items) ? await items : items; // unwrap the promise if it is one + + if (items) { + const result = [] as Promise[]; + if (is.asyncIterable(items)) { + for await (const item of items) { + result.push(predicate(item)); // run the predicate on each item + } + } else { + for (const item of items) { + result.push(predicate(item)); // run the predicate on each item + } + } + return Promise.all(result); + } + return []; // return an empty array if there is nothing to iterate over +} + +interface Cursor { + identity: number; + iterator: AsyncIterator; + result?: IteratorResult; +} + +/** An AsyncIterable wrapper that caches so that it can be iterated multiple times */ +export function reiterable(iterable: AsyncIterable): AsyncIterable { + const cache = new Array(); + let done: boolean | undefined; + let nextElement: undefined | Promise>; + + return { + [Symbol.asyncIterator]() { + let index = 0; + return { + async next() { + if (index < cache.length) { + return { value: cache[index++], done: false }; + } + if (done) { + return { value: undefined, done: true }; + } + index++; + if (!is.promise(nextElement)) { + nextElement = iterable[Symbol.asyncIterator]().next().then(element => { + if (!(done = element.done)) { + cache.push(element.value); + } + nextElement = undefined; + return element; + }); + } + return nextElement; + } + }; + } + }; +} + +export type AsynchIterable = AsyncIterable & { + add(...iterables: (Some | undefined | Promise | Promise)[]): void; + complete(): void; + autoComplete(shouldAutocomplete: boolean): AsynchIterable; + reiterable(): AsyncIterable; +}; + +export function accumulator(...iterables: Some[]): AsynchIterable { + const iterators = new Map>>(); + let completeWhenEmpty = iterables.length > 0; // if we are given any items, they we auto-complete when we run out (so an add after the last item is yielded will throw) + const signal = new Signal(); + + const result = combiner(iterables) as unknown as AsynchIterable; + result.add = (...iterables: (Some | undefined | Promise)[]) => { + for (const iterable of iterables) { + iterators.set(iterators.size + 1, awaitNext({ identity: iterators.size + 1, iterator: asyncOf(iterable)[Symbol.asyncIterator]() })); + } + signal.resolve(true); + }; + + result.autoComplete = (shouldAutocomplete: boolean) => { completeWhenEmpty = shouldAutocomplete; return result; }; + result.complete = () => signal.dispose(completeWhenEmpty = true); + result.reiterable = () => reiterable(result); + + return result; + + async function awaitNext(element: Cursor): Promise> { + element.result = undefined; // drop the previous result before awaiting the next + element.result = await element.iterator.next(); + return element; + } + + async function* combiner(iterables: Some[]) { + iterables.forEach((iterable, index) => iterators.set(index, awaitNext({ identity: index, iterator: asyncOf(iterable)[Symbol.asyncIterator]() }))); + + // Loop until all iterators are done, removing them as they complete + do { + if (!iterators.size && !completeWhenEmpty) { + await signal; // wait for a new item to be added, or for the complete signal + } + + while (iterators.size) { + const element = await race([...iterators.values()]); + + // Is that iterator done? + if (element.result!.done) { + iterators.delete(element.identity); + continue; + } + + // Yield the result from the iterator, and await the next item + const { value } = element.result!; + iterators.set(element.identity, awaitNext(element)); + if (value !== undefined && value !== null) { + yield value; + } + + } + // eslint-disable-next-line no-unmodified-loop-condition + } while (!completeWhenEmpty); + signal.dispose(false); + + // prevent any more iterators from being added + result.add = () => { throw new Error('AsyncIterable is finished'); }; + } +} + +export type Some = T | Promise | AsyncIterable | AsyncIterable | Promise> | Iterable | Iterable>; + +export async function* asyncOf(...items: (undefined | Promise | Some)[]): AsyncIterable> { + if (is.asyncIterable(items)) { + for await (const item of items) { + if (is.asyncIterable(item) || is.iterable(item)) { + yield* item as any; + continue; + } + yield item as any; + } + return; + } + + for (const item of items) { + // skip undefined + if (item) { + if (is.asyncIterable(item) || is.iterable(item)) { + yield* item as any; + continue; + } + yield item as any; + } + } +} + +/** + * A substitute for Promise.race() + * + * This is used so that when there is a global function called 'addMisbehavingPromise' present + * it will call that function with the promise returned from Promise.race(...) + * otherwise it just falls back to Promise.race() + * + * This allows unit tests to trap and display 'multiple resolve' errors (Promise.race can look like multiple resolves, but it isn't) + * + * By using this race function instead, we can ignore those (the v8 JIT will easily optimize this out in production) + */ +export function race(promises: Promise[]): Promise { + const addMisbehavingPromise: (p: Promise) => Promise = (global as any).addMisbehavingPromise; + return addMisbehavingPromise ? addMisbehavingPromise(Promise.race(promises)) : Promise.race(promises); +} diff --git a/Extension/src/Utility/Async/lazy.ts b/Extension/src/Utility/Async/lazy.ts new file mode 100644 index 0000000000..92112d222e --- /dev/null +++ b/Extension/src/Utility/Async/lazy.ts @@ -0,0 +1,25 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +import { is } from '../System/guards'; + +class Lazy extends Promise { + #promise!: Promise; + constructor(private initializer: T | (() => Promise) | (() => T) | (new () => T)) { + super(resolve => resolve(undefined as any)); + } + + override then(onfulfilled?: (value: T) => TResult1 | PromiseLike, onrejected?: (reason: any) => TResult2 | PromiseLike): Promise { + return (this.#promise ??= Promise.resolve(typeof this.initializer === 'function' ? is.Constructor(this.initializer) ? new this.initializer() : (this.initializer as () => T | Promise)() : this.initializer)).then(onfulfilled, onrejected); + } + override catch(onrejected?: (reason: any) => never): Promise { + return (this.#promise ??= Promise.resolve(typeof this.initializer === 'function' ? is.Constructor(this.initializer) ? new this.initializer() : (this.initializer as () => T | Promise)() : this.initializer)).catch(onrejected); + } +} + +/** Returns a promise from a value (value/lambda/constructor) that isn't resolved until is is awaited. */ +export function lazy(initializer: T | (() => Promise) | (() => T) | (new () => T)): Promise { + return new Lazy(initializer); +} diff --git a/Extension/src/Utility/Async/map.ts b/Extension/src/Utility/Async/map.ts new file mode 100644 index 0000000000..c687579d5a --- /dev/null +++ b/Extension/src/Utility/Async/map.ts @@ -0,0 +1,88 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +import { is } from '../System/guards'; + +export class AsyncMap { + private readonly map = new Map | undefined>(); + clear(): void { + return this.map.clear(); + } + delete(key: TKey): boolean { + return this.map.delete(key); + } + get(key: TKey): TValue | Promise | undefined { + return this.map.get(key); + } + has(key: TKey): boolean { + return this.map.has(key); + } + get size(): number { + return this.map.size; + } + async *entries(): AsyncIterable<[TKey, TValue]> { + // eslint-disable-next-line prefer-const + for (let [key, value] of this.map.entries()) { + if (is.promise(value)) { + value = await value; + } + if (!is.nullish(value)) { + yield [key, value]; + } + } + } + keys(): Iterator { + return this.map.keys(); + } + async *values(): AsyncIterable { + for (let value of this.map.values()) { + if (is.promise(value)) { + value = await value; + } + if (!is.nullish(value)) { + yield value; + } + } + } + + [Symbol.asyncIterator](): AsyncIterable<[TKey, TValue]> { + return this.entries(); + } + + getOrAdd(key: TKey, initializer: TValue | Promise | Promise | (() => Promise | TValue | undefined)): Promise | TValue | undefined { + let result: Promise | TValue | undefined = this.map.get(key); + + // if we don't get a match, then we'll try to set the value with the initializer + if (is.nullish(result)) { + // if the initializer is a function, then we'll call it to get the value + if (is.function(initializer)) { + result = initializer(); + } + + // if we're not handed a promise or a value, then we're done + if (is.nullish(result)) { + return undefined; + } + + // set the value in the map to the result of the initializer + this.map.set(key, result); + + // if the initializer is a promise, then we'll tack on a bit of logic to remove the value from the map if the promise resolves to undefined + if (is.promise(result)) { + return result.then(v => { + if (is.nullish(v)) { + this.map.delete(key); + } + return v; + }); + } + } + return result; + } + set(key: TKey, value: Promise | TValue): this { + this.map.set(key, value); + return this; + } +} diff --git a/Extension/src/Utility/Async/signal.ts b/Extension/src/Utility/Async/signal.ts index 1f9f01c730..1da5ca7992 100644 --- a/Extension/src/Utility/Async/signal.ts +++ b/Extension/src/Utility/Async/signal.ts @@ -67,9 +67,11 @@ export class Signal implements Promise, Resolveable { * @param value */ resolve(value: T): Resolveable { - const p = this.promise; - this.promise = new ManualPromise(); - p.resolve(value); + if (!this.isCompleted) { + const p = this.promise; + this.promise = new ManualPromise(); + p.resolve(value); + } return this; } @@ -80,13 +82,17 @@ export class Signal implements Promise, Resolveable { * @param value */ reject(reason: any) { - const p = this.promise; - this.promise = new ManualPromise(); - p.reject(reason); + if (!this.isCompleted) { + const p = this.promise; + this.promise = new ManualPromise(); + p.reject(reason); + } return this; } - dispose() { - this.promise.resolve(); + dispose(value?: T) { + if (!this.isCompleted) { + this.promise.resolve(value); + } } } diff --git a/Extension/src/Utility/Async/sleep.ts b/Extension/src/Utility/Async/sleep.ts index 509c887747..9d42d56989 100644 --- a/Extension/src/Utility/Async/sleep.ts +++ b/Extension/src/Utility/Async/sleep.ts @@ -3,7 +3,12 @@ * See 'LICENSE' in the project root for license information. * ------------------------------------------------------------------------------------------ */ -import { setTimeout as after } from 'timers/promises'; +import { setTimeout as after, setImmediate } from 'timers/promises'; /** pause for a number of milliseconds */ export const sleep = after as (msec: number) => Promise; + +/** enqueue the call to the callback function to happen on the next available tick, and return a promise to the result */ +export function then(callback: () => Promise | T): Promise { + return setImmediate().then(callback); +} diff --git a/Extension/src/Utility/Async/timeout.ts b/Extension/src/Utility/Async/timeout.ts index c59b9ec787..fea944416c 100644 --- a/Extension/src/Utility/Async/timeout.ts +++ b/Extension/src/Utility/Async/timeout.ts @@ -8,13 +8,15 @@ import { returns } from './returns'; import { sleep } from './sleep'; /** wait on any of the promises to resolve, or if the timeout is reached, throw */ -export async function timeout(msecs: number, ...promises: Promise[]): Promise { +export async function timeout(msecs: number, ...promises: Thenable[]): Promise { // get a promise for the timeout const t = sleep(msecs).then(() => fail(`Timeout expired after ${msecs}ms`)); - // wait until either the timout expires or one of the promises resolves - await Promise.race([t, ...promises]); + // wait until either the timeout expires or one of the promises resolves + const result = await Promise.race([t, ...promises]); // tag the timeout with a catch to prevent unhandled rejection t.catch(returns.undefined); + + return result; } diff --git a/Extension/src/Utility/Eventing/descriptor.ts b/Extension/src/Utility/Eventing/descriptor.ts new file mode 100644 index 0000000000..047b5a0cc9 --- /dev/null +++ b/Extension/src/Utility/Eventing/descriptor.ts @@ -0,0 +1,62 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +import { is } from '../System/guards'; +import { hierarchy } from '../System/info'; +import { getOrAdd } from '../System/map'; +import { smash } from '../Text/identifiers'; +import { ArbitraryObject } from './interfaces'; + +const ignore = new Set(['Object', 'Emitter']); + +/** A set of descriptors for describing the context of an Event Emitter */ +export class Descriptors extends Map> { + static none = new Descriptors(); + + constructor(instance?: ArbitraryObject, descriptors?: Record>) { + super(); + + if (instance) { + if (instance instanceof Descriptors) { + // inherit whatever is in that instance + instance.forEach((value, key) => this.add(key, ...value)); + } else { + // add all of the class names of the instance to the set of descriptors + for (const c of hierarchy(instance)) { + if (!ignore.has(c)) { + this.add(c, ''); + } + } + } + } + + // add the specified descriptors + if (descriptors) { + Object.getOwnPropertyNames(descriptors).forEach(key => { + const value = descriptors[key]; + if (!(value instanceof Function)) { + const v = descriptors[key]; + if (is.array(v)) { + this.add(key, ...v); + } else if (is.string(v)) { + this.add(key, v); + } + } + }); + } + } + + override get(key: string): Set | undefined { + return super.get(smash(key)); + } + + add(key: string, ...values: string[]) { + if (values.length) { + const set = getOrAdd(this, smash(key), () => new Set()); + values.forEach(each => set.add(each)); + } + } +} + diff --git a/Extension/src/Utility/Eventing/dispatcher.ts b/Extension/src/Utility/Eventing/dispatcher.ts new file mode 100644 index 0000000000..a739b57571 --- /dev/null +++ b/Extension/src/Utility/Eventing/dispatcher.ts @@ -0,0 +1,502 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +/* eslint-disable @typescript-eslint/no-unused-vars */ +/* eslint-disable @typescript-eslint/unified-signatures */ + +import { readFile } from 'node:fs/promises'; +import { ManualPromise } from '../Async/manualPromise'; +import { ManualSignal } from '../Async/manualSignal'; +import { returns } from '../Async/returns'; +import { filepath } from '../Filesystem/filepath'; +import { hasErrors } from '../Sandbox/interfaces'; +import { Sandbox } from '../Sandbox/sandbox'; +import { collectGarbage } from '../System/garbageCollector'; +import { is } from '../System/guards'; +import { isAnonymousObject, members, typeOf } from '../System/info'; +import { getOrAdd } from '../System/map'; +import { verbose } from '../Text/streams'; +import { Descriptors } from './descriptor'; +import { parse } from './eventParser'; +import { ArbitraryObject, Callback, Continue, EventData, EventStatus, Subscriber, Subscription, Unsubscribe } from './interfaces'; + +interface Event { + readonly name: string; + readonly descriptors: Descriptors; + + completed?: ManualPromise; + readonly variableArgs: any[]; + source?: ArbitraryObject; + data?: TInput; + text?: string; +} + +const sandbox = new Sandbox(); + +const syncHandlers = new Map(); +const asyncHandlers = new Map(); + +const queue = new Array>(); +const current = new Set(); + +// eslint-disable-next-line @typescript-eslint/naming-convention +export const DispatcherBusy = new ManualSignal(); + +/** starts the processing of the event queue. */ +async function drain() { + DispatcherBusy.reset(); + let event: Event | undefined; + // eslint-disable-next-line no-cond-assign + while (event = queue.shift()) { + await dispatch(event); + } + DispatcherBusy.resolve(); +} + +/** dispatch the applicable handlers for an event */ +async function dispatch(event: Event): Promise { + // check the sync handlers first + let resultValue: EventStatus | TResult | undefined = Continue; + + // sync handlers run and await one at a time + // technically, it's possible for other events to run while a sync handler is running + // but that doesn't make any difference; the sync handler will still run to completion + // before the next handler is dispatched. + for (const [callback, captures] of getHandlers(event, syncHandlers)) { + try { + // keep track of which handlers are currently running + current.add(callback); + + // call the callback, collate the result. + let r = callback(event as EventData, ...captures); + r = is.promise(r) ? await r.catch(e => { + console.error(e); + return undefined; + }) : r; + + // if it is an event/request (as opposed to a notification), then process it. + if (is.promise(event.completed)) { + // if they returned some kind of value, then use that as the result, otherwise, use the default + resultValue = r as TResult | EventStatus; + + if (is.cancelled(resultValue)) { + return event.completed.resolve(resultValue); // the event has been cancelled + } + } + } catch (e: any) { + console.error(e); + // if the handler throws, it isn't a reason to cancel the event + } finally { + // clear the callback from the current set + current.delete(callback); + } + } + + // then the async handlers (for events with possible result handling) + + if (!is.promise(event.completed)) { + // no event.completed, which means this is a notifier + // since notifiers are not cancellable, we can run them all in parallel + // and they don't need to worry about reentrancy + for (const [callback, captures] of getHandlers(event, asyncHandlers)) { + // call the event handler, but don't await it + // we don't care about the result, and we don't want to block + // (if the handler throws, too bad) + try { void callback(event as EventData, ...captures); } catch (e: any) { + console.error(e); + /* ignore */ + } + } + return; + } + // this is an event/request (supports a result or cancellation) + // when these are called, they are permitted to work in parallel, and we await them all at the end + // the first one to respond with a non-Continue result will be the result of the event + // (if a handler wants to cancel the event before others run, it should be marked with 'await' so that it runs first) + const results = new Array>(resultValue); + + for (const [callback, captures] of getHandlers(event, asyncHandlers)) { + // keep track of which handlers are currently running + current.add(callback); + + // call the event handler, but capture the result + try { + const r = callback(event as EventData, ...captures); + results.push(is.promise(r) ? r.catch(returns.undefined).finally(() => current.delete(callback)) : r); + } catch (e: any) { + // if the handler throws, not our problem. + console.error(e); + } finally { + // we should remove it from the current set + current.delete(callback); + } + } + + // wait for all the async handlers to complete + // and return the first result that isn't 'Continue' + return event.completed.resolve((await Promise.all(results)).find((each: any) => each !== Continue)); +} + +function* getHandlers(event: Event, category: Map): Iterable<[Callback, string[]]> { + if (category.size === 0) { + return; + } + + loop: + for (const subscriber of [...category.get(event.name) || [], ...category.get('*') || []]) { + if (current.has(subscriber.handler)) { + // the current callback is executing, and is (either directly or indirectly) the source of the event + // so, we don't want to execute it again. + continue; + } + + // when the subscriber is bound to a specific object, then the source must match + if (subscriber.eventSource && subscriber.eventSource.deref() !== event.source) { + continue; + } + + const captures = [] as string[]; + + // now we can check discriminators to see if they match + for (const [name, discriminator] of subscriber.filters) { + // verify we have a matching descriptor/eventname in the set + + // get the descriptor text values + const strings = name === event.name || name === '*' ? [] : event.descriptors.get(name); + if (!strings) { + // the event name isn't a match (or wildcard), and it doesn't have a descriptor with that name + continue loop; + } + + if (discriminator === true) { + continue; + } + + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + if (!discriminator(event.data || event.source, [...strings, event.text!], captures)) { + // the filter (if it exists) didn't match, so skip this handler + continue loop; + } + } + + // looks like we have a match + yield [subscriber.handler, captures]; + } +} +const boundSubscribers = new WeakMap void)[]>(); +const autoUnsubscribe = new FinalizationRegistry((unsubscribe: () => void) => { + unsubscribe(); +}); + +export function removeAllListeners(eventSrc: ArbitraryObject) { + if (eventSrc) { + // call unsubscribe + const all = boundSubscribers.get(eventSrc); + if (all) { + verbose(`Unsubscribing all from ${typeOf(eventSrc)}`); + for (const unsubscribe of all) { + unsubscribe(); + } + } + autoUnsubscribe.unregister(eventSrc); + collectGarbage(); + } +} + +/** Subscribe to an event given a trigger expression */ +export function on(triggerExpression: string, callback: Callback, eventSrc?: ArbitraryObject): Unsubscribe { + // parse the event expression into a chain of checks + const [isSync, once, filters, eventSource] = parse(triggerExpression, eventSrc); + out: + if ((global as any).DEVMODE && is.emitter(eventSrc)) { + const filterNames = [...filters.keys()]; + for (const filterName of filterNames) { + if (eventSrc.isKnownEvent(filterName)) { + break out; + } + } + // this is not always an error (as an emitter may not know about all the events it emits in advance) + // but I like to know if it's happening so I can fix it if I can. + verbose(`Handler with ${filterNames} [${triggerExpression}] has no events in ${typeOf(eventSrc)}`); + } + const subscriber = { + filters, + eventSource: eventSource ? new WeakRef(eventSource) : undefined, + handler: undefined as any + } as Subscriber; + + // pick the right subscription map depending on if it is an await call or not + const subscription = isSync ? syncHandlers : asyncHandlers; + + for (const eventName of filters.keys()) { + // add the handler to the front of the array for that event + // (since we want newer handlers to run first) + getOrAdd(subscription, eventName, []).unshift(subscriber); + } + + // create a function that will remove the handler from the chain + const unsubscribe = () => { + for (const eventName of filters.keys()) { + // remove it from the queue from whence it came + const subscribers = subscription.get(eventName); + if (subscribers) { + const i = subscribers.indexOf(subscriber); + if (i >= 0) { + subscribers.splice(i, 1); + // if there are no more listeners for that handler, remove the array too. + if (subscribers.length === 0) { + subscription.delete(eventName); + } + } + } + } + }; + + // setup auto unsubscribe when a bound object is garbage collected + if (eventSource) { + autoUnsubscribe.register(eventSource, unsubscribe); + getOrAdd(boundSubscribers, eventSource, []).push(unsubscribe); + } + + // set the callback into the handler object (with auto-unsubscribe if it is a 'once' handler) + subscriber.handler = once ? (...args) => { unsubscribe(); return callback(...args); } : callback; + + return unsubscribe; +} + +/** Subscribe to an event given a trigger expression, only for a single time */ +export function once(triggerExpression: string, callback: Callback, eventSrc?: ArbitraryObject): Unsubscribe { + return on(`once ${triggerExpression}`, callback, eventSrc); +} + +export function subscribe(subscriber: Record, options?: { bindAll?: boolean; eventSource?: ArbitraryObject }): Unsubscribe; +export function subscribe(subscriber: string, options?: { folder?: string; bindAll?: boolean; eventSource?: ArbitraryObject; once?: boolean }): Promise; +export function subscribe>(subscriber: Promise>, options?: { bindAll?: boolean; eventSource?: ArbitraryObject }): Promise; +export function subscribe(subscriber: Record, options?: { folder: string; bindAll?: boolean; eventSource?: ArbitraryObject }): Promise; +export function subscribe>(subscriber: Subscription, options?: { bindAll?: boolean; eventSource?: ArbitraryObject }): Unsubscribe; +export function subscribe>(subscriber: Promise> | string | Subscription | Record, options: { folder?: string; bindAll?: boolean; eventSource?: ArbitraryObject; once?: boolean } = {}): Unsubscribe | Promise { + if (is.promise(subscriber)) { + return subscriber.then((sub) => subscribe(sub, options)); + } + + const { properties, fields, methods } = members(subscriber); + + if (options.folder) { + subscriber = subscriber as Record; + return (async () => { // this has to be async - we may be pulling data from a file... + const unsubs = new Array(); + + // if a folder is passed in, then we're subscribing to *members* that are strings (either actual function-lets or strings that are the names of files that contain code) + for (const [name, _type] of [...properties, ...fields]) { + // this is a string property, so it might be an event handler + const text = subscriber[name] as string; + + try { + const filename = await filepath.isFile(text, options.folder); + if (filename) { + // it is a file, so load it as a function-let + const code = await readFile(filename, 'utf8'); + const fn = sandbox.createFunction(code, ['event'], { filename }); + if (hasErrors(fn)) { + for (const each of fn) { + console.error(each); + } + throw new Error(`Error loading ${filename}: ${fn}`); + } + unsubs.push(on(options.once ? `once ${name}` : name, fn as Callback, options.eventSource)); + continue; + } + + // if it's not a file, then treat it as a function-let + const fn = sandbox.createFunction(text, ['event'], { filename: `launch.json/${name}` }); + if (hasErrors(fn)) { + for (const each of fn) { + console.error(each); + } + throw new Error(`Error loading ${name}: ${fn}`); + } + unsubs.push(on(options.once ? `once ${name}` : name, fn as Callback, options.eventSource)); + } catch (e: any) { + console.error(e); + // if that fails + continue; + } + } + + return () => unsubs.forEach((u) => u()); + })(); + + } + + // otherwise, we're subscribing to members that are functions + const unsubs = new Array(); + for (const [name, info] of methods) { + if (options.bindAll || info.hasNonWordCharacters || isAnonymousObject(subscriber)) { + // subscribe this function, (ensure it's an async function) + unsubs.push(on(options.once ? `once ${name}` : name, info.fn as Callback, options.eventSource)); + } + } + return () => unsubs.forEach((u) => u()); +} + +export function reset() { + syncHandlers.clear(); + asyncHandlers.clear(); +} + +function expandVariableArgs(variableArgs: any[], event: Event): Event { + const [first, second, third] = variableArgs; + + switch (event.variableArgs.length) { + case 0: + event.text = ''; + event.data = undefined; + event.source = undefined; + return event; + + case 1: + if (typeof first === 'string') { + event.text = first; + } else { + event.text = ''; + event.data = first; + } + return event; + case 2: + if (typeof first === 'string') { + event.text = first; + event.data = second; + } else { + if (typeof second === 'string') { + event.text = second; + event.source = first; + event.data = undefined; + } else { + event.text = ''; + event.source = first; + event.data = second; + } + } + return event; + case 3: + event.source = first; + event.text = second; + event.data = third; + return event; + } + throw new Error('Invalid number of arguments'); +} + +function isSubscribed(name: string) { + return syncHandlers.has(name) || asyncHandlers.has(name) || asyncHandlers.has('*') || syncHandlers.has('*'); +} + +/** adds an event to the queue, to be dispatched when it is unqueued */ +export async function emit(name: string, descriptors: Descriptors, text: string): Promise; +export async function emit(name: string, descriptors: Descriptors, data: ArbitraryObject): Promise; +export async function emit(name: string, descriptors: Descriptors, text: string, data: ArbitraryObject): Promise; +export async function emit(name: string, descriptors: Descriptors, source: ArbitraryObject, text: string): Promise; +export async function emit(name: string, descriptors: Descriptors, source: ArbitraryObject, data: ArbitraryObject): Promise; +export async function emit(name: string, descriptors: Descriptors, source: ArbitraryObject, text: string, data: ArbitraryObject): Promise; +export async function emit(name: string, text: string): Promise; +export async function emit(name: string, data: ArbitraryObject): Promise; +export async function emit(name: string, text: string, data: ArbitraryObject): Promise; +export async function emit(name: string): Promise; +export async function emit(name: string, ...variableArgs: any[]): Promise { + // quickly check if there are any possible handlers for this event + if (isSubscribed(name)) { + const descriptors = variableArgs[0] instanceof Descriptors ? variableArgs.shift() : Descriptors.none; + + // create a promise that will be resolved when the event is dispatched + const result = new ManualPromise(); + + // add the event to the queue + queue.push(expandVariableArgs(variableArgs, { name, variableArgs, descriptors, completed: result })); + + // if the queue was empty, start it draining the queue + if (DispatcherBusy.isCompleted) { + void drain(); // don't wait for the queue to finish draining + } + + // return the promise + return result; + } + return Continue; +} + +/** immediately dispatches an event */ +export async function emitNow(name: string, descriptors: Descriptors, text: string): Promise; +export async function emitNow(name: string, descriptors: Descriptors, data: ArbitraryObject): Promise; +export async function emitNow(name: string, descriptors: Descriptors, text: string, data: ArbitraryObject): Promise; +export async function emitNow(name: string, descriptors: Descriptors, source: ArbitraryObject, text: string): Promise; +export async function emitNow(name: string, descriptors: Descriptors, source: ArbitraryObject, data: ArbitraryObject): Promise; +export async function emitNow(name: string, descriptors: Descriptors, source: ArbitraryObject, text: string, data: ArbitraryObject): Promise; +export async function emitNow(name: string, text: string): Promise; +export async function emitNow(name: string, data: ArbitraryObject): Promise; +export async function emitNow(name: string, text: string, data: ArbitraryObject): Promise; +export async function emitNow(name: string): Promise; +export async function emitNow(name: string, ...variableArgs: any[]): Promise { + // quickly check if there are any possible handlers for this event + if (isSubscribed(name)) { + const descriptors = variableArgs[0] instanceof Descriptors ? variableArgs.shift() : Descriptors.none; + + // create a promise that will be resolved when the event is dispatched + const result = new ManualPromise(); + + // dispatch the event immediately (the result comes from inside the EventDetails) + void dispatch(expandVariableArgs(variableArgs, { name, descriptors, variableArgs, completed: result })); + + // return the result promise + return result; + } + return Continue; +} + +/** adds an event to the queue, to be dispatched when it is unqueued */ +export function notify(name: string, descriptors: Descriptors, text: string): void; +export function notify(name: string, descriptors: Descriptors, data: ArbitraryObject): void; +export function notify(name: string, descriptors: Descriptors, text: string, data: ArbitraryObject): void; +export function notify(name: string, descriptors: Descriptors, source: ArbitraryObject, text: string): void; +export function notify(name: string, descriptors: Descriptors, source: ArbitraryObject, data: ArbitraryObject): void; +export function notify(name: string, descriptors: Descriptors, source: ArbitraryObject, text: string, data: ArbitraryObject): void; +export function notify(name: string, text: string): void; +export function notify(name: string, text: string, data: ArbitraryObject): void; +export function notify(name: string, data: ArbitraryObject): void; +export function notify(name: string): void; +export function notify(name: string, ...variableArgs: any[]): void { + // quickly check if there are any possible handlers for this event + if (isSubscribed(name)) { + const descriptors = variableArgs[0] instanceof Descriptors ? variableArgs.shift() : Descriptors.none; + + // add the event to the queue + queue.push(expandVariableArgs(variableArgs, { name, variableArgs, descriptors })); + + // if the queue was empty, start it draining the queue + if (DispatcherBusy.isCompleted) { + void drain(); // don't wait for the queue to finish draining + } + } +} + +/** immediately dispatches an event */ +export function notifyNow(name: string, descriptors: Descriptors, text: string): void; +export function notifyNow(name: string, descriptors: Descriptors, data: ArbitraryObject): void; +export function notifyNow(name: string, descriptors: Descriptors, text: string, data: ArbitraryObject): void; +export function notifyNow(name: string, descriptors: Descriptors, source: ArbitraryObject, text: string): void; +export function notifyNow(name: string, descriptors: Descriptors, source: ArbitraryObject, data: ArbitraryObject): void; +export function notifyNow(name: string, descriptors: Descriptors, source: ArbitraryObject, text: string, data: ArbitraryObject): void; +export function notifyNow(name: string, text: string): void; +export function notifyNow(name: string, data: ArbitraryObject): void; +export function notifyNow(name: string, text: string, data: ArbitraryObject): void; +export function notifyNow(name: string): void; +export function notifyNow(name: string, ...variableArgs: any[]): void { + // quickly check if there are any possible handlers for this event + if (isSubscribed(name)) { + const descriptors = variableArgs[0] instanceof Descriptors ? variableArgs.shift() : Descriptors.none; + + // dispatch the event immediately + void dispatch(expandVariableArgs(variableArgs, { name, descriptors, variableArgs })); + } +} diff --git a/Extension/src/Utility/Eventing/emitter.ts b/Extension/src/Utility/Eventing/emitter.ts new file mode 100644 index 0000000000..1892513cb8 --- /dev/null +++ b/Extension/src/Utility/Eventing/emitter.ts @@ -0,0 +1,279 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +/* eslint-disable @typescript-eslint/no-unused-vars */ +/* eslint-disable @typescript-eslint/unified-signatures */ +import { is } from '../System/guards'; +import { smash } from '../Text/identifiers'; +import { Descriptors } from './descriptor'; +import { emit, emitNow, notify, notifyNow, on, removeAllListeners, subscribe } from './dispatcher'; +import { ArbitraryObject, Callback, Cancelled, Continue, EventStatus, Subscription } from './interfaces'; + +export interface EventOptions { + now?: boolean; + default?: TOutput | Promise | (() => TOutput) | (() => Promise); + cancel?(): TOutput | never; + descriptors?: Record; + once?: boolean; +} + +export interface WithDefault { + default(): TOutput; +} + +export abstract class Emitter { + + readonly descriptors = new Descriptors(this); + #knownEvents = new Set(); + + isKnownEvent(event: string) { + return !!this.#knownEvents.has(event); + } + + /** adds an event to the queue, to be dispatched when it is unqueued */ + protected async emit(event: string, text: string): Promise; + protected async emit(event: string, data: ArbitraryObject): Promise; + protected async emit(event: string, text: string, data: ArbitraryObject): Promise; + protected async emit(event: string, tOrD: any, data?: ArbitraryObject): Promise { + return data ? + emit(event, this.descriptors, this, tOrD, data) : + emit(event, this.descriptors, this, tOrD); + } + + /** immediately dispatches an event */ + protected async emitNow(event: string, text: string): Promise; + protected async emitNow(event: string, data: ArbitraryObject): Promise; + protected async emitNow(event: string, text: string, data: ArbitraryObject): Promise; + protected async emitNow(event: string, tOrD: any, data?: ArbitraryObject): Promise { + return data ? + emitNow(event, this.descriptors, this, tOrD, data) : + emitNow(event, this.descriptors, this, tOrD); + } + + /** adds a notification event to the queue, to be dispatched when it is unqueued */ + protected notify(event: string, text: string): void; + protected notify(event: string, data: ArbitraryObject): void; + protected notify(event: string, text: string, data: ArbitraryObject): void; + protected notify(event: string, tOrD: any, data?: ArbitraryObject): void { + return data ? + notify(event, this.descriptors, this, tOrD, data) : + notify(event, this.descriptors, this, tOrD); + } + + /** immediately dispatches a notification event */ + protected notifyNow(event: string, text: string): void; + protected notifyNow(event: string, data: ArbitraryObject): void; + protected notifyNow(event: string, text: string, data: ArbitraryObject): void; + protected notifyNow(event: string, tOrD: any, data?: ArbitraryObject): void { + return data ? + notifyNow(event, this.descriptors, this, tOrD, data) : + notifyNow(event, this.descriptors, this, tOrD); + } + + /** + * Creates a named event function for triggering events in an {@link Emitter} + * + * @returns the created event trigger function of type `() => Promise` + * + * @remarks When the trigger is invoked, the event handler can return one of the following: + * - {@link Continue} (or `undefined`) - the event is not cancelled, and execution should continue normally. + * - {@link Cancelled} - the event is requested to be cancelled (there is no guarantee however.) + * + * @param eventName - the string name of the event + * @param options - options for the event trigger + */ + protected newEvent(eventName: string, options?: EventOptions): () => Promise; + + /** + * Creates a named event function for triggering events in an {@link Emitter} + * @template TOutput - the expected output type of of the event handler function. + * + * @returns the created event trigger function of type `() => Promise` + * + * @remarks When the trigger is invoked, the event handler can return one of the following: + * - `` - an value of type `` - the event is not cancelled, and the emitter can use the data returned. + * - {@link Continue} (or `undefined`) - the event is not cancelled, and execution should continue normally. + * - {@link Cancelled} - the event is requested to be cancelled (there is no guarantee however.) + * + * @param eventName - the string name of the event + * @param options - options for the event trigger (default: `{now: false}`) + */ + protected newEvent(eventName: string, options?: EventOptions): () => Promise; + + /** + * Creates a named event function for triggering events in an {@link Emitter} + * @template TData - the expected input type of the event handler function. + * @template TOutput - the expected output type of of the event handler function. + * + * @returns the created event trigger function of type `(input:TData) => Promise` + * + * @remarks When the trigger is invoked, the event handler can return one of the following: + * - `` - an value of type `` - the event is not cancelled, and the emitter can use the data returned. + * - {@link Continue} (or `undefined`) - the event is not cancelled, and execution should continue normally. + * - {@link Cancelled} - the event is requested to be cancelled (there is no guarantee however.) + * + * @param eventName - the string name of the event + * @param options - options for the event trigger (default: `{now: false}`) + */ + protected newEvent(eventName: string, options?: EventOptions): (input: TData) => Promise; + + /** + * Creates a named event function for triggering events in an {@link Emitter} + * @template TText - a text string that can be used to filter events during subscription + * @template TData - the expected input type of the event handler function. + * @template TOutput - the expected output type of of the event handler function. + * + * @returns the created event trigger function of type `(text: TText, input:TData) => Promise` + * + * @remarks When the trigger is invoked, the event handler can return one of the following: + * - `` - an value of type `` - the event is not cancelled, and the emitter can use the data returned. + * - {@link Continue} (or `undefined`) - the event is not cancelled, and execution should continue normally. + * - {@link Cancelled} - the event is requested to be cancelled (there is no guarantee however.) + * + * @param eventName - the string name of the event + * @param options - options for the event trigger (default: `{now: false}`) + */ + protected newEvent(eventName: string, options?: EventOptions): (text: TText, data: TData) => Promise; + protected newEvent(eventName: string, options?: EventOptions & WithDefault): () => Promise; + protected newEvent(eventName: string, options?: EventOptions & WithDefault): (input: TData) => Promise; + protected newEvent(eventName: string, options?: EventOptions & WithDefault): (text: TText, data: TData) => Promise; + protected newEvent(eventName: string, options?: EventOptions & WithDefault): (text: TText, data: TData) => Promise { + eventName = smash(eventName); + this.#knownEvents.add(eventName); + const descriptors = options?.descriptors ? new Descriptors(this.descriptors, options.descriptors) : this.descriptors; + // is it an immediate event? + if (options?.now) { + return async (input?: TText, data?: TData): Promise => { + switch (options?.once) { + case false: + // already triggered this one time event. + return; + + case true: + options.once = false; + } + // trigger the event + const result = await ((data !== undefined) ? + emitNow(eventName, descriptors, this, input || '', data as any) : // text and data + emitNow(eventName, descriptors, this, input || '', input as any)); // text or data (or neither) + + return is.cancelled(result) ? // was the event cancelled? + options?.cancel?.() || Cancelled : // the event was cancelled - call the cancel function, or return Cancelled + is.continue(result) ? // was the event continued (handler returned nothing)? + is.function(options?.default) ? // the event is continued, is the default handler a function? + options?.default() : // the default is a function, call it. + options?.default || Continue : // the default is a value, call it (or just return Continue) + result as TOutput; // the event was not cancelled, and the handler returned a value. + }; + } + + // otherwise queue it + return async (input?: TText, data?: TData): Promise => { + switch (options?.once) { + case false: + // already triggered this one time event. + return; + + case true: + options.once = false; + } + // trigger the event + const result = await ((data !== undefined) ? + emit(eventName, descriptors, this, input || '', data as any) : // text and data + emit(eventName, descriptors, this, input || '', input as any)); // text or data (or neither) + + return is.cancelled(result) ? // was the event cancelled? + options?.cancel?.() || Cancelled : // the event was cancelled - call the cancel function, or return Cancelled + is.continue(result) ? // was the event continued (handler returned nothing)? + is.function(options?.default) ? // the event is continued, is the default handler a function? + options?.default() : // the default is a function, call it. + options?.default || Continue : // the default is a value, call it (or just return Continue) + result as TOutput; // the event was not cancelled, and the handler returned a value. + }; + } + + /** notification with event name, but no data in the event. */ + protected newNotification(eventName: string, options?: EventOptions): () => void; + + /** notification with event name, and some data (of ) */ + protected newNotification(eventName: string, options?: EventOptions): (input: TData) => void; + + /** notification with an event name, an event string , and some data */ + protected newNotification(eventName: string, options?: EventOptions): (text: TText, data: TData) => void; + protected newNotification(eventName: string, options?: EventOptions): (text: TText, data: TData) => void { + eventName = smash(eventName); + this.#knownEvents.add(eventName); + const descriptors = options?.descriptors ? new Descriptors(this.descriptors, options.descriptors) : this.descriptors; + // is it an immediate event? + if (options?.now) { + return (input?: TText, data?: TData): void => { + switch (options.once) { + case false: + // already triggered this one time event. + return; + + case true: + options.once = false; + } + // trigger the event + return (data !== undefined) ? + notifyNow(eventName, descriptors, this, input || '', data as any) : // text and data + notifyNow(eventName, descriptors, this, input || '', input as any); // text or data (or neither) + }; + } + + // otherwise queue it + + return (input?: TText, data?: TData): void => { + switch (options?.once) { + case false: + // already triggered this one time event. + return; + + case true: + options.once = false; + } + // trigger the event + return (data !== undefined) ? + notify(eventName, descriptors, this, input || '', data as any) : // text and data + notify(eventName, descriptors, this, input || '', input as any); // text or data (or neither) + }; + } + + /** subscribe to events (assumes 'this' modifier, and handler is filtered to the instance) */ + on(eventExpression: string, callback: Callback) { + return on(`this ${eventExpression}`, callback, this); + } + /** subscribe to events (assumes 'this' modifier, and handler is filtered to the instance) */ + once(eventExpression: string, callback: Callback) { + return on(`this once ${eventExpression}`, callback, this); + } + + /** subscribe directly to events on this object */ + subscribe(): void; + subscribe(...subscribers: string[]): Promise; + subscribe>(...subscribers: Subscription[]): void; + subscribe>(...subscribers: string[] | Subscription[]): void | Promise { + if (subscribers.length === 0) { + return subscribe(this as unknown as Subscription, { eventSource: this }) && undefined; + } + if (typeof subscribers[0] === 'string') { + return Promise.all(subscribers.map(each => subscribe(each as string, { eventSource: this }))) as unknown as Promise; + } + + for (const each of subscribers as ArbitraryObject[]) { + subscribe(each, { eventSource: this }); + } + } + + removeAllListeners() { + removeAllListeners(this); + } + + wait(eventExpression: string, _timeout?: number): Promise { + return new Promise((e: () => void) => this.on(eventExpression, e)); + } +} + diff --git a/Extension/src/Utility/Eventing/eventParser.ts b/Extension/src/Utility/Eventing/eventParser.ts new file mode 100644 index 0000000000..fb9cc6e485 --- /dev/null +++ b/Extension/src/Utility/Eventing/eventParser.ts @@ -0,0 +1,262 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +import { hasErrors } from '../Sandbox/interfaces'; +import { Sandbox } from '../Sandbox/sandbox'; +import { first } from '../System/array'; +import { smash } from '../Text/identifiers'; +import { Kind, Scanner, Token } from '../Text/scanner'; +import { verbose } from '../Text/streams'; +import { ArbitraryObject, Filter } from './interfaces'; + +/* eslint-disable @typescript-eslint/no-non-null-assertion */ + +// ensure that array gets the first function, we need it for the discriminator +// eslint-disable-next-line no-unused-expressions +first; + +function isKeyword(token: Token) { + return token.kind > Kind.KeywordsStart && token.kind < Kind.KeywordsEnd; +} + +export function parse(triggerExpression: string, sourceToBindTo: ArbitraryObject | undefined): [boolean, boolean, Map, ArbitraryObject?] { + // + // [modifiers] event[filter]:discriminator[filter]/discriminator[filter]/discriminator[filter]... + // + + const scanner = new Scanner(triggerExpression).start(); + let token: Token; + + let once: boolean = false; + let source: any; + let isSync = false; + + // drop any leading whitespace + scanner.takeWhiteSpaceAndNewLines(); + + // grab modifiers off the front + while (isKeyword(token = scanner.take())) { + switch (token.kind) { + case Kind.OnceKeyword: + once = true; + break; + case Kind.ThisKeyword: + source = sourceToBindTo; + break; + case Kind.AwaitKeyword: + isSync = true; + break; + default: + throw new Error(`unexpected keyword ${token.kind}`); + } + scanner.takeWhiteSpaceAndNewLines(); + } + + const filters = new Map(); // + + function addFilter(name: string) { + scanner.takeWhiteSpaceAndNewLines(); + token = scanner.take(); + if (token.kind === Kind.OpenBracket) { + // has a filter expression of some kind. + filters.set(name, generateFilterFn(scanner)); + token = scanner.take(); + } else { + // if there isn't a filter, then we just need to add a filter with 'true' + filters.set(name, true); + } + scanner.takeWhiteSpaceAndNewLines(); + return token.kind === Kind.EndOfFile; + } + + processing: + do { + switch (token.kind) { + case Kind.EndOfFile: + break processing; + + case Kind.Slash: + // separator - skip this token (we can skip over multiple slashes, it's ok...) + token = scanner.take(); + continue; + + case Kind.Asterisk: + // match any event name + if (addFilter('*')) { + break processing; + } + break; + + case Kind.Identifier: + if (addFilter(smash(token.text))) { + break processing; + } + break; + + case Kind.OpenBracket: + // filter without event or discriminator name + filters.set('*', generateFilterFn(scanner)); + token = scanner.take(); + break; + + case Kind.Whitespace: + continue processing; + + default: + throw new Error(`unexpected token ${JSON.stringify(token)}`); + } + + if (token.kind === Kind.EndOfFile) { + break; + } + + // if the token isn't a separator or end of file, then it is an error + if (token.kind !== Kind.Slash) { + throw new Error(`unexpected token ${JSON.stringify(token)}`); + } + // eslint-disable-next-line no-constant-condition + } while (true); + + // for each discriminator[filter] + // get the descriptor name + // get the filter value + // the filter expression is a JavaScript expression. (special case: if a regex is a part of the expression, it's assumed to be applied against the text of the event data) + if (sourceToBindTo !== source) { + verbose(`source specified but 'this' not found in handler name or expression for '${triggerExpression}' `); + } + return [isSync, once, filters, source]; + +} + +const sandbox = new Sandbox(); + +function generateFilterFn(scanner: Scanner): Filter { + // take all the tokens until we hit a closing bracket + const inner = [...scanner.takeUntil(Kind.CloseBracket, { + nestable: [[Kind.OpenBracket, Kind.CloseBracket]], + escape: [Kind.Backslash] + })]; + + // a filter expression is one or more of: + // - a regular expression + // - a JavaScript expression + // separated by && or || + const expression = new Array(); + + // remove leading whitespace + eatWhitespace(inner); + + outer: + while (inner.length) { + eatWhitespace(inner); + let token = inner.shift()!; + + switch (token.kind) { + case Kind.Slash: { + // regular expression + // take all tokens until we hit a slash that isn't escaped + const rxExpression = [token]; + + while (inner.length) { + + token = inner.shift()!; + rxExpression.push(token); // store this token as part of the regex + + switch (token.kind) { + case Kind.Slash: + // now see if there are any flags + if (inner.length) { + token = inner[0]; + if (token.kind === Kind.Identifier) { + rxExpression.push(inner.shift()!); + } + } + // at this point, we should have the whole regex. + // turn this into an expression that tests against any $strings + expression.push(`(!!$strings.find( ($text)=> { const r = ${rxExpression.map(token => token.text).join('')}.exec($text); if( r ) { $captures.push( ...r ); return true; } } ))`); + continue outer; + + case Kind.Backslash: + // take the next token, and add it to the regex + rxExpression.push(inner.shift()!); + continue; + } + + // if we have nothing left, and we haven't closed the regex, then it's an error + if (!inner.length) { + throw new Error(`unterminated regular expression ${inner}`); + } + } + } + break; + + case Kind.OpenParen: + case Kind.CloseParen: + case Kind.BarBar: + case Kind.AmpersandAmpersand: + // add that token to the final expression + expression.push(token.text!); + break; + + case Kind.StringLiteral: + // if we're given a string literal and the next token after that is one of {||, &&, ]} + // then we can just use the string literal as a comparison + // otherwise it should be part of the JavaScript expression (i.e. ['foo'===bar]) + eatWhitespace(inner); + const peek = inner[0]; + if (peek) { + switch (peek.kind) { + case Kind.BarBar: + case Kind.AmpersandAmpersand: + case Kind.CloseBracket: + expression.push(`$strings.has(${token.text!})`); + continue outer; + } + } + + // eslint-disable-next-line no-fallthrough + default: + // anything else, take all the tokens until we hit a separator/terminator/the end + const js = [token]; + while (inner.length) { + token = inner.shift()!; + switch (token.kind) { + case Kind.BarBar: + case Kind.AmpersandAmpersand: + case Kind.CloseBracket: + // push the token back on the stack, and we're done + inner.unshift(token); + break; + default: + js.push(token); + continue; + } + break; + } + const jsExpression = js.map(each => each.text).join(''); + + // sandbox style, assumes $data is set to Event.data and $strings is the collection of strings for the discriminator or the event itself + expression.push(jsExpression.trim()); + break; + } + } + + // $data - either the event data or the event source object if there is no event data. + // $strings - a set of string values to match a regex with. + + const fn = sandbox.createFunction(`try { with($data) return ${expression.join(' ')} } catch ($e) { return false; }`, ['$data', '$strings', '$captures']); + + if (hasErrors(fn)) { + throw new Error(`invalid filter expression: ${expression.join(' ')}`); + } + + return fn; +} + +function eatWhitespace(tokens: Token[]) { + while (tokens.length && tokens[0].kind === Kind.Whitespace) { + tokens.shift(); + } +} diff --git a/Extension/src/Utility/Eventing/interfaces.ts b/Extension/src/Utility/Eventing/interfaces.ts new file mode 100644 index 0000000000..0165fcef12 --- /dev/null +++ b/Extension/src/Utility/Eventing/interfaces.ts @@ -0,0 +1,49 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +/* eslint-disable @typescript-eslint/naming-convention */ + +export interface EventData { + readonly name: string; + completed?: Promise; + readonly source?: ArbitraryObject; + readonly data: TInput; + readonly text: string; +} + +export interface Descriptor { + name: string; + values?: string[]; +} + +export type Unsubscribe = () => void; + +export type Callback = (event: EventData, ...args: any[]) => Promise | Promise | Promise | TOutput | EventStatus | undefined | void | Promise; + +export type PickByType = { + [P in keyof T as T[P] extends TKeepType ? P : never]: T[P] +}; + +export type Subscription = Record> = PickByType; + +export type ArbitraryObject = Record; + +export type EventStatus = 'Cancelled' | undefined; + +export const Cancelled = 'Cancelled'; +export const Continue = undefined; + +export type Filter = ($data: ArbitraryObject, $strings: string[], $captures: string[]) => boolean; + +export interface Subscriber { + /** the filter checks generated from the event registration */ + filters: Map; + + /** the source (aka 'this') value that must match if the handler is tied to an object */ + eventSource?: WeakRef; + + /** the event handler function itself */ + handler: Callback; +} diff --git a/Extension/src/Utility/Eventing/names.ts b/Extension/src/Utility/Eventing/names.ts new file mode 100644 index 0000000000..f5ddb3bc0f --- /dev/null +++ b/Extension/src/Utility/Eventing/names.ts @@ -0,0 +1,48 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +/* eslint-disable @typescript-eslint/naming-convention */ + +export class requests { + static readonly select = 'select'; + static readonly get = 'get'; +} + +// [noun]-[verb] +export class events { + static readonly writing = 'writing'; + static readonly reading = 'reading'; +} + +// output channel notifications +export class channels { + static readonly debug = 'debug'; + static readonly verbose = 'verbose'; + static readonly info = 'info'; + static readonly warning = 'warning'; + static readonly error = 'error'; + static readonly internal = 'internal'; +} + +/** Notifications */ +// [state] +// [pastTenseVerb]-[noun] +export class notifications { + static readonly ready = 'ready'; + static readonly exited = 'exited'; + static readonly started = 'started'; + static readonly stopped = 'stopped'; + static readonly connected = 'connected'; + static readonly disconnected = 'disconnected'; + + static readonly read = 'read'; // past-tense, so it's not confused with the reading verb + static readonly wrote = 'wrote'; // past-tense, so it's not confused with the writing verb + static readonly message = 'message'; +} + +/** Queries expect a value in return */ +export class queries { + static readonly selectBinary = 'select-binary'; +} diff --git a/Extension/src/Utility/Filesystem/filepath.ts b/Extension/src/Utility/Filesystem/filepath.ts new file mode 100644 index 0000000000..ea9d263dd1 --- /dev/null +++ b/Extension/src/Utility/Filesystem/filepath.ts @@ -0,0 +1,140 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +import { basename, delimiter, extname, join, normalize as norm, resolve } from 'path'; + +import { fail } from 'assert'; +import { randomBytes } from 'crypto'; +import { constants, Stats } from 'fs'; +import { stat } from 'fs/promises'; +import { tmpdir } from 'os'; +import { isWindows } from '../../constants'; +import { returns } from '../Async/returns'; +import { is } from '../System/guards'; + +export const normalize = isWindows ? (p: string) => norm(p).toLowerCase().replace(/^([a-z]\:)/, ($1) => $1.toUpperCase()) : norm; + +export function pathsFromVariable(environmentVariable: string = 'PATH'): string[] { + return process.env[environmentVariable]?.split(delimiter) || []; +} + +export async function filterToFolders(paths: string[]): Promise { + const set = new Set(paths); + for (const each of [...set.keys()]) { + if (!each || !await filepath.isFolder(each)) { + set.delete(each); + } + } + return [...set.keys()]; +} + +export interface Entry { + name: string; + fullPath: string; + isFolder: boolean; + isFile: boolean; + isLink: boolean; +} + +export interface File extends Entry { + extension: string; + basename: string; + isFolder: false; + isFile: true; + isExecutable: boolean; + size: number; +} + +export interface Folder extends Entry { + isFolder: true; + isFile: false; + isExecutable: false; +} + +// eslint-disable-next-line @typescript-eslint/naming-convention +export class filepath { + static async stats(name: string | undefined | Promise, baseFolder?: string): Promise<[string, Stats | undefined] | [undefined, undefined]> { + if (is.promise(name)) { + name = await name; + } + + // if the value isn't a string or has a newline, it ain't a file name + if (!name || name.indexOf('\n') !== -1) { + return [undefined, undefined]; + } + + // if we've been given a baseFolder, expand that, otherwise just normalize the value. + name = baseFolder ? resolve(baseFolder, name) : normalize(name); + + return [name, await stat(name).catch(returns.undefined)]; + } + + static async info(name: string | undefined | Promise, baseFolder?: string, executableExtensions: Set = process.platform === 'win32' ? new Set(['.exe'/* ,'.cmd','.bat' */]) : new Set()): Promise { + const [fullPath, stats] = await filepath.stats(name, baseFolder); + if (!stats) { + return undefined; + } + // create the entry + const entry = { + name: basename(fullPath), + fullPath, + isFolder: stats.isDirectory(), + isFile: stats.isFile(), + isLink: stats.isSymbolicLink() + } as File | Folder; + + if (entry.isFile) { + entry.size = stats.size; + + if (isWindows) { + const fp = fullPath.toLowerCase(); + entry.extension = extname(fp); + entry.basename = basename(fp, entry.extension); + entry.isExecutable = executableExtensions.has(entry.extension); + return entry; + } + entry.extension = extname(fullPath); + entry.basename = basename(fullPath, entry.extension); + // eslint-disable-next-line no-bitwise + entry.isExecutable = !!(stats.mode & (constants.S_IXUSR | constants.S_IXGRP | constants.S_IXOTH)); + return entry; + } + if (entry.isFolder) { + return entry; + } + + fail(new Error(`Unexpected file type for ${fullPath}`)); + } + + static async isFile(name: any | string | undefined | Promise, baseFolder?: string): Promise { + const [fullName, stats] = await filepath.stats(name, baseFolder); + return stats?.isFile() ? fullName : undefined; + } + + static async isFolder(name: string | undefined | Promise, baseFolder?: string): Promise { + const [fullName, stats] = await filepath.stats(name, baseFolder); + return stats?.isDirectory() ? fullName : undefined; + } + + static async exists(name: string | undefined | Promise, baseFolder?: string): Promise { + const [fullName, stats] = await filepath.stats(name, baseFolder); + return stats ? fullName : undefined; + } + + static async isExecutable(name: string | undefined | Promise, baseFolder?: string): Promise { + const info = await filepath.info(name, baseFolder); + return info?.isFile && info.isExecutable ? info.fullPath : undefined; + } + + static parent(name: Promise): Promise; + static parent(name: string | undefined): string | undefined; + static parent(name: string | undefined | Promise): string | undefined | Promise { + return is.promise(name) ? name.then(filepath.parent) : name ? normalize(resolve(name, '..')) : undefined; + } +} + +export function tmpFile(prefix = 'tmp.', suffix = '.tmp', folder = tmpdir()) { + return join(folder, prefix + randomBytes(32).toString('hex') + suffix); +} diff --git a/Extension/src/Utility/Filesystem/find.ts b/Extension/src/Utility/Filesystem/find.ts new file mode 100644 index 0000000000..8b8958b228 --- /dev/null +++ b/Extension/src/Utility/Filesystem/find.ts @@ -0,0 +1,223 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +/* eslint-disable @typescript-eslint/unified-signatures */ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ + +import { Dirent, constants } from 'fs'; +import { readdir, stat } from 'fs/promises'; +import { basename, extname, sep } from 'path'; +import { isWindows } from '../../constants'; +import { accumulator, foreach } from '../Async/iterators'; +import { ManualPromise } from '../Async/manualPromise'; +import { returns } from '../Async/returns'; +import { is } from '../System/guards'; +import { File, Folder, normalize } from './filepath'; + +interface FolderWithChildren extends Folder { + children?: Map; +} + +const cache = new Map>(); + +/** + * This reads a directory and returns a map of the files and folders in it + * It is quite tolerant of errors and reentrancy, so if multiple callers are trying to get the same results + * it will only do the work once per directory + * + * @param fullPath the full path of the folder to read + * @param executableExtensions a set of file extensions that are considered executable on Windows + * @returns a map of the files and folders in the directory, or undefined if the directory doesn't exist or is inaccessible. + */ +async function readDirectory(fullPath: string, executableExtensions: Set = process.platform === 'win32' ? new Set(['.exe'/* ,'.cmd','.bat' */]) : new Set()): Promise | undefined> { + // have we already read this directory? + let folder = cache.get(fullPath) as FolderWithChildren | undefined; + let promise: ManualPromise | undefined; + + if (!folder) { + // create a promise and insert it into the cache, so if something else comes looking before we do any async, they can await that + promise = new ManualPromise(); + cache.set(fullPath, promise); + + const stats = await stat(fullPath).catch(returns.undefined); + + if (!stats?.isDirectory()) { + // no results, return undefined. + promise.resolve(folder); + return undefined; + } + + folder = { + name: basename(fullPath), + fullPath, + isFolder: true, + isFile: false, + isLink: stats.isSymbolicLink() + } as FolderWithChildren; + } + + // if we are waiting on a promise + if (is.promise(folder)) { + folder = await folder; + } + + // if the target isn't a folder, it can't have children + if (!folder?.isFolder) { + return undefined; + } + + // if we haven't scanned this folder yet, do so now. + if (!folder.children) { + folder.children = new Map(); + + if (!is.promise(promise)) { + // if we didn't already have a promise, create one now. + // this can happen when the parent has scanned and added in the child but nobody has asked for the children yet. + promise = new ManualPromise(); + cache.set(fullPath, promise); + } + + // this doesn't use the path.info function because in this case, the direntry is already available, and on Windows we can skip a call to stat (which is expensive) + // process all the entries, and add them to the cache and the children map + await foreach(readdir(fullPath, { withFileTypes: true }).catch(returns.none), async (direntry: Dirent) => { + const name = direntry.name; + const fp = `${fullPath}${sep}${name}`; + if (cache.has(fp)) { + return; + } + // create the entry + const entry = { + name, + fullPath: fp, + isFolder: direntry.isDirectory(), + isFile: direntry.isFile(), + isLink: direntry.isSymbolicLink() + } as File | FolderWithChildren; + + if (entry.isFile) { + if (isWindows) { + entry.extension = extname(name.toLowerCase()); + entry.isExecutable = executableExtensions.has(entry.extension); + entry.basename = basename(name, entry.extension); + } else { + entry.basename = basename(name); + // in non-Windows platforms, we need to check the file mode to see if it's executable. + const stats = await stat(entry.fullPath).catch(returns.undefined); + if (!stats) { + return; + } + // eslint-disable-next-line no-bitwise + entry.isExecutable = !!(stats.mode & (constants.S_IXUSR | constants.S_IXGRP | constants.S_IXOTH)); + entry.extension = extname(name); + } + } + + // attach the child to the parent + (folder as FolderWithChildren).children!.set(name, entry); + + // keep the child in the cache too. + cache.set(entry.fullPath, entry); + + }); + cache.set(fullPath, folder as FolderWithChildren); + if (!promise!.isResolved) { + promise!.resolve(folder as FolderWithChildren); + } + + } + return folder.children; +} + +export async function scanFolder(folder: string, scanDepth: number, filePredicate?: (file: File) => Promise | boolean, folderPredicate?: (folder: FolderWithChildren) => Promise | boolean, files = accumulator()): Promise { + // should not have depth less than 0 + if (scanDepth < 0) { + return; + } + + // normalize the folder + folder = normalize(folder); + + // if we have already visited this folder, return + await foreach(readDirectory(folder), async ([_name, entry]) => { + if (entry.isFile) { + if (!filePredicate || await filePredicate(entry)) { + files.add(entry.fullPath); + } + return; + } + if (scanDepth && entry.isFolder && (!folderPredicate || await folderPredicate(entry))) { + await scanFolder(entry.fullPath, scanDepth - 1, filePredicate, folderPredicate, files); + } + }); +} + +/** The Finder searches paths to find executable given a name or regular expression. + * + * It can scan multiple paths, and can be configured to exclude folders. + * It can also scan into subfolders of the given folders to a specified depth. + * + */ +export class Finder implements AsyncIterable { + #excludedFolders = new Set(['winsxs', 'syswow64', 'system32']); + #files = accumulator().autoComplete(false); + files = this.#files.reiterable(); + + private match: (file: File) => Promise | boolean; + private promises = new Array>(); + + constructor(executableName: string); + constructor(executableRegEx: RegExp); + constructor(fileMatcher: (file: File) => Promise | boolean); + constructor(binary: string | RegExp | ((file: File) => Promise | boolean)) { + switch (typeof binary) { + case 'string': + this.match = (file: File) => file.isExecutable && file.basename === binary; + break; + case 'function': + this.match = binary; + break; + case 'object': + this.match = (file: File) => file.isExecutable && !!file.basename.match(binary); + break; + } + } + + static resetCache() { + cache.clear(); + } + + exclude(folder: string) { + this.#excludedFolders.add(folder); + } + + /** + * Add one or more locations to scan, with an optionally specified depth. + * + * The scanning of those locations begins immediately and is done asynchronously. + * + */ + scan(...location: (Promise | string)[]): Finder; + scan(depth: number, ...location: (Promise | string)[]): Finder; + scan(...location: (Promise | string | number)[]): Finder { + const depth = typeof location[0] === 'number' ? location.shift() as number : 0; + this.promises.push(...location.map(each => scanFolder(each.toString(), depth, this.match, (f) => !this.#excludedFolders.has(f.name), this.#files))); + return this; + } + + [Symbol.asyncIterator](): AsyncIterator { + this.#files.complete(); + return this.#files[Symbol.asyncIterator](); + } + + get results(): Promise> { + return Promise.all(this.promises).then(async () => { + const result = new Set(); + for await (const file of this) { + result.add(file); + } + return result; + }); + } +} diff --git a/Extension/src/Utility/Filesystem/ripgrep.ts b/Extension/src/Utility/Filesystem/ripgrep.ts new file mode 100644 index 0000000000..6e5e12ecc1 --- /dev/null +++ b/Extension/src/Utility/Filesystem/ripgrep.ts @@ -0,0 +1,147 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +/* eslint-disable @typescript-eslint/no-non-null-assertion */ + +import { strict } from 'assert'; +import { existsSync } from 'fs'; +import { accumulator } from '../Async/iterators'; +import { logAndReturn } from '../Async/returns'; +import { Process } from '../Process/process'; +import { ProcessFunction, Program } from '../Process/program'; +import { Instance } from '../System/types'; +import { filepath } from './filepath'; + +let ripgrep: Instance | undefined; +export async function initRipGrep(filename: string) { + if (!ripgrep) { + const rg = await filepath.isExecutable(filename); + strict(rg, `File ${filename} is not executable`); + ripgrep = await new Program(filename); + } +} + +export class FastFinder implements AsyncIterable { + private keepOnlyExecutables: boolean; + private executableExtensions = new Array(); + private processes = new Array>(); + private pending = 0; + private readyToComplete = false; + private distinct = new Set(); + + #files = accumulator().autoComplete(false); + + [Symbol.asyncIterator](): AsyncIterator { + this.readyToComplete = true; + if (this.pending === 0) { + this.#files.complete(); + } + + return this.#files[Symbol.asyncIterator](); + } + + constructor(private fileGlobs: string[], options?: { executable?: boolean; executableExtensions?: string[] }) { + strict(ripgrep, 'initRipGrep must be called before using FastFinder'); + + this.keepOnlyExecutables = options?.executable ?? false; + if (this.keepOnlyExecutables && process.platform === 'win32') { + this.executableExtensions = options?.executableExtensions ?? ['.exe', '.bat', '.cmd', '.ps1']; + } + } + + /** + * Add one or more locations to scan, with an optionally specified depth. + * + * The scanning of those locations begins immediately and is done asynchronously. + * + */ + scan(...location: string[]): FastFinder; + scan(depth: number, ...location: string[]): FastFinder; + scan(...location: (string | number)[]): FastFinder { + const depth = (typeof location[0] === 'number' ? location.shift() as number : 0) + 1; + const globs = this.executableExtensions.length ? + this.fileGlobs.map(glob => this.executableExtensions.map(ext => glob.includes('**') ? glob : `**/${glob}${ext}`)).flat() : + this.fileGlobs.map(glob => glob.includes('**') ? glob : `**/${glob}`); + + // only search locations that exist + location = location.filter(each => existsSync(each.toString())); + + // only search if there are globs and locations to search + if (globs.length && location.length) { + this.pending++; + void ripgrep!(...globs.map(each => ['--glob', each]).flat(), '--max-depth', depth, '--null-data', '--no-messages', '-L', '--files', ...location.map(each => each.toString())).then(async proc => { + const process = proc as unknown as Instance; + this.processes.push(process); + for await (const line of process.stdio) { + if (this.distinct.has(line)) { + continue; + } + this.distinct.add(line); + if (!this.keepOnlyExecutables || await filepath.isExecutable(line)) { + this.#files.add(line); + } + } + }).catch(logAndReturn.undefined).finally(() => { + this.pending--; + if (this.readyToComplete && this.pending === 0) { + this.#files.complete(); + } + }); + } + return this; + } +} + +interface MatchData { + path: { + text: string; + }; + lines: { + text: string; + }; + line_number: number; + absolute_offset: number; + submatches: unknown[]; +} + +interface RipGrepMatch { + type: 'match'; + data: MatchData; +} + +function isMatch(obj: Record): obj is RipGrepMatch { + return obj.type === 'match' && obj.data.path && obj.data.lines; +} + +/** Calls RipGrep looking for strings */ +export async function* ripGrep(target: string, regex: string, options?: { glob?: string; binary?: boolean; encoding?: 'utf-16' | 'utf-8'; ignoreCase?: boolean }): AsyncGenerator { + strict(ripgrep, 'initRipGrep must be called before using ripGrep'); + + const optionalArguments = new Array(); + if (options?.binary) { + optionalArguments.push('--binary'); + } + if (options?.encoding) { + optionalArguments.push('-E', options.encoding); + } + if (options?.glob) { + optionalArguments.push('--iglob', options.glob); + } + if (options?.ignoreCase) { + optionalArguments.push('--ignore-case'); + } + regex = regex.replace(/\?\': + case '{': + + if (!singleQuote && !doubleQuote) { + throw new Error(`Unsupported character: ${char}`); + } + break; + case '$': + if (!singleQuote) { + if (next === '(') { + if (argsString[i + 2] === '(') { + paren += 2; + i += 2; + arg += '$(('; + continue; + } + throw new Error(`Nested Commands not supported`); + } + if (next === '{') { + arg += '${'; + brace++; + i++; + continue; + } + } + break; + case '`': + if (!singleQuote) { + throw new Error(`Nested Commands not supported`); + } + break; + case ' ': + case '\t': + if (doubleQuote || singleQuote || paren || brace) { + break; + } + if (arg.length > 0) { + args.push(arg); + arg = ''; + } + continue; + } + arg += char; + } + if (arg.length > 0) { + args.push(arg); + } + + args = args.map(s => { + if (s.startsWith(`'`) && s.endsWith(`'`)) { + return `"${s}"`; + } + if (s.startsWith('$[') && s.endsWith(']')) { + return `${s}`; + } + return `'${s}'`; + }); + + if (paren !== 0) { + throw new Error(`Unbalanced parenthesis`); + } + if (singleQuote || doubleQuote) { + throw new Error(`Unbalanced quotes`); + } + if (brace) { + throw new Error(`Unbalanced braces`); + } + + const r = spawnSync(`eval`, args, {shell: process.env['SHELL'] || true}); + if (r.error || r.status !== 0) { + throw new Error('Failed to parse command line'); + } + const txt = r.stdout.toString(); + + const result = txt.split('\n'); + + result.length--; + return result; +} + +/** parses a command line out of a string and produces an array of strings + * + * handles quotes, escapes, and environment variables +*/ +export function extractArgs(argsString: string): string[] { + argsString = argsString.trim(); + switch (OperatingSystem) { + case 'win32': + return windows(argsString); + case 'linux': + case 'darwin': + case 'freebsd': + case 'openbsd': + return posix(argsString); + } + + throw new Error(`Unsupported OS: ${OperatingSystem}`); +} diff --git a/Extension/src/Utility/Process/process.ts b/Extension/src/Utility/Process/process.ts new file mode 100644 index 0000000000..eb09026e6f --- /dev/null +++ b/Extension/src/Utility/Process/process.ts @@ -0,0 +1,142 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +/* eslint-disable @typescript-eslint/naming-convention */ +/* eslint-disable @typescript-eslint/unified-signatures */ + +import { ChildProcess, spawn } from 'child_process'; +import { basename, resolve } from 'path'; +import { Async } from '../Async/constructor'; +import { ManualPromise } from '../Async/manualPromise'; + +import { Emitter } from '../Eventing/emitter'; +import { ArbitraryObject, Callback, Unsubscribe } from '../Eventing/interfaces'; +import { events, notifications } from '../Eventing/names'; +import { finalize } from '../System/finalize'; +import { Primitive } from '../System/types'; +import { verbose } from '../Text/streams'; +import { ReadWriteLineStream, ReadableLineStream } from './streams'; + +export interface _Process extends Emitter { + readonly console: ReadWriteLineStream; + readonly error: ReadableLineStream; + + readonly active: boolean; + readonly exitCode: Promise; + write(data: string): Promise; + writeln(data: string): Promise; + all(): string[]; + clear(): void; + stop(): void; +} + +interface ProcessEvents { + on(event: 'started', handler: Callback): Unsubscribe; + on(event: 'exited', handler: Callback): Unsubscribe; + on(event: string, handler: Callback): Unsubscribe; + once(event: 'started', handler: Callback): Unsubscribe; + once(event: 'exited', handler: Callback): Unsubscribe; + once(event: string, handler: Callback): Unsubscribe; +} + +class ProcessEvents extends Emitter { + +} + +export class Process extends Async(class Process extends ProcessEvents { + #process: ChildProcess; + + readonly stdio: ReadWriteLineStream; + readonly error: ReadableLineStream; + + get active() { + return !this.exitCode.isCompleted; + } + + get name() { + return basename(this.executable); + } + + get pid() { + return this.#process.pid; + } + + /** Event signals when the process is being launched */ + started = this.newNotification(notifications.started, { now: true, once: true }); + + /** Event signals when the process has stopped */ + exited = this.newNotification(notifications.exited, { now: true, once: true }); + + exitCode = new ManualPromise(); + init: Promise | undefined; + + constructor(readonly executable: string, readonly args: Primitive[], readonly cwd = process.cwd(), readonly env = process.env, stdInOpen = true, ...subscribers: ArbitraryObject[]) { + super(); + // add any subscribers to the process events before anything else happens + this.subscribe(...subscribers); + + let spawned = false; + executable = resolve(executable); // ensure that slashes are correct -- if they aren't, cmd.exe itself fails when slashes are wrong. (other apps don't necessarily fail, but cmd.exe does) + + const startTime = Date.now(); + verbose(`Starting '${this.name}' ${args.map((each) => each.toString()).join(' ')}`); + const process = this.#process = spawn(executable, args.map((each) => each.toString()), { cwd, env, stdio: [stdInOpen ? 'pipe' : null, 'pipe', 'pipe'], shell: false }). + on('error', (err: Error) => { + this.exitCode.reject(err); + }). + on('spawn', () => { + spawned = true; + void this.started(); + }). + on('close', (code: number, signal: NodeJS.Signals) => { + this.exitCode.resolve(code); + + if (spawned) { + // ensure the streams are completely closed before we emit the exited event + finalize(this.stdio); + finalize(this.error); + } + + verbose(`Ending '${this.name}' ${args.map((each) => each.toString()).join(' ')} // exiting with code ${code}. in ${Date.now() - startTime}ms}`); + + this.exited(code ?? (signal as any)); + }); + + this.stdio = new ReadWriteLineStream(process.stdout, process.stdin); + this.error = new ReadableLineStream(process.stderr); + + // enable stdio stream events/notifications + this.stdio.setReadNotifier(this.newNotification(notifications.read, { descriptors: { stdio: this.name } })); + this.stdio.setReadEvent(this.newEvent(events.reading, { descriptors: { stdio: this.name }, now: true })); + this.stdio.setWriteNotifier(this.newNotification(notifications.wrote, { descriptors: { stdio: this.name }, now: true })); + this.stdio.setWriteEvent(this.newEvent(events.writing, { descriptors: { stdio: this.name }, now: true })); + + // enable error streams events/notifications + this.error.setReadNotifier(this.newNotification(notifications.read, { descriptors: { error: this.name } })); + this.error.setReadEvent(this.newEvent(events.reading, { descriptors: { error: this.name }, now: true })); + } + + write(...lines: string[]) { + return this.stdio.write(...lines); + } + + writeln(...lines: string[]) { + return this.stdio.writeln(...lines); + } + + all() { + return [...this.stdio.all(), ...this.error.all()]; + } + + clear() { + this.stdio.clear(); + this.error.clear(); + } + + close() { + verbose(`closing process ${this.name}`); + this.#process.kill('SIGTERM'); + } +}) { } diff --git a/Extension/src/Utility/Process/program.ts b/Extension/src/Utility/Process/program.ts new file mode 100644 index 0000000000..df6b042d0b --- /dev/null +++ b/Extension/src/Utility/Process/program.ts @@ -0,0 +1,172 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +/* eslint-disable @typescript-eslint/naming-convention */ +import { fail } from 'assert'; +import { Factory } from '../Async/factory'; +import { lazy } from '../Async/lazy'; +import { Descriptors } from '../Eventing/descriptor'; +import { emitNow } from '../Eventing/dispatcher'; +import { ArbitraryObject } from '../Eventing/interfaces'; +import { filepath, filterToFolders, pathsFromVariable } from '../Filesystem/filepath'; +import { Finder } from '../Filesystem/find'; +import { first } from '../System/array'; +import { asserts } from '../System/assertions'; +import { is } from '../System/guards'; +import { Primitive } from '../System/types'; +import { Process } from './process'; +import { ReadableLineStream } from './streams'; + +type ArrayPlusOptions = [...T[]] | [...T[], TOptions]; + +function primitives(args: unknown[] | undefined): Primitive[] { + return args?.length ? args.filter(is.primitive) as Primitive[] : []; +} + +export const searchPaths = lazy(() => filterToFolders(pathsFromVariable('PATH'))); + +interface ProgramOptions { + cwd?: string; + env?: NodeJS.ProcessEnv; + noninteractive?: boolean; + on?: ArbitraryObject; + choices?: Promise>; +} + +function options>(args?: [...Primitive[]] | [...Primitive[], T]): Partial { + return args?.length ? is.primitive(args[args.length - 1]) ? {} : args.pop() as T : {}; +} + +interface Launcher { + executable: Promise; + cmdlineArgs: Primitive[]; + options: ProgramOptions; +} + +interface CommandResult { + code: number; + stdio: ReadableLineStream; + error: ReadableLineStream; +} + +/** + * A function that when called will execute a program, and allow the consumer to interact with it. + * + * @param args the command line arguments to pass to the program. + * @returns a promise that resolves to a Process object, which can be used to interact with the program. + */ +export interface ProcessFunction extends Launcher { + (...commandLineArguments: ArrayPlusOptions): Promise; +} + +/** + * A function that when called will execute a program, and return the CommandResult + * + * @param args the command line arguments to pass to the program. + * @returns a promise that resolves to a CommandResult object, which can be used to get the results of the program. + */ +export interface CommandFunction extends Launcher { + (...commandLineArguments: ArrayPlusOptions): Promise; +} + +async function processFactory(executable: string | Launcher, ...initialArgs: [...Primitive[], ProgramOptions & { noninteractive: true }]): Promise; +async function processFactory(executable: string | Launcher, ...initialArgs: ArrayPlusOptions): Promise; +async function processFactory(executable: string | Launcher, ...initialArgs: ArrayPlusOptions): Promise { + let cmdlineArgs = primitives(initialArgs); + let opts = options(initialArgs); + let fullPath: Promise; + + if (typeof executable === 'string') { + fullPath = lazy(async () => { + if (!await filepath.isExecutable(executable)) { + // if they didn't pass in a valid executable path, let's see if we can figure it out. + + // if we were handed some choices, we'll look at them, otherwise we'll see what we can find on the PATH. + opts.choices ??= lazy(async () => new Finder(executable).scan(...await searchPaths).results); + // but before we look at any of that, let's see if someone else wants to take that off our hands + const bin = await emitNow('select-binary', Descriptors.none, executable, is.promise(opts.choices) ? await opts.choices : new Set()); + return await filepath.isExecutable(bin) || // we have a good one coming back from the event + await filepath.isExecutable(first(opts.choices)) || // we're gonna pick the first one in the choices, if there are any. + fail(new Error(`Unable to find full path to binary '${executable}'`)); // we're out of options. + } + + // we were given a valid executable path, so we'll just check with the event listeners real quick. + const bin = await emitNow('select-binary', Descriptors.none, executable, is.promise(opts.choices) ? await opts.choices : new Set()) || executable; + + // ensure that the executable is an absolute path + asserts.isAbsolute(bin); + // ensure that the executable exists and is executable + await asserts.isExecutable(bin); + return bin; + }); + } else { + cmdlineArgs = [...(executable as Launcher).cmdlineArgs, ...cmdlineArgs]; + opts = { ...opts, ...(executable as Launcher).options || {} }; + fullPath = (executable as Launcher).executable; + } + + let result: ProcessFunction | CommandFunction; + if (opts.noninteractive) { + // create launcher for non-interactive commands + result = (async (...moreArgs: ArrayPlusOptions): Promise => { + // make sure the path is executable + + // Create Process instance + const moreOpts = options(moreArgs); + const subscribers = opts.on ? moreOpts.on ? [opts.on, moreOpts.on] : [opts.on] : moreOpts.on ? [moreOpts.on] : []; + + const proc = await new Process( + await fullPath, // executable + [...result.cmdlineArgs, ...primitives(moreArgs)], // arguments + result.options.cwd || moreOpts.cwd || process.cwd(), // cwd + { ...process.env, ...result.options.env, ...moreOpts.env }, // environment + false, // no stdin. + ...subscribers // event handlers + ); + + const code = await proc.exitCode; + return { + code, + stdio: proc.stdio, + error: proc.error + }; + + }) as any as CommandFunction; + } else { + // create Launcher function + result = (async (...moreArgs: ArrayPlusOptions): Promise => { + // Create Process instance + const moreOpts = options(moreArgs); + const subscribers = opts.on ? moreOpts.on ? [opts.on, moreOpts.on] : [opts.on] : moreOpts.on ? [moreOpts.on] : []; + return new Process( + await fullPath, // executable + [...result.cmdlineArgs, ...primitives(moreArgs)], // arguments + result.options.cwd || moreOpts.cwd || process.cwd(), // cwd + { ...process.env, ...result.options.env, ...moreOpts.env }, // environment + true, + ...subscribers // event handlers + ); + }) as any as ProcessFunction; + } + + result.cmdlineArgs = cmdlineArgs; // bind the default args to the function + result.options = opts; // bind the default options to the function + result.executable = fullPath; // bind the executable to the function + + return result; +} + +/** Creates a callable ProcessLauncher */ +export const Program = Factory(processFactory); + +/** Creates a callable CommandLauncher */ +export const Command = Factory((executable: string | Launcher, ...initialArgs: ArrayPlusOptions) => processFactory(executable, ...primitives(initialArgs), { ...options(initialArgs), noninteractive: true })); + +export function cmdlineToArray(text: string, result: string[] = [], matcher = /[^\s"]+|"([^"]*)"/gi, _count = 0): string[] { + text = text.replace(/\\"/g, '\ufffe'); + const match = matcher.exec(text); + return match ? cmdlineToArray(text, result, matcher, result.push(match[1] ? match[1].replace(/\ufffe/g, '\\"') : match[0].replace(/\ufffe/g, '\\"'))) : result; +} + diff --git a/Extension/src/Utility/Process/streams.ts b/Extension/src/Utility/Process/streams.ts new file mode 100644 index 0000000000..6deb2a844c --- /dev/null +++ b/Extension/src/Utility/Process/streams.ts @@ -0,0 +1,557 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +import { Duplex, Readable, Writable } from 'stream'; +import { TextDecoder, TextEncoder } from 'util'; +import { ManualPromise } from '../Async/manualPromise'; +import { returns } from '../Async/returns'; +import { Signal } from '../Async/signal'; +import { EventStatus } from '../Eventing/interfaces'; +import { finalize } from '../System/finalize'; +import { is } from '../System/guards'; +import { verbose } from '../Text/streams'; + +/* eslint-disable no-constant-condition */ + +/** An iterator/iterable wrapper to process a stream of lines. */ +export class LineIterator implements AsyncIterable, AsyncIterator { + #current = 0; + constructor(private lineBuffer: ReadableLineStream, private initial: number, private stopExpression?: string | RegExp) { + this.#current = Math.max(initial, lineBuffer.head); + } + + get current() { + return Math.max(this.#current, this.lineBuffer.head); + } + + advance() { + this.#current = Math.max(this.current + 1, this.lineBuffer.head); + return this; + } + + /** this is both an iterator and the iterable itself. */ + [Symbol.asyncIterator](): AsyncIterator { + return this; + } + + /** + * splits the iterator into two, so that they can be advanced independently. + * + * @returns a new iterator that starts at the current position. + */ + tee() { + return new LineIterator(this.lineBuffer, this.current, this.stopExpression); + } + + /** + * Stops the iterator at the point where we find the matching line. + * + * @param expression the string or regex to stop at + * @returns + */ + until(expression: string | RegExp) { + this.stopExpression = expression; + return this; + } + + /** allows the iterator to continue */ + resume() { + this.stopExpression = undefined; + return this; + } + + /** resets the iterator to the beginning. */ + reset() { + // reset the current position to the initial position (or head if it's trimmed) + this.initial = this.#current = Math.max( + this.initial, + this.lineBuffer.head + ); + + return this.resume(); + } + + async filter(expression: string | RegExp) { + const result = new Array(); + const stream = this.tee(); + if (expression instanceof RegExp) { + for await (const line of stream) { + const check = expression.exec(line); + if (check) { + result.push(check[1] || check[0]); + } + } + return result; + } + for await (const line of stream) { + if (line.includes(expression)) { + result.push(line); + } + } + + return result; + } + + /** + * Splits the iterator into two, and advances the new iterator to the line that matches the expression. + */ + from(expression: string | RegExp) { + return this.tee().skipTo(expression); + } + + /** + * Stops the iterator at the point where we find the matching line. + * + * @param expression the string or regex to stop at + */ + to(expression: string | RegExp) { + return this.until(expression); + } + + /** + * Advances the iterator to the point where we find the line. + */ + async skipTo(expression: string | RegExp) { + this.stopExpression = undefined; + do { + let line = this.lineBuffer.at(this.current); + while (line === undefined) { + await this.lineBuffer.changed; + line = this.lineBuffer.at(this.current); + if (this.lineBuffer.completed) { + return this; + } + } + this.advance(); + if ( + expression instanceof RegExp + ? expression.test(line) + : expression === line + ) { + return this; + } + } while (true); + } + + /** + * gets the current line, and advances the position. + * @returns the current line + */ + private async line() { + let line = this.lineBuffer.at(this.current); + while (line === undefined) { + await this.lineBuffer.changed; + line = this.lineBuffer.at(this.current); + } + this.advance(); + return line; + } + + /** + * Skips a number of lines. + * + * @param count the number of lines to skip + * @returns this + */ + async skip(count: number) { + do { + await this.line(); + if (--count === 0) { + return this; + } + } while (true); + } + + /** + * Checks if the a line is a match for the current expression. + * + * @param line the line to check + * @returns + */ + private isMatch(line: string) { + return this.stopExpression && this.stopExpression instanceof RegExp + ? this.stopExpression.test(line) + : this.stopExpression === line; + } + + /** + * Iterator next function. + * @returns the next line, or undefined if the iterator is done. + */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + async next(): Promise> { + do { + // is the current line (regardless of whether it's full or not) a match + const value = this.lineBuffer.at(this.current); + if (value !== undefined && this.isMatch(value)) { + // we have a match, so we're done + return { value: undefined, done: true }; + } + + // if we have lines to take, take them + if (this.current < this.lineBuffer.last) { + this.advance(); + return { value, done: false }; + } + // otherwise, we're at the end. if the process is done, then so are we. + if (this.lineBuffer.completed) { + return { value: undefined, done: true }; + } + + // we need to wait for more lines to show up + await this.lineBuffer.changed; + } while (true); + } + + /** + * returns the number of lines available to read. + */ + get available() { + return this.lineBuffer.tail - this.current; + } +} + +/** A buffer of lines from a stream (stdout or stderr). */ +export class ReadableLineStream implements AsyncIterable { + readonly changed = new Signal(); + #decoder: TextDecoder; + #completed = false; + #buffer = new Array(); + #head = 0; + #pipes = new Set(); + #partial: string | undefined; + + setReadNotifier(notifier: (text: string) => void) { + this.readStream = notifier; + } + setReadEvent(reading: (text: string) => Promise) { + this.streamRead = reading; + } + pipe(stream: ReadWriteLineStream) { + this.#pipes.add(stream); + } + unpipe(stream: ReadableLineStream) { + if (this.#pipes.delete(stream as ReadWriteLineStream)) { + // reciprocate if we deleted it from here. + stream.unpipe(this); + } + } + + get pipes() { + return this.#pipes; + } + + protected readStream?: (text: string) => void; + protected streamRead?: (text: string) => Promise; + + get head() { + return this.#head; + } + + get tail() { + return this.#buffer.length; + } + + at(index: number) { + return this.#buffer[index]; + } + + trimTrailingWhitespace = true; + + constructor(private readable: Readable) { + // if the stream is defined, then we're capturing + this.#decoder = new TextDecoder(); + this.readable.on('data', (chunk: Buffer) => this.readChunk(chunk)); + this.readable.on('end', () => finalize(this)); + } + + close() { + if (!this.#completed) { + this.push(); + for (const each of this.pipes) { + this.unpipe(each); + each.unpipe(this); + } + this.#completed = true; + + this.changed.dispose(); + } + } + + /** gets an iterator wrapper for the buffer */ + get iterator() { + return new LineIterator(this, this.head); + } + + [Symbol.asyncIterator]() { + return new LineIterator(this, this.head); + } + + /** returns true if the process is completed */ + get completed() { + return this.#completed; + } + + /** returns the current final line (may be empty!) */ + get currentLine() { + return this.#buffer[this.#buffer.length - 1]; + } + + /** gets the index of the last actual whole line in the buffer */ + get last() { + return this.#buffer.length - 1; + } + + /** filters the content to lines that match the expression */ + filter(expression: string | RegExp) { + const result = new Array(); + if (expression instanceof RegExp) { + for (let i = this.#head; i < this.#buffer.length; i++) { + const check = expression.exec(this.#buffer[i]); + if (check) { + result.push(check[1] || check[0]); + } + } + return result; + } + for (let i = this.#head; i < this.#buffer.length; i++) { + const line = this.#buffer[i]; + if (line.includes(expression)) { + result.push(line); + } + } + return result; + } + + private push(line?: string) { + if (this.#partial !== undefined) { + this.#partial = this.#partial.trimEnd(); + this.#buffer.push(this.#partial); + for (const pipe of this.#pipes) { + void pipe.writeln(this.#partial); + } + } + this.#partial = line; + } + + /** processes a chunk from the stream */ + private readChunk(chunk: Buffer) { + // stick the lines into the line array + if (!chunk || chunk.length === 0) { + return; + } + + // decode the chunk + const content = this.#decoder.decode(chunk, { stream: true }); + + // split into lines + const incoming = content.split(/\r\n|\n/); + const done = new Array>(); + + // carry over any partial line from before + if (this.#partial) { + incoming[0] = this.#partial + incoming[0]; + this.#partial = undefined; + } + + for (let line of incoming) { + line = this.trimTrailingWhitespace ? line.trimEnd() : line; + + if (this.readStream) { + // call notifyReading quickly, so that we don't block the stream + this.readStream(line); + } + + if (this.streamRead) { + // if we have a reading event, then we queue it up + done.push(this.streamRead(line).then((text) => !is.cancelled(text) ? this.push(text !== undefined ? text : line) : undefined)); + } else { + // otherwise, we just push the line into the buffer. + this.push(line); + } + } + + if (done.length) { + // if we have any pending emitted events, wait for them to finish before signaling that we have new lines + void Promise.all(done).then(() => this.changed.resolve()); + } else { + // signal that we have new lines + this.changed.resolve(); + } + } + + /** clears the buffer */ + clear() { + this.trim(); + } + + /** + * Trim elements from the front of the buffer. + * @param count the number of elements to trim (defaults to trimming the whole buffer.) + */ + trim(keepMaxLines = 0) { + // figure out where the new head should be + const newHead = Math.max(this.head, this.last - keepMaxLines); + + // if we are actually trimming (and the head should move forward), then fill the elements with undefined + if (newHead > 0) { + this.#buffer.fill(undefined as unknown as string, this.head, newHead); + + // set the new head position + this.#head = newHead; + } + } + + /** returns a copy of the entire line buffer */ + all() { + const result = this.#buffer.slice(this.head); + if (this.#partial) { + result.push(this.#partial); + } + return result; + } +} + +export class ReadWriteLineStream extends ReadableLineStream { + #encoder = new TextEncoder(); + protected writeable: Writable; + + setWriteEvent(event: (text: string) => Promise) { + this.streamWrite = event; + } + setWriteNotifier(notifier: (text: string) => void) { + this.wroteStream = notifier; + } + protected wroteStream?: (text: string) => void; + protected streamWrite?: (text: string) => Promise; + + constructor(stream: Duplex); + constructor(readable: Readable, writeable: Writable); + constructor(readable: Readable | Duplex, writeable?: Writable) { + super(readable); + this.writeable = writeable || readable as Writable; + + this.writeable.on('error', (_error) => { + /* + this is handy for debugging to see if errors are happening. + + if ((global as any).DEVMODE && error) { + verbose(`write-stream - error - ${error.message}`); + } + */ + }); + } + + async write(...text: string[]): Promise { + let content = text; + + if (this.streamWrite) { + content = new Array(); + + // allow the writing to be intercepted + for (const each of text) { + if (each) { + const result = await this.streamWrite(each); + if (!is.cancelled(result)) { + content.push(result || each); + } + } + } + } + if (this.wroteStream) { + for (const each of content) { + this.wroteStream(each); + } + } + + return new Promise((resolve, reject) => { + // send the content to the stream + this.writeable.write(this.#encoder.encode(content.join('')), (error: Error | null | undefined) => { + if (error) { + reject(error); + } else { + resolve(); + } + }); + }); + } + + async writeln(...text: string[]): Promise { + let content = text; + + if (this.streamWrite) { + content = new Array(); + + // allow the writing to be intercepted + for (const each of text) { + if (each) { + const result = await this.streamWrite(each); + if (!is.cancelled(result)) { + content.push(result || each); + } + } + } + } + + if (this.wroteStream) { + for (const each of content) { + this.wroteStream(each); + } + } + + return new Promise((resolve) => { + // send the content to the stream + try { + if (!this.writeable.destroyed) { + this.writeable.write(this.#encoder.encode(content.join('\n') + '\n'), (error: Error | null | undefined) => { + if ((global as any).DEVMODE && error) { + verbose(`stream-closed - ${error.message}`); + } + }); + } + } catch (e: any) { + if ((global as any).DEVMODE) { + verbose(`stream-throws - ${e.message}`); + } + } finally { + resolve(undefined); + } + }).catch(returns.undefined) as Promise; + } +} + +export class WriteableLineStream { + #stream: Writable; + #encoder: TextEncoder; + + constructor(stream: Writable, encoder: TextEncoder) { + this.#stream = stream; + this.#encoder = encoder; + } + + write(...text: string[]): Promise { + const result = new ManualPromise(); + this.#stream.write(this.#encoder.encode(text.join('')), (error: Error | null | undefined) => { + if (error) { + result.reject(error); + } else { + result.resolve(); + } + }); + return result; + } + + writeln(...text: string[]) { + const result = new ManualPromise(); + this.#stream.write(this.#encoder.encode(text.join('\n')), (error: Error | null | undefined) => { + if (error) { + result.reject(error); + } else { + result.resolve(); + } + }); + return result; + } +} diff --git a/Extension/src/Utility/Sandbox/interfaces.ts b/Extension/src/Utility/Sandbox/interfaces.ts new file mode 100644 index 0000000000..4d59fa8e99 --- /dev/null +++ b/Extension/src/Utility/Sandbox/interfaces.ts @@ -0,0 +1,44 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +import { is } from '../System/guards'; + +export interface ScriptError { + line: number; + column: number; + message: string; + file: string; + category: number; + code: number; + offset: number; +} + +export interface CreateOptions { + /** the filename (or identity of the the source code, which may or may not be an actual filename, + * it could be any textual identifier that the caller wants to call it.) of the source to compile */ + filename?: string; + + /** the column in the physical file where the source starts + * + * @default 0 + */ + columnOffset?: number; + + /** the line in the physical file where the source starts + * + * @default 0 + */ + lineOffset?: number; + +} + +export type ArbitraryModule = Record unknown>; + +export function hasErrors(instance: any): instance is ScriptError[] { + if (is.array(instance)) { + return instance.length > 0; + } + return false; +} diff --git a/Extension/src/Utility/Sandbox/sandbox.ts b/Extension/src/Utility/Sandbox/sandbox.ts new file mode 100644 index 0000000000..6c588b20da --- /dev/null +++ b/Extension/src/Utility/Sandbox/sandbox.ts @@ -0,0 +1,104 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +import { Context, createContext, runInContext, Script } from 'vm'; +import { stringify } from '../System/json'; +import { verbose } from '../Text/streams'; +import { CreateOptions, ScriptError } from './interfaces'; + +/** + * Creates a reusable safe-eval sandbox to execute code in. + */ +export function createSandbox(): (code: string, context?: any) => T { + const sandbox = createContext({}); + return (code: string, context?: any) => { + const response = `SAFE_EVAL_${Math.floor(Math.random() * 1000000)}`; + sandbox[response] = {}; + if (context) { + Object.keys(context).forEach((key) => sandbox[key] = context[key]); + runInContext( + `try { ${response} = ${code} } catch (e) { ${response} = undefined }`, + sandbox + ); + for (const key of Object.keys(context)) { + delete sandbox[key]; + } + } else { + try { + runInContext(`${response} = ${code}`, sandbox); + } catch (e) { + sandbox[response] = undefined; + } + } + return sandbox[response]; + }; +} + +export const safeEval = createSandbox(); + +/** + * A class that provides the ability to execute code from the user in a safe way. + * (it does so using node's VM support.) + */ +export class Sandbox { + context: Context; + + constructor(initializeContext: Record = {}) { + this.context = createContext({ + exports: {}, + ...initializeContext, + console: { + log: console.log, + error: console.error, + debug: console.debug, + info: console.info, + warn: console.warn, + verbose: verbose + }, + JSON: { + stringify: (obj: any) => stringify(obj), + parse: (str: string) => JSON.parse(str) + } + + }); + } + + protected require(module: string) { + return require(module); + } + + /** + * Creates an adhoc function from raw JavaScript code. + * + * This wraps raw JavaScript code into a function with some interesting caveats: + * - It has to do some magic to get 'return' statements to work correctly + * + * @param sourceCode the code to turn into a function + * @param parameterNames the names of the parameters to generate for the function + * @param options Function Creation Options + * @return an array of errors if there were any + * @returns a function that can be called with the given parameters + */ + createFunction unknown)>(sourceCode: string, parameterNames: string[], options?: CreateOptions & { async?: false }): ScriptError[] | T; + createFunction Promise)>(sourceCode: string, parameterNames: string[], options: CreateOptions & { async: true }): ScriptError[] | T; + + createFunction unknown)>(sourceCode: string, parameterNames: string[] = [], options?: CreateOptions & { async?: boolean }): ScriptError[] | T { + // insert defaults in options + options = { + lineOffset: 0, + columnOffset: 0, + filename: '', + ...options ? options : {} + }; + + let scriptSrc = sourceCode; + + scriptSrc = `${options.async ? 'async ' : ''}(${parameterNames.join(',')}) => { ${scriptSrc} }`; + + // create the script object, run it, and capture the generated function + return new Script(scriptSrc, options).runInContext(this.context, {}); + } +} + diff --git a/Extension/src/Utility/System/array.ts b/Extension/src/Utility/System/array.ts new file mode 100644 index 0000000000..3b312b5c3d --- /dev/null +++ b/Extension/src/Utility/System/array.ts @@ -0,0 +1,56 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +/* eslint-disable @typescript-eslint/unified-signatures */ +/* eslint-disable @typescript-eslint/no-unused-vars */ + +import { fail } from 'assert'; +import { is } from '../System/guards'; + +export function first(iterable: undefined): undefined; +export function first(iterable: Iterable | undefined): TElement | undefined; +export function first(iterable: Iterable | undefined, predicate: (element: TElement) => true | undefined): TElement | undefined; + +export function first(iterable: Promise | undefined>): Promise; +export function first(iterable: Promise | undefined>, predicate: (element: TElement) => true | undefined): Promise; + +export function first(iterable: Iterable | undefined | Promise | undefined>, predicate: (element: TElement) => true | undefined = (e) => e as any): TElement | Promise | undefined { + if (iterable === undefined) { + return undefined; + } + if (is.promise(iterable)) { + return iterable.then(i => first(i, predicate)); + } + + for (const each of iterable) { + if (predicate(each)) { + return each; + } + } + return undefined; +} + +export function firstOrFail(iterable: undefined, message: string | Error): never; +export function firstOrFail(iterable: Iterable, message: string | Error): TElement | never; +export function firstOrFail(iterable: Iterable, predicate: (element: TElement) => true | undefined, message: string | Error): TElement | never; + +export function firstOrFail(iterable: Promise>, message: string | Error): Promise | never; +export function firstOrFail(iterable: Promise>, predicate: (element: TElement) => true | undefined, message: string | Error): Promise | never; + +export function firstOrFail(iterable: Iterable | undefined | Promise | undefined>, predicateOrMessage: string | Error | ((element: TElement) => true | undefined) = (e) => e as any, message?: string | Error): TElement | Promise | never { + let result: any; + if (message === undefined) { + message = predicateOrMessage as string | Error; + predicateOrMessage = (e) => e as any; + result = first(iterable as Iterable, predicateOrMessage); + } else { + result = first(iterable as any, predicateOrMessage as any); + } + if (is.promise(result)) { + return result.then(r => r !== undefined ? r : fail(message)); + } + return result !== undefined ? result as TElement : fail(message); +} + diff --git a/Extension/src/Utility/System/assertions.ts b/Extension/src/Utility/System/assertions.ts new file mode 100644 index 0000000000..368d8cae37 --- /dev/null +++ b/Extension/src/Utility/System/assertions.ts @@ -0,0 +1,26 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +import { fail, ok } from 'assert'; +import { isAbsolute as isAbsolutePath } from 'path'; +import { filepath } from '../Filesystem/filepath'; + +// eslint-disable-next-line @typescript-eslint/naming-convention +export class asserts { + static async isFile(fileName: string | undefined | Promise): Promise { + return await filepath.isFile(fileName) || fail(new Error(`File ${fileName} is not a file`)); + } + + static async isExecutable(filename: string | undefined | Promise): Promise { + const { fullPath, isFile, isExecutable } = await filepath.info(filename) || fail(new Error(`Path ${filename} does not exist`)); + ok(isFile, new Error(`Path ${filename} is not a file`)); + ok(isExecutable, new Error(`File ${filename} is not executable`)); + return fullPath; + } + + static isAbsolute(path: string) { + ok(isAbsolutePath(path), `Path ${path} is not an absolute path`); + } +} diff --git a/Extension/src/Utility/System/environment.ts b/Extension/src/Utility/System/environment.ts new file mode 100644 index 0000000000..e621efd292 --- /dev/null +++ b/Extension/src/Utility/System/environment.ts @@ -0,0 +1,26 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +import { isWindows } from '../../constants'; + +/* Returns an environment variable value by name */ +export function getEnvironmentVariable(name: string): string | undefined { + return process.env[name]; +} + +/** replaces instances of environment variables referenced with the corresponding environment variable + * + * Windows: + * `%PATH%` -> environment variable `PATH` + * + * Non-Windows (posix-style): + * `$PATH` -> environment variable `PATH` + * + */ +export function resolveEnvironmentVariables(str: string): string { + return isWindows ? + str.replace(/%([^%]+)%/g, (withPercents, withoutPercents) => getEnvironmentVariable(withoutPercents) || withPercents) : // Windows + str.replace(/\$(\w+)/g, (withDollars, withoutDollars) => getEnvironmentVariable(withoutDollars) || withDollars); // everything else +} diff --git a/Extension/src/Utility/System/finalize.ts b/Extension/src/Utility/System/finalize.ts new file mode 100644 index 0000000000..28e3ad5ec0 --- /dev/null +++ b/Extension/src/Utility/System/finalize.ts @@ -0,0 +1,79 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +import { returns } from '../Async/returns'; +import { DispatcherBusy } from '../Eventing/dispatcher'; +import { is } from './guards'; + +export function ignore(fn: () => T | undefined) { + try { + return fn(); + } catch (e: any) { + // ignore + console.error(`Ignored error in finalize ${e.toString()}\n${e.stack}`); + return undefined; + } +} +const finalized = new WeakSet(); + +// eslint-disable-next-line @typescript-eslint/naming-convention +export let ActiveFinalizers = Promise.resolve(); + +/** This closes/ends/stops/destroys/disposes of an object or a Promise + * If the input is a promise, the finalization will be delayed until the promise resolves. + * This gives a consistent way to dispose of objects that might be in a variety of states. +*/ +export function finalize(...items: any[]): void { + for (const item of items) { + if (!item) { + return; + } + + // ensure that we're not finalizing the same item twice for no reason (or in a loop). + if (finalized.has(item)) { + continue; + } + + // store the value in the set so that we don't finalize it again. + finalized.add(item); + + if (item.finalize) { + try { + const result = item.finalize(); + if (is.promise(result)) { + // if the item has a finalize method, and it returns a promise, + // then we'll put the rest of the finalization on hold until that promise resolves. + // (this is useful when things need a few moments to stop (i.e. node:net:Server) + + const fin = result.catch(returns.undefined).then(() => { + ignore(() => item.end?.()); + ignore(() => item.stop?.()); + ignore(() => item.close?.()); + ignore(() => item.destroy?.()); + ignore(() => item.dispose?.()); + }); + ActiveFinalizers = Promise.all([fin, ActiveFinalizers, DispatcherBusy]).then(() => item.removeAllListeners?.()); + return; + } + } catch { + // ignore + } + } + + // progressively call the various methods that might be available + // to tear down and release resources that might be held by the item. + ignore(() => item.end?.()); + ignore(() => item.stop?.()); + ignore(() => item.close?.()); + ignore(() => item.destroy?.()); + ignore(() => item.dispose?.()); + + // cleaning up listeners isn't as time critical, and it's possible there are some + // events that are still in the queue, so we'll do this asynchronously. + // and we expose the promise so that we can await it before exiting the process. + ActiveFinalizers = Promise.all([ActiveFinalizers, DispatcherBusy]).then(() => item.removeAllListeners?.()); + } +} + diff --git a/Extension/src/Utility/System/garbageCollector.ts b/Extension/src/Utility/System/garbageCollector.ts new file mode 100644 index 0000000000..9d21db26cb --- /dev/null +++ b/Extension/src/Utility/System/garbageCollector.ts @@ -0,0 +1,14 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +import { setFlagsFromString } from 'v8'; +import { runInNewContext } from 'vm'; + +setFlagsFromString('--expose_gc'); +const gc = runInNewContext('gc'); + +export function collectGarbage() { + gc(true); +} diff --git a/Extension/src/Utility/System/guards.ts b/Extension/src/Utility/System/guards.ts index a4aa87df8f..0ada045c91 100644 --- a/Extension/src/Utility/System/guards.ts +++ b/Extension/src/Utility/System/guards.ts @@ -5,6 +5,7 @@ import { Socket } from 'node:net'; import { isPromise } from 'node:util/types'; +import { Emitter } from '../Eventing/emitter'; import { AsyncConstructor, Constructor, Primitive } from './types'; // eslint-disable-next-line @typescript-eslint/naming-convention @@ -25,19 +26,19 @@ export class is { } static nullish(value: any): value is null | undefined { - return value === null || value === undefined || value === ''; + return value === null || value === undefined; } static promise(value: any): value is Promise { - return isPromise(value) || (value && typeof (value.then) === 'function'); + return isPromise(value) || (value && typeof value.then === 'function'); } static iterable(instance: any): instance is Iterable { - return typeof instance !== 'string' && !!instance[Symbol.iterator]; + return !(is.nullish(instance) || is.string(instance)) && !!instance[Symbol.iterator]; } static asyncIterable(instance: any): instance is AsyncIterable { - return !!instance[Symbol.asyncIterator]; + return !is.nullish(instance) && !!instance[Symbol.asyncIterator]; } // eslint-disable-next-line @typescript-eslint/naming-convention @@ -64,4 +65,17 @@ export class is { static function(instance: any): instance is Function { return typeof instance === 'function'; } + + static emitter(instance: any): instance is Emitter { + return typeof instance?.isKnownEvent === 'function'; + } + static cancelled(instance: any): instance is 'Cancelled' { + return instance === 'Cancelled'; + } + static continue(instance: any): instance is undefined { + return instance === undefined; + } + static error(instance: any): instance is Error { + return instance instanceof Error; + } } diff --git a/Extension/src/Utility/System/info.ts b/Extension/src/Utility/System/info.ts new file mode 100644 index 0000000000..b25a525194 --- /dev/null +++ b/Extension/src/Utility/System/info.ts @@ -0,0 +1,147 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +/* eslint-disable @typescript-eslint/no-non-null-assertion */ +import { is } from './guards'; +import { AribtraryObject, Constructor } from './types'; + +export function typeOf(instance: any) { + const t = typeof instance; + const c = (classOf(instance) as any); + switch (t) { + case 'number': + return Number.isNaN(instance) ? 'NaN' : 'number'; + + case 'object': + if (instance === null) { + return 'null'; + } + if (is.promise(instance)) { + return c.class ? `Promise<${classOf(c.class)?.name || parentClassOf(classOf(c.class)!)?.name}>` : 'Promise'; + } + return classOf(instance)?.name || parentClassOf(classOf(instance)!)?.name || ''; + case 'function': + if (is.Constructor(instance)) { + return `class ${c?.name || parentClassOf(c!)?.name || ''}`; + } + return 'function'; + + } + return t; +} + +export function hierarchy(instance: AribtraryObject | Constructor): string[] { + const result = new Array(); + let type = classOf(instance); + while (type) { + if (type.name) { + result.push(type.name); + } + type = parentClassOf(type); + } + return result; +} + +export function parentClassOf(instance: AribtraryObject | Constructor): Constructor | undefined { + if (is.nullish(instance)) { + return undefined; + } + const parent = Object.getPrototypeOf(typeof instance === 'function' ? instance : instance.constructor); + return parent.name ? parent : undefined; +} + +export function classOf(instance: AribtraryObject | Constructor): Constructor | undefined { + return instance ? typeof instance === 'function' ? // is it a JavaScript function of some kind? + is.asyncConstructor(instance) ? classOf(instance.class) : + is.Constructor(instance) ? instance as Constructor // is it really a constructor? + : undefined // no, it's a function, but not a constructor + : instance.constructor as Constructor : // it's an object, so get the constructor from the object + undefined; +} + +/** returns true if the instance is an anonymous object (as opposed to constructed via a class) */ +export function isAnonymousObject(instance: any): boolean { + return instance.constructor.name === 'Object'; +} + +interface FunctionInfo { + /** was this declared with quotes or other non-word characters in the function name */ + hasNonWordCharacters: boolean; + + /** is the function async */ + isAsync: boolean; + + /** a bound callable function for the member (saves us from having to do it later anyway) */ + // eslint-disable-next-line @typescript-eslint/ban-types + fn: Function; +} + +interface Members { + methods: Map; + fields: Map; + properties: Map; +} + +const builtIns = new Set(Object.keys(Object.getOwnPropertyDescriptors(Object.getPrototypeOf({})))); + +export function members(obj: any): Members { + const result = { + methods: new Map(), + fields: new Map(), + properties: new Map() + }; + + if (typeof obj === 'object') { + let instance = obj; + do { + // enumerate all the properties at this level. + for (const [memberName, descriptor] of Object.entries(Object.getOwnPropertyDescriptors(instance))) { + // check if we're filtering it out because it's built into object, or it's using a leading underscore. + if (!(builtIns.has(memberName) || memberName.startsWith('_') || memberName.startsWith('$'))) { + let value: any; + + // look at the value/type of the member + try { + value = descriptor.value === undefined ? obj[memberName] : descriptor.value; + } catch { + continue; + } + const type = typeof value; + + // is it a function + if (type === 'function') { + // it is actually possible to get the 'declared name' of a member (if it was quoted in the source code) + // (this might be useful in the future. For now, we're just going to use the member name) + // const declaredName = obj[memberName].toString().replace(/\([\S\s]*/gm,'') || memberName; + + // distill out the info for the function itself + result.methods.set(memberName, { + hasNonWordCharacters: /\W/.test(obj[memberName].toString().replace(/^async\s+|\([\S\s]*/gm, '') || memberName), + isAsync: value.toString().startsWith('async '), + fn: value.bind(obj) + }); + continue; + } + + // is this a property (via accessors?) + if (descriptor.set || descriptor.get) { + // this is a property, it has an accessor. + if (descriptor.get) { + // only actually use properties that can be retrieved. + result.properties.set(memberName, type); + continue; + } + } + + // must be a field. + result.fields.set(memberName, type); + } + } + // eslint-disable-next-line no-cond-assign + } while (instance = Object.getPrototypeOf(instance)); + } + return result; +} + diff --git a/Extension/src/Utility/System/json.ts b/Extension/src/Utility/System/json.ts new file mode 100644 index 0000000000..336eb75cc5 --- /dev/null +++ b/Extension/src/Utility/System/json.ts @@ -0,0 +1,39 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +import { is } from './guards'; + +/** creates a JSON object, + * + * @param instance the object to clone into a plain old JavaScript object + * @param options.format if true, the JSON will be formatted with 2 spaces + * @param options.types the types to explicitly use getOwnPropertyNames instead of just enumerating the properties + */ +export function stringify(value: Promise, options?: { format?: boolean; types?: (new () => any)[] }): Promise; +export function stringify(value: any, options?: { format?: boolean; types?: (new () => any)[] }): string; +export function stringify(value: any, options?: { format?: boolean; types?: (new () => any)[] }): string | Promise { + if (is.promise(value)) { + return value.then(v => stringify(v)); + } + const types = options?.types ?? []; + const format = options?.format ?? false; + + const visited = new WeakSet(); + + return JSON.stringify(value, (key: any, value: any) => { + if (typeof value === 'object' && value !== null) { + if (visited.has(value)) { + return '[\'Circular\']'; + } + visited.add(value); + } + if (value?.constructor?.name === 'Error' || types.filter(each => value instanceof each).length) { + const result = {} as Record; + Object.getOwnPropertyNames(value).forEach((propName) => result[propName] = (value as any)[propName]); + return result; + } + return value; + }, format ? 2 : undefined); +} diff --git a/Extension/src/Utility/System/map.ts b/Extension/src/Utility/System/map.ts new file mode 100644 index 0000000000..bd964adcb5 --- /dev/null +++ b/Extension/src/Utility/System/map.ts @@ -0,0 +1,35 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +import { is } from './guards'; +import { AribtraryObject } from './types'; + +export type Returns = (...args: any) => TValue; +export type InitialValue = TValue | Returns; + +export function getOrAdd(map: WeakMap, key: TKey, defaultValue: InitialValue): TValue; +export function getOrAdd(map: WeakMap, key: TKey, defaultValue: InitialValue>): Promise; +export function getOrAdd(map: Map, key: TKey, defaultValue: InitialValue>): Promise; +export function getOrAdd(map: Map, key: TKey, defaultValue: InitialValue): TValue; +export function getOrAdd(map: Map | WeakMap, key: TKey, defaultValue: InitialValue>): TValue | Promise { + const value = map.get(key); + if (!is.nullish(value)) { + return value; + } + const initializer = defaultValue instanceof Function ? defaultValue() : defaultValue; + if (is.promise(initializer)) { + return initializer.then(v => { + if (v !== undefined) { + map.set(key, v); + } + return v; + }); + } else { + if (initializer !== undefined) { + map.set(key, initializer); + } + return initializer; + } +} diff --git a/Extension/src/Utility/Text/characterCodes.ts b/Extension/src/Utility/Text/characterCodes.ts new file mode 100644 index 0000000000..8d661df58a --- /dev/null +++ b/Extension/src/Utility/Text/characterCodes.ts @@ -0,0 +1,245 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +/* eslint-disable @typescript-eslint/naming-convention */ +export const enum CharacterCodes { + nullCharacter = 0, + maxAsciiCharacter = 0x7F, + + lineFeed = 0x0A, + carriageReturn = 0x0D, + lineSeparator = 0x2028, + paragraphSeparator = 0x2029, + nextLine = 0x0085, + + // Unicode 3.0 space characters + space = 0x0020, + nonBreakingSpace = 0x00A0, + enQuad = 0x2000, + emQuad = 0x2001, + enSpace = 0x2002, + emSpace = 0x2003, + threePerEmSpace = 0x2004, + fourPerEmSpace = 0x2005, + sixPerEmSpace = 0x2006, + figureSpace = 0x2007, + punctuationSpace = 0x2008, + thinSpace = 0x2009, + hairSpace = 0x200A, + zeroWidthSpace = 0x200B, + narrowNoBreakSpace = 0x202F, + ideographicSpace = 0x3000, + mathematicalSpace = 0x205F, + ogham = 0x1680, + + _ = 0x5F, + $ = 0x24, + + _0 = 0x30, + _1 = 0x31, + _2 = 0x32, + _3 = 0x33, + _4 = 0x34, + _5 = 0x35, + _6 = 0x36, + _7 = 0x37, + _8 = 0x38, + _9 = 0x39, + + a = 0x61, + b = 0x62, + c = 0x63, + d = 0x64, + e = 0x65, + f = 0x66, + g = 0x67, + h = 0x68, + i = 0x69, + j = 0x6A, + k = 0x6B, + l = 0x6C, + m = 0x6D, + n = 0x6E, + o = 0x6F, + p = 0x70, + q = 0x71, + r = 0x72, + s = 0x73, + t = 0x74, + u = 0x75, + v = 0x76, + w = 0x77, + x = 0x78, + y = 0x79, + z = 0x7A, + + A = 0x41, + B = 0x42, + C = 0x43, + D = 0x44, + E = 0x45, + F = 0x46, + G = 0x47, + H = 0x48, + I = 0x49, + J = 0x4A, + K = 0x4B, + L = 0x4C, + M = 0x4D, + N = 0x4E, + O = 0x4F, + P = 0x50, + Q = 0x51, + R = 0x52, + S = 0x53, + T = 0x54, + U = 0x55, + V = 0x56, + W = 0x57, + X = 0x58, + Y = 0x59, + Z = 0x5a, + + ampersand = 0x26, + asterisk = 0x2A, + at = 0x40, + backslash = 0x5C, + backtick = 0x60, + bar = 0x7C, + caret = 0x5E, + closeBrace = 0x7D, + closeBracket = 0x5D, + closeParen = 0x29, + colon = 0x3A, + comma = 0x2C, + dot = 0x2E, + doubleQuote = 0x22, + equals = 0x3D, + exclamation = 0x21, + greaterThan = 0x3E, + hash = 0x23, + lessThan = 0x3C, + minus = 0x2D, + openBrace = 0x7B, + openBracket = 0x5B, + openParen = 0x28, + percent = 0x25, + plus = 0x2B, + question = 0x3F, + semicolon = 0x3B, + singleQuote = 0x27, + slash = 0x2F, + tilde = 0x7E, + + backspace = 0x08, + formFeed = 0x0C, + byteOrderMark = 0xFEFF, + tab = 0x09, + verticalTab = 0x0B +} + +/** Does not include line breaks. For that, see isWhiteSpaceLike. */ +export function isWhiteSpaceSingleLine(ch: number): boolean { + // Note: nextLine is in the Zs space, and should be considered to be a whitespace. + // It is explicitly not a line-break as it isn't in the exact set specified by EcmaScript. + return ch === CharacterCodes.space || + ch === CharacterCodes.tab || + ch === CharacterCodes.verticalTab || + ch === CharacterCodes.formFeed || + ch === CharacterCodes.nonBreakingSpace || + ch === CharacterCodes.nextLine || + ch === CharacterCodes.ogham || + ch >= CharacterCodes.enQuad && ch <= CharacterCodes.zeroWidthSpace || + ch === CharacterCodes.narrowNoBreakSpace || + ch === CharacterCodes.mathematicalSpace || + ch === CharacterCodes.ideographicSpace || + ch === CharacterCodes.byteOrderMark; +} + +export function isLineBreak(ch: number): boolean { + // Other new line or line + // breaking characters are treated as white space but not as line terminators. + return ch === CharacterCodes.lineFeed || + ch === CharacterCodes.carriageReturn || + ch === CharacterCodes.lineSeparator || + ch === CharacterCodes.paragraphSeparator; +} + +export function isDigit(ch: number): boolean { + return ch >= CharacterCodes._0 && ch <= CharacterCodes._9; +} + +export function isHexDigit(ch: number): boolean { + return isDigit(ch) || ch >= CharacterCodes.A && ch <= CharacterCodes.F || ch >= CharacterCodes.a && ch <= CharacterCodes.f; +} + +export function isBinaryDigit(ch: number): boolean { + return ch === CharacterCodes._0 || ch === CharacterCodes._1; +} + +export function isVariableStart(ch: number): boolean { + return ch === CharacterCodes.$; +} + +export function isIdentifierStart(ch: number): boolean { + return ch >= CharacterCodes.A && ch <= CharacterCodes.Z || + ch >= CharacterCodes.a && ch <= CharacterCodes.z || + ch === CharacterCodes._ || + ch > CharacterCodes.maxAsciiCharacter && isUnicodeIdentifierStart(ch); +} + +export function isIdentifierPart(ch: number): boolean { + return ch >= CharacterCodes.A && ch <= CharacterCodes.Z || + ch >= CharacterCodes.a && ch <= CharacterCodes.z || + ch >= CharacterCodes._0 && ch <= CharacterCodes._9 || + ch === CharacterCodes._ || ch === CharacterCodes.minus || + ch > CharacterCodes.maxAsciiCharacter && isUnicodeIdentifierPart(ch); +} + +/** Characters that are in this range are actually code points that take two characters in UTF-16 */ +export function sizeOf(ch: number): number { + return ch >= 0xD800 && ch <= 0xDBFF ? 2 : 1; +} + +function lookupInUnicodeMap(code: number, map: readonly number[]): boolean { + // Bail out quickly if it couldn't possibly be in the map. + if (code < map[0]) { + return false; + } + + // Perform binary search in one of the Unicode range maps + let lo = 0; + let hi: number = map.length; + let mid: number; + + while (lo + 1 < hi) { + mid = lo + (hi - lo) / 2; + // mid has to be even to catch a range's beginning + mid -= mid % 2; + if (map[mid] <= code && code <= map[mid + 1]) { + return true; + } + + if (code < map[mid]) { + hi = mid; + } + else { + lo = mid + 2; + } + } + + return false; +} + +const unicodeESNextIdentifierStart = [65, 90, 97, 122, 170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736, 740, 748, 748, 750, 750, 880, 884, 886, 887, 890, 893, 895, 895, 902, 902, 904, 906, 908, 908, 910, 929, 931, 1013, 1015, 1153, 1162, 1327, 1329, 1366, 1369, 1369, 1376, 1416, 1488, 1514, 1519, 1522, 1568, 1610, 1646, 1647, 1649, 1747, 1749, 1749, 1765, 1766, 1774, 1775, 1786, 1788, 1791, 1791, 1808, 1808, 1810, 1839, 1869, 1957, 1969, 1969, 1994, 2026, 2036, 2037, 2042, 2042, 2048, 2069, 2074, 2074, 2084, 2084, 2088, 2088, 2112, 2136, 2144, 2154, 2208, 2228, 2230, 2237, 2308, 2361, 2365, 2365, 2384, 2384, 2392, 2401, 2417, 2432, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486, 2489, 2493, 2493, 2510, 2510, 2524, 2525, 2527, 2529, 2544, 2545, 2556, 2556, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2649, 2652, 2654, 2654, 2674, 2676, 2693, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2749, 2749, 2768, 2768, 2784, 2785, 2809, 2809, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873, 2877, 2877, 2908, 2909, 2911, 2913, 2929, 2929, 2947, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, 3024, 3024, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3129, 3133, 3133, 3160, 3162, 3168, 3169, 3200, 3200, 3205, 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3261, 3261, 3294, 3294, 3296, 3297, 3313, 3314, 3333, 3340, 3342, 3344, 3346, 3386, 3389, 3389, 3406, 3406, 3412, 3414, 3423, 3425, 3450, 3455, 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3585, 3632, 3634, 3635, 3648, 3654, 3713, 3714, 3716, 3716, 3718, 3722, 3724, 3747, 3749, 3749, 3751, 3760, 3762, 3763, 3773, 3773, 3776, 3780, 3782, 3782, 3804, 3807, 3840, 3840, 3904, 3911, 3913, 3948, 3976, 3980, 4096, 4138, 4159, 4159, 4176, 4181, 4186, 4189, 4193, 4193, 4197, 4198, 4206, 4208, 4213, 4225, 4238, 4238, 4256, 4293, 4295, 4295, 4301, 4301, 4304, 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4992, 5007, 5024, 5109, 5112, 5117, 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5880, 5888, 5900, 5902, 5905, 5920, 5937, 5952, 5969, 5984, 5996, 5998, 6000, 6016, 6067, 6103, 6103, 6108, 6108, 6176, 6264, 6272, 6312, 6314, 6314, 6320, 6389, 6400, 6430, 6480, 6509, 6512, 6516, 6528, 6571, 6576, 6601, 6656, 6678, 6688, 6740, 6823, 6823, 6917, 6963, 6981, 6987, 7043, 7072, 7086, 7087, 7098, 7141, 7168, 7203, 7245, 7247, 7258, 7293, 7296, 7304, 7312, 7354, 7357, 7359, 7401, 7404, 7406, 7411, 7413, 7414, 7418, 7418, 7424, 7615, 7680, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8305, 8305, 8319, 8319, 8336, 8348, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8472, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8505, 8508, 8511, 8517, 8521, 8526, 8526, 8544, 8584, 11264, 11310, 11312, 11358, 11360, 11492, 11499, 11502, 11506, 11507, 11520, 11557, 11559, 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11648, 11670, 11680, 11686, 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720, 11726, 11728, 11734, 11736, 11742, 12293, 12295, 12321, 12329, 12337, 12341, 12344, 12348, 12353, 12438, 12443, 12447, 12449, 12538, 12540, 12543, 12549, 12591, 12593, 12686, 12704, 12730, 12784, 12799, 13312, 19893, 19968, 40943, 40960, 42124, 42192, 42237, 42240, 42508, 42512, 42527, 42538, 42539, 42560, 42606, 42623, 42653, 42656, 42735, 42775, 42783, 42786, 42888, 42891, 42943, 42946, 42950, 42999, 43009, 43011, 43013, 43015, 43018, 43020, 43042, 43072, 43123, 43138, 43187, 43250, 43255, 43259, 43259, 43261, 43262, 43274, 43301, 43312, 43334, 43360, 43388, 43396, 43442, 43471, 43471, 43488, 43492, 43494, 43503, 43514, 43518, 43520, 43560, 43584, 43586, 43588, 43595, 43616, 43638, 43642, 43642, 43646, 43695, 43697, 43697, 43701, 43702, 43705, 43709, 43712, 43712, 43714, 43714, 43739, 43741, 43744, 43754, 43762, 43764, 43777, 43782, 43785, 43790, 43793, 43798, 43808, 43814, 43816, 43822, 43824, 43866, 43868, 43879, 43888, 44002, 44032, 55203, 55216, 55238, 55243, 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275, 64279, 64285, 64285, 64287, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65136, 65140, 65142, 65276, 65313, 65338, 65345, 65370, 65382, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500, 65536, 65547, 65549, 65574, 65576, 65594, 65596, 65597, 65599, 65613, 65616, 65629, 65664, 65786, 65856, 65908, 66176, 66204, 66208, 66256, 66304, 66335, 66349, 66378, 66384, 66421, 66432, 66461, 66464, 66499, 66504, 66511, 66513, 66517, 66560, 66717, 66736, 66771, 66776, 66811, 66816, 66855, 66864, 66915, 67072, 67382, 67392, 67413, 67424, 67431, 67584, 67589, 67592, 67592, 67594, 67637, 67639, 67640, 67644, 67644, 67647, 67669, 67680, 67702, 67712, 67742, 67808, 67826, 67828, 67829, 67840, 67861, 67872, 67897, 67968, 68023, 68030, 68031, 68096, 68096, 68112, 68115, 68117, 68119, 68121, 68149, 68192, 68220, 68224, 68252, 68288, 68295, 68297, 68324, 68352, 68405, 68416, 68437, 68448, 68466, 68480, 68497, 68608, 68680, 68736, 68786, 68800, 68850, 68864, 68899, 69376, 69404, 69415, 69415, 69424, 69445, 69600, 69622, 69635, 69687, 69763, 69807, 69840, 69864, 69891, 69926, 69956, 69956, 69968, 70002, 70006, 70006, 70019, 70066, 70081, 70084, 70106, 70106, 70108, 70108, 70144, 70161, 70163, 70187, 70272, 70278, 70280, 70280, 70282, 70285, 70287, 70301, 70303, 70312, 70320, 70366, 70405, 70412, 70415, 70416, 70419, 70440, 70442, 70448, 70450, 70451, 70453, 70457, 70461, 70461, 70480, 70480, 70493, 70497, 70656, 70708, 70727, 70730, 70751, 70751, 70784, 70831, 70852, 70853, 70855, 70855, 71040, 71086, 71128, 71131, 71168, 71215, 71236, 71236, 71296, 71338, 71352, 71352, 71424, 71450, 71680, 71723, 71840, 71903, 71935, 71935, 72096, 72103, 72106, 72144, 72161, 72161, 72163, 72163, 72192, 72192, 72203, 72242, 72250, 72250, 72272, 72272, 72284, 72329, 72349, 72349, 72384, 72440, 72704, 72712, 72714, 72750, 72768, 72768, 72818, 72847, 72960, 72966, 72968, 72969, 72971, 73008, 73030, 73030, 73056, 73061, 73063, 73064, 73066, 73097, 73112, 73112, 73440, 73458, 73728, 74649, 74752, 74862, 74880, 75075, 77824, 78894, 82944, 83526, 92160, 92728, 92736, 92766, 92880, 92909, 92928, 92975, 92992, 92995, 93027, 93047, 93053, 93071, 93760, 93823, 93952, 94026, 94032, 94032, 94099, 94111, 94176, 94177, 94179, 94179, 94208, 100343, 100352, 101106, 110592, 110878, 110928, 110930, 110948, 110951, 110960, 111355, 113664, 113770, 113776, 113788, 113792, 113800, 113808, 113817, 119808, 119892, 119894, 119964, 119966, 119967, 119970, 119970, 119973, 119974, 119977, 119980, 119982, 119993, 119995, 119995, 119997, 120003, 120005, 120069, 120071, 120074, 120077, 120084, 120086, 120092, 120094, 120121, 120123, 120126, 120128, 120132, 120134, 120134, 120138, 120144, 120146, 120485, 120488, 120512, 120514, 120538, 120540, 120570, 120572, 120596, 120598, 120628, 120630, 120654, 120656, 120686, 120688, 120712, 120714, 120744, 120746, 120770, 120772, 120779, 123136, 123180, 123191, 123197, 123214, 123214, 123584, 123627, 124928, 125124, 125184, 125251, 125259, 125259, 126464, 126467, 126469, 126495, 126497, 126498, 126500, 126500, 126503, 126503, 126505, 126514, 126516, 126519, 126521, 126521, 126523, 126523, 126530, 126530, 126535, 126535, 126537, 126537, 126539, 126539, 126541, 126543, 126545, 126546, 126548, 126548, 126551, 126551, 126553, 126553, 126555, 126555, 126557, 126557, 126559, 126559, 126561, 126562, 126564, 126564, 126567, 126570, 126572, 126578, 126580, 126583, 126585, 126588, 126590, 126590, 126592, 126601, 126603, 126619, 126625, 126627, 126629, 126633, 126635, 126651, 131072, 173782, 173824, 177972, 177984, 178205, 178208, 183969, 183984, 191456, 194560, 195101]; +const unicodeESNextIdentifierPart = [48, 57, 65, 90, 95, 95, 97, 122, 170, 170, 181, 181, 183, 183, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736, 740, 748, 748, 750, 750, 768, 884, 886, 887, 890, 893, 895, 895, 902, 906, 908, 908, 910, 929, 931, 1013, 1015, 1153, 1155, 1159, 1162, 1327, 1329, 1366, 1369, 1369, 1376, 1416, 1425, 1469, 1471, 1471, 1473, 1474, 1476, 1477, 1479, 1479, 1488, 1514, 1519, 1522, 1552, 1562, 1568, 1641, 1646, 1747, 1749, 1756, 1759, 1768, 1770, 1788, 1791, 1791, 1808, 1866, 1869, 1969, 1984, 2037, 2042, 2042, 2045, 2045, 2048, 2093, 2112, 2139, 2144, 2154, 2208, 2228, 2230, 2237, 2259, 2273, 2275, 2403, 2406, 2415, 2417, 2435, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486, 2489, 2492, 2500, 2503, 2504, 2507, 2510, 2519, 2519, 2524, 2525, 2527, 2531, 2534, 2545, 2556, 2556, 2558, 2558, 2561, 2563, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2620, 2620, 2622, 2626, 2631, 2632, 2635, 2637, 2641, 2641, 2649, 2652, 2654, 2654, 2662, 2677, 2689, 2691, 2693, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2748, 2757, 2759, 2761, 2763, 2765, 2768, 2768, 2784, 2787, 2790, 2799, 2809, 2815, 2817, 2819, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873, 2876, 2884, 2887, 2888, 2891, 2893, 2902, 2903, 2908, 2909, 2911, 2915, 2918, 2927, 2929, 2929, 2946, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, 3006, 3010, 3014, 3016, 3018, 3021, 3024, 3024, 3031, 3031, 3046, 3055, 3072, 3084, 3086, 3088, 3090, 3112, 3114, 3129, 3133, 3140, 3142, 3144, 3146, 3149, 3157, 3158, 3160, 3162, 3168, 3171, 3174, 3183, 3200, 3203, 3205, 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3260, 3268, 3270, 3272, 3274, 3277, 3285, 3286, 3294, 3294, 3296, 3299, 3302, 3311, 3313, 3314, 3328, 3331, 3333, 3340, 3342, 3344, 3346, 3396, 3398, 3400, 3402, 3406, 3412, 3415, 3423, 3427, 3430, 3439, 3450, 3455, 3458, 3459, 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3530, 3530, 3535, 3540, 3542, 3542, 3544, 3551, 3558, 3567, 3570, 3571, 3585, 3642, 3648, 3662, 3664, 3673, 3713, 3714, 3716, 3716, 3718, 3722, 3724, 3747, 3749, 3749, 3751, 3773, 3776, 3780, 3782, 3782, 3784, 3789, 3792, 3801, 3804, 3807, 3840, 3840, 3864, 3865, 3872, 3881, 3893, 3893, 3895, 3895, 3897, 3897, 3902, 3911, 3913, 3948, 3953, 3972, 3974, 3991, 3993, 4028, 4038, 4038, 4096, 4169, 4176, 4253, 4256, 4293, 4295, 4295, 4301, 4301, 4304, 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4957, 4959, 4969, 4977, 4992, 5007, 5024, 5109, 5112, 5117, 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5880, 5888, 5900, 5902, 5908, 5920, 5940, 5952, 5971, 5984, 5996, 5998, 6000, 6002, 6003, 6016, 6099, 6103, 6103, 6108, 6109, 6112, 6121, 6155, 6157, 6160, 6169, 6176, 6264, 6272, 6314, 6320, 6389, 6400, 6430, 6432, 6443, 6448, 6459, 6470, 6509, 6512, 6516, 6528, 6571, 6576, 6601, 6608, 6618, 6656, 6683, 6688, 6750, 6752, 6780, 6783, 6793, 6800, 6809, 6823, 6823, 6832, 6845, 6912, 6987, 6992, 7001, 7019, 7027, 7040, 7155, 7168, 7223, 7232, 7241, 7245, 7293, 7296, 7304, 7312, 7354, 7357, 7359, 7376, 7378, 7380, 7418, 7424, 7673, 7675, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8255, 8256, 8276, 8276, 8305, 8305, 8319, 8319, 8336, 8348, 8400, 8412, 8417, 8417, 8421, 8432, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8472, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8505, 8508, 8511, 8517, 8521, 8526, 8526, 8544, 8584, 11264, 11310, 11312, 11358, 11360, 11492, 11499, 11507, 11520, 11557, 11559, 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11647, 11670, 11680, 11686, 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720, 11726, 11728, 11734, 11736, 11742, 11744, 11775, 12293, 12295, 12321, 12335, 12337, 12341, 12344, 12348, 12353, 12438, 12441, 12447, 12449, 12538, 12540, 12543, 12549, 12591, 12593, 12686, 12704, 12730, 12784, 12799, 13312, 19893, 19968, 40943, 40960, 42124, 42192, 42237, 42240, 42508, 42512, 42539, 42560, 42607, 42612, 42621, 42623, 42737, 42775, 42783, 42786, 42888, 42891, 42943, 42946, 42950, 42999, 43047, 43072, 43123, 43136, 43205, 43216, 43225, 43232, 43255, 43259, 43259, 43261, 43309, 43312, 43347, 43360, 43388, 43392, 43456, 43471, 43481, 43488, 43518, 43520, 43574, 43584, 43597, 43600, 43609, 43616, 43638, 43642, 43714, 43739, 43741, 43744, 43759, 43762, 43766, 43777, 43782, 43785, 43790, 43793, 43798, 43808, 43814, 43816, 43822, 43824, 43866, 43868, 43879, 43888, 44010, 44012, 44013, 44016, 44025, 44032, 55203, 55216, 55238, 55243, 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275, 64279, 64285, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65024, 65039, 65056, 65071, 65075, 65076, 65101, 65103, 65136, 65140, 65142, 65276, 65296, 65305, 65313, 65338, 65343, 65343, 65345, 65370, 65382, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500, 65536, 65547, 65549, 65574, 65576, 65594, 65596, 65597, 65599, 65613, 65616, 65629, 65664, 65786, 65856, 65908, 66045, 66045, 66176, 66204, 66208, 66256, 66272, 66272, 66304, 66335, 66349, 66378, 66384, 66426, 66432, 66461, 66464, 66499, 66504, 66511, 66513, 66517, 66560, 66717, 66720, 66729, 66736, 66771, 66776, 66811, 66816, 66855, 66864, 66915, 67072, 67382, 67392, 67413, 67424, 67431, 67584, 67589, 67592, 67592, 67594, 67637, 67639, 67640, 67644, 67644, 67647, 67669, 67680, 67702, 67712, 67742, 67808, 67826, 67828, 67829, 67840, 67861, 67872, 67897, 67968, 68023, 68030, 68031, 68096, 68099, 68101, 68102, 68108, 68115, 68117, 68119, 68121, 68149, 68152, 68154, 68159, 68159, 68192, 68220, 68224, 68252, 68288, 68295, 68297, 68326, 68352, 68405, 68416, 68437, 68448, 68466, 68480, 68497, 68608, 68680, 68736, 68786, 68800, 68850, 68864, 68903, 68912, 68921, 69376, 69404, 69415, 69415, 69424, 69456, 69600, 69622, 69632, 69702, 69734, 69743, 69759, 69818, 69840, 69864, 69872, 69881, 69888, 69940, 69942, 69951, 69956, 69958, 69968, 70003, 70006, 70006, 70016, 70084, 70089, 70092, 70096, 70106, 70108, 70108, 70144, 70161, 70163, 70199, 70206, 70206, 70272, 70278, 70280, 70280, 70282, 70285, 70287, 70301, 70303, 70312, 70320, 70378, 70384, 70393, 70400, 70403, 70405, 70412, 70415, 70416, 70419, 70440, 70442, 70448, 70450, 70451, 70453, 70457, 70459, 70468, 70471, 70472, 70475, 70477, 70480, 70480, 70487, 70487, 70493, 70499, 70502, 70508, 70512, 70516, 70656, 70730, 70736, 70745, 70750, 70751, 70784, 70853, 70855, 70855, 70864, 70873, 71040, 71093, 71096, 71104, 71128, 71133, 71168, 71232, 71236, 71236, 71248, 71257, 71296, 71352, 71360, 71369, 71424, 71450, 71453, 71467, 71472, 71481, 71680, 71738, 71840, 71913, 71935, 71935, 72096, 72103, 72106, 72151, 72154, 72161, 72163, 72164, 72192, 72254, 72263, 72263, 72272, 72345, 72349, 72349, 72384, 72440, 72704, 72712, 72714, 72758, 72760, 72768, 72784, 72793, 72818, 72847, 72850, 72871, 72873, 72886, 72960, 72966, 72968, 72969, 72971, 73014, 73018, 73018, 73020, 73021, 73023, 73031, 73040, 73049, 73056, 73061, 73063, 73064, 73066, 73102, 73104, 73105, 73107, 73112, 73120, 73129, 73440, 73462, 73728, 74649, 74752, 74862, 74880, 75075, 77824, 78894, 82944, 83526, 92160, 92728, 92736, 92766, 92768, 92777, 92880, 92909, 92912, 92916, 92928, 92982, 92992, 92995, 93008, 93017, 93027, 93047, 93053, 93071, 93760, 93823, 93952, 94026, 94031, 94087, 94095, 94111, 94176, 94177, 94179, 94179, 94208, 100343, 100352, 101106, 110592, 110878, 110928, 110930, 110948, 110951, 110960, 111355, 113664, 113770, 113776, 113788, 113792, 113800, 113808, 113817, 113821, 113822, 119141, 119145, 119149, 119154, 119163, 119170, 119173, 119179, 119210, 119213, 119362, 119364, 119808, 119892, 119894, 119964, 119966, 119967, 119970, 119970, 119973, 119974, 119977, 119980, 119982, 119993, 119995, 119995, 119997, 120003, 120005, 120069, 120071, 120074, 120077, 120084, 120086, 120092, 120094, 120121, 120123, 120126, 120128, 120132, 120134, 120134, 120138, 120144, 120146, 120485, 120488, 120512, 120514, 120538, 120540, 120570, 120572, 120596, 120598, 120628, 120630, 120654, 120656, 120686, 120688, 120712, 120714, 120744, 120746, 120770, 120772, 120779, 120782, 120831, 121344, 121398, 121403, 121452, 121461, 121461, 121476, 121476, 121499, 121503, 121505, 121519, 122880, 122886, 122888, 122904, 122907, 122913, 122915, 122916, 122918, 122922, 123136, 123180, 123184, 123197, 123200, 123209, 123214, 123214, 123584, 123641, 124928, 125124, 125136, 125142, 125184, 125259, 125264, 125273, 126464, 126467, 126469, 126495, 126497, 126498, 126500, 126500, 126503, 126503, 126505, 126514, 126516, 126519, 126521, 126521, 126523, 126523, 126530, 126530, 126535, 126535, 126537, 126537, 126539, 126539, 126541, 126543, 126545, 126546, 126548, 126548, 126551, 126551, 126553, 126553, 126555, 126555, 126557, 126557, 126559, 126559, 126561, 126562, 126564, 126564, 126567, 126570, 126572, 126578, 126580, 126583, 126585, 126588, 126590, 126590, 126592, 126601, 126603, 126619, 126625, 126627, 126629, 126633, 126635, 126651, 131072, 173782, 173824, 177972, 177984, 178205, 178208, 183969, 183984, 191456, 194560, 195101, 917760, 917999]; + +/* @internal */ export function isUnicodeIdentifierStart(code: number) { + return lookupInUnicodeMap(code, unicodeESNextIdentifierStart); +} + +function isUnicodeIdentifierPart(code: number) { + return lookupInUnicodeMap(code, unicodeESNextIdentifierPart); +} diff --git a/Extension/src/Utility/Text/identifiers.ts b/Extension/src/Utility/Text/identifiers.ts new file mode 100644 index 0000000000..962dd8d583 --- /dev/null +++ b/Extension/src/Utility/Text/identifiers.ts @@ -0,0 +1,46 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +import { is } from '../System/guards'; + +/** takes an identifier string and deconstructs and normalizes it. */ +export function deconstruct(identifier: string | string[]): string[] { + if (is.array(identifier)) { + return identifier.flatMap(deconstruct); + } + return `${identifier}` + .replace(/([a-z]+)([A-Z])/g, '$1 $2') + .replace(/(\d+)([a-z|A-Z]+)/g, '$1 $2') + .replace(/\b([A-Z]+)([A-Z])([a-z])/, '$1 $2$3') + .split(/[\W|_]+/) + .map((each) => each.toLowerCase()); +} +/** + * Takes an identifier string and deconstructs and normalizes it and smashes it together. + * + * This is useful for supporting multiple naming conventions for the same identifier. (i.e. 'fooBar' and 'foo-bar' are the same identifier) + */ +export function smash(identifier: string | string[]): string { + return deconstruct(identifier).join(''); +} + +/** reformat an identifier to pascal case */ +export function pascalCase(identifier: string | string[]): string { + return deconstruct(identifier) + .map((each) => each.charAt(0).toUpperCase() + each.slice(1)) + .join(''); +} + +/** reformat an identifier to camel case */ +export function camelCase(identifier: string | string[]): string { + return deconstruct(identifier) + .map((each, index) => index === 0 ? each : each.charAt(0).toUpperCase() + each.slice(1)) + .join(''); +} + +/** reformat an identifier to dash case */ +export function dashCase(identifier: string | string[]): string { + return deconstruct(identifier).join('-'); +} diff --git a/Extension/src/Utility/Text/scanner.ts b/Extension/src/Utility/Text/scanner.ts new file mode 100644 index 0000000000..ff911e4099 --- /dev/null +++ b/Extension/src/Utility/Text/scanner.ts @@ -0,0 +1,1018 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +import { CharacterCodes, isBinaryDigit, isDigit, isHexDigit, isIdentifierPart, isIdentifierStart, isLineBreak, isWhiteSpaceSingleLine, sizeOf } from './characterCodes'; + +/* eslint-disable @typescript-eslint/no-non-null-assertion */ + +export enum MessageCategory { + Warning, + Error, + Suggestion, + Message +} + +export interface Message { + code: number; + category: MessageCategory; + text: string; +} + +export const messages = { + DigitExpected: { code: 1100, category: MessageCategory.Error, text: 'Digit expected (0-9)' }, + HexDigitExpected: { code: 1101, category: MessageCategory.Error, text: 'Hex Digit expected (0-F,0-f)' }, + BinaryDigitExpected: { code: 1102, category: MessageCategory.Error, text: 'Binary Digit expected (0,1)' }, + UnexpectedEndOfFile: { code: 1103, category: MessageCategory.Error, text: 'Unexpected end of file while searching for \'{0}\'' }, + InvalidEscapeSequence: { code: 1104, category: MessageCategory.Error, text: 'Invalid escape sequence' } +}; + +export function format(text: string, ...args: (string | number)[]): string { + return text.replace(/{(\d+)}/g, (_match, index: string) => '' + args[+index] || ''); +} + +export interface Token { + /** the character offset within the document */ + readonly offset: number; + + /** the text of the current token (when appropriate) */ + text: string; + + /** the literal value */ + stringValue?: string; + + /** the token kind */ + readonly kind: Kind; +} + +// All conflict markers consist of the same character repeated seven times. If it is +// a <<<<<<< or >>>>>>> marker then it is also followed by a space. +const mergeConflictMarkerLength = 7; + +/** + * Position in a text document expressed as zero-based line and character offset. + * The offsets are based on a UTF-16 string representation. So a string of the form + * `a𐐀b` the character offset of the character `a` is 0, the character offset of `𐐀` + * is 1 and the character offset of b is 3 since `𐐀` is represented using two code + * units in UTF-16. + * + * Positions are line end character agnostic. So you can not specify a position that + * denotes `\r|\n` or `\n|` where `|` represents the character offset. + */ +export interface Position { + /** + * Line position in a document (zero-based). + * If a line number is greater than the number of lines in a document, it defaults back to the number of lines in the document. + * If a line number is negative, it defaults to 0. + */ + line: number; + /** + * Character offset on a line in a document (zero-based). Assuming that the line is + * represented as a string, the `character` value represents the gap between the + * `character` and `character + 1`. + * + * If the character value is greater than the line length it defaults back to the + * line length. + * If a line number is negative, it defaults to 0. + */ + column: number; +} + +export enum Kind { + Unknown, + EndOfFile, + + SingleLineComment, + MultiLineComment, + SingleLineHashComment, + MultiLineHashComment, + NewLine, + Whitespace, + + // We detect and provide better error recovery when we encounter a git merge marker. This + // allows us to edit files with git-conflict markers in them in a much more pleasant manner. + ConflictMarker, + + // Literals + NumericLiteral, + StringLiteral, + + // Boolean Literals + BooleanLiteral, + + TrueKeyword, + FalseKeyword, + + // Punctuation + OpenBrace, + CloseBrace, + OpenParen, + CloseParen, + OpenBracket, + CloseBracket, + Dot, + Ellipsis, + Semicolon, + Comma, + QuestionDot, + LessThan, + OpenAngle = LessThan, + LessThanSlash, + GreaterThan, + CloseAngle = GreaterThan, + LessThanEquals, + GreaterThanEquals, + EqualsEquals, + ExclamationEquals, + EqualsEqualsEquals, + ExclamationEqualsEquals, + EqualsArrow, + Plus, + Minus, + Asterisk, + AsteriskAsterisk, + Slash, + Percent, + PlusPlus, + MinusMinus, + LessThanLessThan, + GreaterThanGreaterThan, + GreaterThanGreaterThanGreaterThan, + Ampersand, + Bar, + Caret, + Exclamation, + Tilde, + AmpersandAmpersand, + BarBar, + Question, + Colon, + At, + QuestionQuestion, + Dollar, + Backslash, + + // Assignments + Equals, + PlusEquals, + MinusEquals, + AsteriskEquals, + AsteriskAsteriskEquals, + SlashEquals, + PercentEquals, + LessThanLessThanEquals, + GreaterThanGreaterThanEquals, + GreaterThanGreaterThanGreaterThanEquals, + AmpersandEquals, + BarEquals, + BarBarEquals, + AmpersandAmpersandEquals, + QuestionQuestionEquals, + CaretEquals, + + // Other Things + CodeFence, + + // Identifiers + Variable, + Identifier, + + // Keywords + KeywordsStart = 1000, + ThisKeyword, + AwaitKeyword, + OnceKeyword, + + KeywordsEnd, +} + +const keywords = new Map([ + + ['this', Kind.ThisKeyword], + ['await', Kind.AwaitKeyword], + ['once', Kind.OnceKeyword], + + ['true', Kind.BooleanLiteral], // TrueKeyword + ['false', Kind.BooleanLiteral] // FalseKeyword +]); + +interface TokenLocation extends Position { + offset: number; +} + +/** This is a fairly generic scanner for making it easy to parse expressions and code blocks in a variety of formats + * + * (the supported tokens are derived from the TypeScript grammar) + */ +export class Scanner implements Token { + #offset = 0; + #line = 0; + #column = 0; + #map = new Array(); + + #length: number; + #text: string; + + #ch!: number; + #chNext!: number; + #chNextNext!: number; + + #chSz!: number; + #chNextSz!: number; + #chNextNextSz!: number; + + /** The assumed tab width. If this is set before scanning, it enables accurate Position tracking. */ + tabWidth = 2; + + // current token information + + /** the character offset within the document */ + offset!: number; + + /** the token kind */ + kind!: Kind; + + /** the text of the current token (when appropriate) */ + text!: string; + + /** the string value of current string literal token (unquoted, unescaped) */ + stringValue?: string; + + /** returns the Position (line/column) of the current token */ + get position(): Position { + return this.positionFromOffset(this.offset); + } + + constructor(text: string) { + this.#text = text; + this.#length = text.length; + this.advance(0); + this.markPosition(); + + // let's hide these, then we can clone this nicely. + Object.defineProperty(this, 'tabWidth', { enumerable: false }); + } + + private get eof() { + return this.#offset > this.#length; + } + + private advance(count?: number): number { + let codeOrChar: number; + let newOffset: number; + let offsetAdvancedBy = 0; + + switch (count) { + case undefined: + case 1: + offsetAdvancedBy = this.#chSz; + this.#offset += this.#chSz; + this.#ch = this.#chNext; this.#chSz = this.#chNextSz; + this.#chNext = this.#chNextNext; this.#chNextSz = this.#chNextNextSz; + + newOffset = this.#offset + this.#chSz + this.#chNextSz; + codeOrChar = this.#text.charCodeAt(newOffset); + this.#chNextNext = (this.#chNextNextSz = sizeOf(codeOrChar)) === 1 ? codeOrChar : this.#text.codePointAt(newOffset)!; + return offsetAdvancedBy; + + case 2: + offsetAdvancedBy = this.#chSz + this.#chNextSz; + this.#offset += this.#chSz + this.#chNextSz; + this.#ch = this.#chNextNext; this.#chSz = this.#chNextNextSz; + + newOffset = this.#offset + this.#chSz; + codeOrChar = this.#text.charCodeAt(newOffset); + this.#chNext = (this.#chNextSz = sizeOf(codeOrChar)) === 1 ? codeOrChar : this.#text.codePointAt(newOffset)!; + + newOffset += this.#chNextSz; + codeOrChar = this.#text.charCodeAt(newOffset); + this.#chNextNext = (this.#chNextNextSz = sizeOf(codeOrChar)) === 1 ? codeOrChar : this.#text.codePointAt(newOffset)!; + return offsetAdvancedBy; + + default: + case 3: + offsetAdvancedBy = this.#chSz + this.#chNextSz + this.#chNextNextSz; + count -= 3; + while (count) { + // skip over characters while we work. + offsetAdvancedBy += sizeOf(this.#text.charCodeAt(this.#offset + offsetAdvancedBy)); + } + this.#offset += offsetAdvancedBy; + + // eslint-disable-next-line no-fallthrough + case 0: + newOffset = this.#offset; + codeOrChar = this.#text.charCodeAt(newOffset); + this.#ch = (this.#chSz = sizeOf(codeOrChar)) === 1 ? codeOrChar : this.#text.codePointAt(newOffset)!; + + newOffset += this.#chSz; + codeOrChar = this.#text.charCodeAt(newOffset); + this.#chNext = (this.#chNextSz = sizeOf(codeOrChar)) === 1 ? codeOrChar : this.#text.codePointAt(newOffset)!; + + newOffset += this.#chNextSz; + codeOrChar = this.#text.charCodeAt(newOffset); + this.#chNextNext = (this.#chNextNextSz = sizeOf(codeOrChar)) === 1 ? codeOrChar : this.#text.codePointAt(newOffset)!; + return offsetAdvancedBy; + } + } + + private next(token: Kind, count = 1, value?: string) { + const originalOffset = this.#offset; + const offsetAdvancedBy = this.advance(count); + this.text = value || this.#text.substr(originalOffset, offsetAdvancedBy); + + this.#column += count; + return this.kind = token; + } + + /** adds the current position to the token to the offset:position map */ + private markPosition() { + this.#map.push({ offset: this.#offset, column: this.#column, line: this.#line }); + } + + /** updates the position and marks the location */ + private newLine(count = 1) { + this.text = this.#text.substr(this.#offset, count); + this.advance(count); + + this.#line++; + this.#column = 0; + this.markPosition(); // make sure the map has the new location + + return this.kind = Kind.NewLine; + } + + start() { + if (this.offset === undefined) { + this.scan(); + } + return this; + } + + /** + * Identifies and returns the next token type in the document + * + * @returns the state of the scanner will have the properties `token`, `value`, `offset` pointing to the current token at the end of this call. + * + * @notes before this call, `#offset` is pointing to the next character to be evaluated. + * + */ + scan(): Kind { + + // this token starts at + this.offset = this.#offset; + this.stringValue = undefined; + + if (!(this.eof || isNaN(this.#ch))) { + switch (this.#ch) { + case CharacterCodes.carriageReturn: + return this.newLine(this.#chNext === CharacterCodes.lineFeed ? 2 : 1); + + case CharacterCodes.lineFeed: + return this.newLine(); + + case CharacterCodes.tab: + case CharacterCodes.verticalTab: + case CharacterCodes.formFeed: + case CharacterCodes.space: + case CharacterCodes.nonBreakingSpace: + case CharacterCodes.ogham: + case CharacterCodes.enQuad: + case CharacterCodes.emQuad: + case CharacterCodes.enSpace: + case CharacterCodes.emSpace: + case CharacterCodes.threePerEmSpace: + case CharacterCodes.fourPerEmSpace: + case CharacterCodes.sixPerEmSpace: + case CharacterCodes.figureSpace: + case CharacterCodes.punctuationSpace: + case CharacterCodes.thinSpace: + case CharacterCodes.hairSpace: + case CharacterCodes.zeroWidthSpace: + case CharacterCodes.narrowNoBreakSpace: + case CharacterCodes.mathematicalSpace: + case CharacterCodes.ideographicSpace: + case CharacterCodes.byteOrderMark: + return this.scanWhitespace(); + + case CharacterCodes.$: + return isIdentifierPart(this.#chNext) ? this.scanVariable() : this.next(Kind.Dollar); + + case CharacterCodes.openParen: + return this.next(Kind.OpenParen); + + case CharacterCodes.closeParen: + return this.next(Kind.CloseParen); + + case CharacterCodes.comma: + return this.next(Kind.Comma); + + case CharacterCodes.colon: + return this.next(Kind.Colon); + + case CharacterCodes.semicolon: + return this.next(Kind.Semicolon); + + case CharacterCodes.openBracket: + return this.next(Kind.OpenBracket); + + case CharacterCodes.closeBracket: + return this.next(Kind.CloseBracket); + + case CharacterCodes.openBrace: + return this.next(Kind.OpenBrace); + + case CharacterCodes.closeBrace: + return this.next(Kind.CloseBrace); + + case CharacterCodes.tilde: + return this.next(Kind.Tilde); + + case CharacterCodes.at: + return this.next(Kind.At); + + case CharacterCodes.caret: + return this.#chNext === CharacterCodes.equals ? this.next(Kind.CaretEquals, 2) : this.next(Kind.Caret); + + case CharacterCodes.percent: + return this.#chNext === CharacterCodes.equals ? this.next(Kind.PercentEquals, 2) : this.next(Kind.Percent); + + case CharacterCodes.backslash: + return this.next(Kind.Backslash); + + case CharacterCodes.question: + return this.#chNext === CharacterCodes.dot && !isDigit(this.#chNextNext) ? + this.next(Kind.QuestionDot, 2) : + this.#chNext === CharacterCodes.question ? + this.#chNextNext === CharacterCodes.equals ? + this.next(Kind.QuestionQuestionEquals, 3) : + this.next(Kind.QuestionQuestion, 2) : + this.next(Kind.Question); + + case CharacterCodes.exclamation: + return this.#chNext === CharacterCodes.equals ? + this.#chNextNext === CharacterCodes.equals ? + this.next(Kind.ExclamationEqualsEquals, 3) : + this.next(Kind.ExclamationEquals, 2) : + this.next(Kind.Exclamation); + + case CharacterCodes.ampersand: + return this.#chNext === CharacterCodes.ampersand ? + this.#chNextNext === CharacterCodes.equals ? + this.next(Kind.AmpersandAmpersandEquals, 3) : + this.next(Kind.AmpersandAmpersand, 2) : + this.#chNext === CharacterCodes.equals ? + this.next(Kind.AmpersandEquals, 2) : + this.next(Kind.Ampersand); + + case CharacterCodes.asterisk: + return this.#chNext === CharacterCodes.asterisk ? + this.#chNextNext === CharacterCodes.equals ? + this.next(Kind.AsteriskAsteriskEquals, 3) : + this.next(Kind.AsteriskAsterisk, 2) : + this.#chNext === CharacterCodes.equals ? + this.next(Kind.AsteriskEquals, 2) : + this.next(Kind.Asterisk); + + case CharacterCodes.plus: + return this.#chNext === CharacterCodes.plus ? + this.next(Kind.PlusPlus, 2) : + this.#chNext === CharacterCodes.equals ? + this.next(Kind.PlusEquals, 2) : + this.next(Kind.Plus); + + case CharacterCodes.minus: + return this.#chNext === CharacterCodes.minus ? + this.next(Kind.MinusMinus, 2) : + this.#chNext === CharacterCodes.equals ? + this.next(Kind.MinusEquals, 2) : + this.next(Kind.Minus); + + case CharacterCodes.dot: + return isDigit(this.#chNext) ? + this.scanNumber() : + this.#chNext === CharacterCodes.dot && this.#chNextNext === CharacterCodes.dot ? + this.next(Kind.Ellipsis, 3) : + this.next(Kind.Dot); + + case CharacterCodes.slash: + return this.#chNext === CharacterCodes.slash ? + this.scanSingleLineComment() : + this.#chNext === CharacterCodes.asterisk ? + this.scanMultiLineComment() : + + this.#chNext === CharacterCodes.equals ? + this.next(Kind.SlashEquals) : + this.next(Kind.Slash); + + case CharacterCodes.hash: + return this.scanHashComment(); + + case CharacterCodes._0: + return this.#chNext === CharacterCodes.x || this.#chNext === CharacterCodes.X ? + this.scanHexNumber() : + this.#chNext === CharacterCodes.B || this.#chNext === CharacterCodes.B ? + this.scanBinaryNumber() : + this.scanNumber(); + + case CharacterCodes._1: + case CharacterCodes._2: + case CharacterCodes._3: + case CharacterCodes._4: + case CharacterCodes._5: + case CharacterCodes._6: + case CharacterCodes._7: + case CharacterCodes._8: + case CharacterCodes._9: + return this.scanNumber(); + + case CharacterCodes.lessThan: + return this.isConflictMarker() ? + this.next(Kind.ConflictMarker, mergeConflictMarkerLength) : + this.#chNext === CharacterCodes.hash ? + this.scanMultiLineHashComment() : + this.#chNext === CharacterCodes.lessThan ? + this.#chNextNext === CharacterCodes.equals ? + this.next(Kind.LessThanLessThanEquals, 3) : + this.next(Kind.LessThanLessThan, 2) : + this.#chNext === CharacterCodes.equals ? + this.next(Kind.LessThanEquals, 2) : + this.next(Kind.LessThan); + + case CharacterCodes.greaterThan: + return this.isConflictMarker() ? + this.next(Kind.ConflictMarker, mergeConflictMarkerLength) : + this.next(Kind.GreaterThan); + + case CharacterCodes.equals: + return this.isConflictMarker() ? + this.next(Kind.ConflictMarker, mergeConflictMarkerLength) : + this.#chNext === CharacterCodes.equals ? + this.#chNextNext === CharacterCodes.equals ? + this.next(Kind.EqualsEqualsEquals, 3) : + this.next(Kind.EqualsEquals, 2) : + this.#chNext === CharacterCodes.greaterThan ? + this.next(Kind.EqualsArrow, 2) : + this.next(Kind.Equals); + + case CharacterCodes.bar: + return this.isConflictMarker() ? + this.next(Kind.ConflictMarker, mergeConflictMarkerLength) : + this.#chNext === CharacterCodes.bar ? + this.#chNextNext === CharacterCodes.equals ? + this.next(Kind.BarBarEquals, 3) : + this.next(Kind.BarBar, 2) : + this.#chNext === CharacterCodes.equals ? + this.next(Kind.BarEquals, 2) : + this.next(Kind.Bar); + + case CharacterCodes.singleQuote: + case CharacterCodes.doubleQuote: + return this.scanString(); + + case CharacterCodes.backtick: + return this.#column === 0 && this.#chNext === CharacterCodes.backtick && this.#chNextNext === CharacterCodes.backtick ? + this.scanCodeFence() : this.scanString(); + + default: + // FYI: + // Well-known characters that are currently not processed + // # \ + // will need to update the scanner if there is a need to recognize them + return isIdentifierStart(this.#ch) ? this.scanIdentifier() : this.next(Kind.Unknown); + } + } + + this.text = ''; + return this.kind = Kind.EndOfFile; + } + + take(): Token { + const result = { ...this }; + this.scan(); + return result; + } + + *takeUntil(endToken: Kind, options?: { escape?: Kind[]; nestable?: [Kind, Kind][] }, yieldFinalClose?: boolean): Iterable { + const nestable = options?.nestable || []; + const escape = options?.escape || []; + + processing: do { + switch (this.kind) { + case endToken: + // if we're nested, we need to return the end token, because it's significant to the consumer + if (yieldFinalClose) { + yield this.take(); + return; + } + + // we're done here, lose the last token and get out + this.take(); + return; + + case Kind.EndOfFile: + throw new Error('Unexpected end of tokens'); + } + + // check for escaped tokens + if (escape.includes(this.kind)) { + // pull through the escape token + // and the next token + yield this.take(); + yield this.take(); + continue; + } + + // check for nested tokens + for (const [open, close] of nestable as [Kind, Kind][]) { + if (this.kind === open) { + yield this.take(); // yield the open token + yield* this.takeUntil(close, options, true); + continue processing; + } + } + + // yield the current token + yield this.take(); + } while (true); + } + + takeWhitespace() { + while (!this.eof && this.isWhitespace) { + this.scan(); + } + } + + takeWhiteSpaceAndNewLines() { + while (!this.eof && (this.isWhitespace || this.isNewLine)) { + this.scan(); + } + } + + get isWhitespace() { + return this.kind === Kind.Whitespace; + } + + get isNewLine() { + return this.kind === Kind.NewLine; + } + + get isEndOfFile() { + return this.kind === Kind.EndOfFile; + } + + get isComment() { + switch (this.kind) { + case Kind.SingleLineComment: + case Kind.MultiLineComment: + case Kind.SingleLineHashComment: + case Kind.MultiLineHashComment: + return true; + } + return false; + } + + /** + * When the current token is greaterThan, this will return any tokens with characters + * after the greater than character. This has to be scanned separately because greater + * than appears in positions where longer tokens are incorrect, e.g. `model x=y;`. + * The solution is to call rescanGreaterThan from the parser in contexts where longer + * tokens starting with `>` are allowed (i.e. when parsing binary expressions). + */ + rescanGreaterThan(): Kind { + if (this.kind === Kind.GreaterThan) { + return this.#ch === CharacterCodes.greaterThan ? + this.#chNext === CharacterCodes.equals ? + this.next(Kind.GreaterThanGreaterThanEquals, 3) : + this.next(Kind.GreaterThanGreaterThan, 2) : + this.#ch === CharacterCodes.equals ? + this.next(Kind.GreaterThanEquals, 2) : + this.next(Kind.GreaterThan); + } + return this.kind; + } + + private isConflictMarker() { + // Conflict markers must be at the start of a line. + if (this.#offset === 0 || isLineBreak(this.#text.charCodeAt(this.#offset - 1))) { + if ((this.#offset + mergeConflictMarkerLength) < this.#length) { + for (let i = 0; i < mergeConflictMarkerLength; i++) { + if (this.#text.charCodeAt(this.#offset + i) !== this.#ch) { + return false; + } + } + return this.#ch === CharacterCodes.equals || this.#text.charCodeAt(this.#offset + mergeConflictMarkerLength) === CharacterCodes.space; + } + } + + return false; + } + + private scanWhitespace(): Kind { + // since whitespace are not always 1 character wide, we're going to mark the position before the whitespace. + this.markPosition(); + + do { + // advance the position + this.#column += this.widthOfCh; + this.advance(); + } while (isWhiteSpaceSingleLine(this.#ch)); + + // and after... + this.markPosition(); + + this.text = this.#text.substring(this.offset, this.#offset); + return this.kind = Kind.Whitespace; + } + + private scanDigits(): string { + const start = this.#offset; + while (isDigit(this.#ch)) { + this.advance(); + } + return this.#text.substring(start, this.#offset); + } + + private scanNumber() { + const start = this.#offset; + + const main = this.scanDigits(); + let decimal: string | undefined; + let scientific: string | undefined; + + if (this.#ch === CharacterCodes.dot) { + this.advance(); + decimal = this.scanDigits(); + } + + if (this.#ch === CharacterCodes.E || this.#ch === CharacterCodes.e) { + this.assert(isDigit(this.#chNext), 'ParseError: Digit expected (0-9)'); + this.advance(); + scientific = this.scanDigits(); + } + + this.text = scientific ? + decimal ? + `${main}.${decimal}e${scientific}` : + `${main}e${scientific}` : + decimal ? + `${main}.${decimal}` : + main; + + // update the position + this.#column += this.#offset - start; + return this.kind = Kind.NumericLiteral; + } + + private scanHexNumber() { + this.assert(isHexDigit(this.#chNextNext), 'ParseError: Hex Digit expected (0-F,0-f)'); + this.advance(2); + + this.text = `0x${this.scanUntil((ch) => !isHexDigit(ch), 'Hex Digit')}`; + return this.kind = Kind.NumericLiteral; + } + + private scanBinaryNumber() { + this.assert(isBinaryDigit(this.#chNextNext), 'ParseError: Binary Digit expected (0,1)'); + + this.advance(2); + + this.text = `0b${this.scanUntil((ch) => !isBinaryDigit(ch), 'Binary Digit')}`; + return this.kind = Kind.NumericLiteral; + + } + + private get widthOfCh() { + return this.#ch === CharacterCodes.tab ? (this.#column % this.tabWidth || this.tabWidth) : 1; + } + + private scanUntil(predicate: (char: number, charNext: number, charNextNext: number) => boolean, expectedClose?: string, consumeClose?: number) { + const start = this.#offset; + + do { + // advance the position + if (isLineBreak(this.#ch)) { + this.advance(this.#ch === CharacterCodes.carriageReturn && this.#chNext === CharacterCodes.lineFeed ? 2 : 1); + this.#line++; + this.#column = 0; + this.markPosition(); // make sure the map has the new location + } else { + this.#column += this.widthOfCh; + this.advance(); + } + + if (this.eof) { + this.assert(!expectedClose, `Unexpected end of file while searching for '${expectedClose}'`); + break; + } + + } while (!predicate(this.#ch, this.#chNext, this.#chNextNext)); + + if (consumeClose) { + this.advance(consumeClose); + } + + // and after... + this.markPosition(); + + return this.#text.substring(start, this.#offset); + } + + private scanSingleLineComment() { + this.text = this.scanUntil(isLineBreak); + return this.kind = Kind.SingleLineComment; + } + private scanHashComment() { + this.text = this.scanUntil(isLineBreak); + return this.kind = Kind.SingleLineHashComment; + } + private scanMultiLineComment() { + this.text = this.scanUntil((ch, chNext) => ch === CharacterCodes.asterisk && chNext === CharacterCodes.slash, '*/', 2); + return this.kind = Kind.MultiLineComment; + } + private scanMultiLineHashComment() { + this.text = this.scanUntil((ch, chNext) => ch === CharacterCodes.hash && chNext === CharacterCodes.greaterThan, '#>', 2); + return this.kind = Kind.MultiLineHashComment; + } + + private scanString() { + const quote = this.#ch; + const quoteLength = 1; + const closing = String.fromCharCode(this.#ch); + let escaped = false; + let crlf = false; + let isEscaping = false; + + const text = this.scanUntil((ch, chNext, _chNextNext) => { + if (isEscaping) { + isEscaping = false; + return false; + } + + if (ch === CharacterCodes.backslash) { + isEscaping = escaped = true; + return false; + } + + if (ch === CharacterCodes.carriageReturn) { + if (chNext === CharacterCodes.lineFeed) { + crlf = true; + } + return false; + } + + return ch === quote; + }, closing, quoteLength); + + // TODO: optimize to single pass over string, easier if we refactor some bookkeeping first. + + // strip quotes + let value = text.substring(quoteLength, text.length - quoteLength); + + // Normalize CRLF to LF when interpreting value of multi-line string + // literals. Matches JavaScript behavior and ensures program behavior does + // not change due to line-ending conversion. + if (crlf) { + value = value.replace(/\r\n/g, '\n'); + } + + if (escaped) { + value = this.unescapeString(value); + } + + this.text = text; + this.stringValue = value; + return this.kind = Kind.StringLiteral; + } + + private scanCodeFence() { + // skip to the end of this line first + const fenceStart = this.scanUntil((ch, chNext) => ch === CharacterCodes.lineFeed || (ch === CharacterCodes.carriageReturn && chNext === CharacterCodes.lineFeed)); + + // end when the first column is triple backtick + const code = this.scanUntil((ch, chNext, chNextNext) => this.#column === 0 && (ch === CharacterCodes.backtick && chNext === CharacterCodes.backtick && chNextNext === CharacterCodes.backtick)); + + this.text = fenceStart + code; + + // code is just the inside contents + this.stringValue = code.substring(0, code.length - 3); + + return this.kind = Kind.CodeFence; + } + + private unescapeString(text: string) { + let result = ''; + let start = 0; + let pos = 0; + const end = text.length; + + while (pos < end) { + let ch = text.charCodeAt(pos); + if (ch !== CharacterCodes.backslash) { + pos++; + continue; + } + + result += text.substring(start, pos); + pos++; + ch = text.charCodeAt(pos); + + switch (ch) { + case CharacterCodes.r: + result += '\r'; + break; + case CharacterCodes.n: + result += '\n'; + break; + case CharacterCodes.t: + result += '\t'; + break; + case CharacterCodes.singleQuote: + result += '\''; + break; + case CharacterCodes.doubleQuote: + result += '"'; + break; + case CharacterCodes.backslash: + result += '\\'; + break; + case CharacterCodes.backtick: + result += '`'; + break; + default: + throw new ScannerError('Invalid escape sequence', this.position.line, this.position.column); + } + + pos++; + start = pos; + } + + result += text.substring(start, pos); + return result; + } + + scanIdentifier() { + this.text = this.scanUntil((ch) => !isIdentifierPart(ch)); + return this.kind = keywords.get(this.text) ?? Kind.Identifier; + } + + scanVariable() { + this.text = '$'; + this.text += this.scanUntil((ch) => !isIdentifierPart(ch)); + return this.kind = Kind.Variable; + } + + /** + * Returns the zero-based line/column from the given offset + * (binary search through the token start locations) + * @param offset the character position in the document + */ + positionFromOffset(offset: number): Position { + let position = { line: 0, column: 0, offset: 0 }; + + // eslint-disable-next-line keyword-spacing + if (offset < 0 || offset > this.#length) { + return { line: position.line, column: position.column }; + } + + let first = 0; // left endpoint + let last = this.#map.length - 1; // right endpoint + let middle = Math.floor((first + last) / 2); + + while (first <= last) { + middle = Math.floor((first + last) / 2); + position = this.#map[middle]; + if (position.offset === offset) { + return { line: position.line, column: position.column }; + } + if (position.offset < offset) { + first = middle + 1; + continue; + } + last = middle - 1; + position = this.#map[last]; + } + return { line: position.line, column: position.column + (offset - position.offset) }; + } + + static * tokensFrom(text: string): Iterable { + const scanner = new Scanner(text).start(); + while (!scanner.eof) { + yield scanner.take(); + } + } + + protected assert(assertion: boolean, message: string) { + if (!assertion) { + const p = this.position; + throw new ScannerError(message, p.line, p.column); + } + } +} + +export class ScannerError extends Error { + constructor(message: string, public readonly line: number, public readonly column: number) { + super(message); + } +} diff --git a/Extension/src/Utility/Text/streams.ts b/Extension/src/Utility/Text/streams.ts new file mode 100644 index 0000000000..adc7679382 --- /dev/null +++ b/Extension/src/Utility/Text/streams.ts @@ -0,0 +1,10 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +import { verboseEnabled } from '../../constants'; + +export function verbose(...args: any[]): void { + return verboseEnabled || process.argv.includes('--verbose') ? console.log(...args) : undefined; +} diff --git a/Extension/src/Utility/Text/taggedLiteral.ts b/Extension/src/Utility/Text/taggedLiteral.ts new file mode 100644 index 0000000000..494df53207 --- /dev/null +++ b/Extension/src/Utility/Text/taggedLiteral.ts @@ -0,0 +1,254 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +/* eslint-disable @typescript-eslint/no-non-null-assertion */ + +import { safeEval } from '../Sandbox/sandbox'; +import { is } from '../System/guards'; +import { Primitive } from '../System/types'; +import { isIdentifierPart, isIdentifierStart } from './characterCodes'; + +/** simple dynamic tagged literal implementation */ +export function taggedLiteral(templateString: string, templateVars: Record): string { + return safeEval(`\`${templateString.replace('\\', '\\\\').replace(/`/, '\`')}\`;`, templateVars) as string; +} + +function parseTaggedLiteral(templateString: string) { + // must parse the inside of JavaScript tagged literal format + // and ensure that escape sequences like \n \t \r \$ are handled correctly + const result = { + template: new Array(), + expressions: new Array(), + state: 'text' as 'text' | 'escape' | 'dollar' | 'substitution' | 'error' | 'ok', + message: '' + }; + + let template = ''; + let expression = ''; + + for (const char of templateString) { + switch (result.state) { + case 'text': + switch (char) { + case '\\': + result.state = 'escape'; + continue; + case '$': + result.state = 'dollar'; + continue; + } + template += char; + continue; + + case 'escape': + template = `${template}\\${char}`; + result.state = 'text'; + continue; + + case 'dollar': + if (char === '{') { + result.state = 'substitution'; + result.template.push(template); + template = ''; + continue; + } + template = `${template}$${char}`; + result.state = 'text'; + continue; + + case 'substitution': + switch (char) { + case '}': + result.expressions.push(expression); + expression = ''; + result.state = 'text'; + continue; + + case ' ': + case '\t': + case '\r': + case '\n': + continue; // ignore whitespace + + case ':': + case '.': + expression += ':'; + continue; + } + if (expression) { + if (isIdentifierPart(char.codePointAt(0)!) || char === '-' || char === '/') { + expression += char; + continue; + } + // error, fall through + } else if (isIdentifierStart(char.codePointAt(0)!) || char === '-' || char === '/') { + expression += char; + continue; + } + + // not a valid character for an expression + result.state = 'error'; + result.message = `Unexpected character '${char}' in expression ${expression}`; + return result; + } + } + + switch (result.state) { + case 'escape': + result.state = 'error'; + result.message = 'Unexpected end of string (trailing backslash)'; + return result; + case 'substitution': + result.state = 'error'; + result.message = 'Unexpected end of string parsing expression ${ '; + return result; + case 'dollar': + template += '$'; + break; + } + result.state = 'ok'; + result.template.push(template); + return result; +} + +function split(expression: string) { + return (expression.match(/(.*?):(.*)/) || ['', '', expression]).slice(1); +} + +function resolveValue(expression: string, context: Record, customResolver = (_prefix: string, _expression: string) => ''): string { + const [prefix, suffix] = split(expression); + + function joinIfArray(value: any, separator = '\u0007') { + return Array.isArray(value) ? value.join(separator) : value.toString(); + } + + if (prefix) { + const variable = context[prefix]; + if (variable !== undefined && variable !== null) { // did we get back an actual value + // it's a child of a variable + return joinIfArray(suffix.includes(':') ? // is the suffix another expression? + resolveValue(suffix, variable) : // Yeah, resolve it + variable[suffix] ?? customResolver(prefix, suffix) ?? ''); // No, return the member of the variable, or dynamic, or empty string + } + + // no variable by that name, so return the dynamic value, or an empty string + return joinIfArray(customResolver(prefix, suffix) ?? ''); + } + + // look up the value in the variables, or ask the dynamic function to resolve it, failing that, an empty string + return joinIfArray(context[suffix] ?? customResolver(prefix, suffix) ?? ''); +} + +// eslint-disable-next-line @typescript-eslint/naming-convention +class as { + /** returns the value as a number (NOT NaN) or undefined */ + static number(value: any): number | undefined { + if (isNaN(value)) { + return undefined; + } + value = parseFloat(value); + return isNaN(value) ? undefined : value; + } + + /** returns the value as an integer number (NOT NaN) or undefined */ + static integer(value: any): number | undefined { + value = as.number(value); + return value === undefined ? undefined : Math.floor(value); + } + + /** returns the value as a number (NOT NaN) or undefined */ + static float(value: any): number | undefined { + return as.number(value); // all numbers can be floats + } + + /** returns the value as a boolean or undefined */ + static boolean(value: any): boolean | undefined { + switch (value) { + case true: + case 'true': + return true; + case false: + case 'false': + return false; + } + return undefined; + } + + static primitive(value: any): Primitive | undefined { + switch (typeof value) { + case 'string': + return as.number(value) ?? as.boolean(value) ?? value; + + case 'number': + return isNaN(value) ? undefined : value; + + case 'boolean': + return value; + + default: + return undefined; + } + } + + static string(value: any): string | undefined { + switch (typeof value) { + case 'object': + return undefined; + + case 'string': + return value; + + case 'number': + case 'boolean': + return isFinite(value as any) ? value.toString() : undefined; + + default: + return undefined; + } + } + + static js(value: any): Primitive | undefined { + return JSON.stringify(as.primitive(value)); + } +} + +export function render(templateStrings: string[], context: Record, customResolver?: (prefix: string, expression: string) => string, ensureValuesAreValidJS?: boolean): string[]; +export function render(templateString: string, context: Record, customResolver?: (prefix: string, expression: string) => string, ensureValuesAreValidJS?: boolean): string; +export function render(templateString: string | string[], context: Record, customResolver = (_prefix: string, _expression: string) => '', asJs = false): string | string[] { + if (Array.isArray(templateString)) { + return templateString.map(each => render(each, context, customResolver, asJs)); + } + + // quick exit if it's not a templated string + if (!templateString.includes('${')) { + return templateString; + } + const { template, expressions, state, message } = parseTaggedLiteral(templateString); + const stabilize = asJs ? as.js : (x: string) => as.string(x) ?? ''; + return state === 'error' ? + message : // return the error message if the parse failed. (this is fatal anyways) + template.reduce((result, each, index) => `${result}${stabilize(resolveValue(expressions[index - 1], context, customResolver))}${each}`); // resolve the inline expressions and join the template +} + +export function evaluateExpression(expression: string, context: Record, customResolver = (_prefix: string, _expression: string) => ''): Primitive | undefined { + const result = expression.match(/\!|==|!=|>=|<=|>|<|\?|\|\||&&/) ? safeEval(render(expression, context, customResolver, true)) as Primitive : render(expression, context, customResolver); + return result === '' || result === 'undefined' || result === 'null' || result === null ? undefined : result; +} + +export function recursiveRender>(obj: T, context: Record, customResolver = (_prefix: string, _expression: string) => ''): T { + const result = (is.array(obj) ? [] : {}) as Record; + for (const [key, value] of Object.entries(obj)) { + const newKey = is.string(key) && key.includes('${') ? render(key, context, customResolver) : key; + + if (is.string(value)) { + result[newKey] = evaluateExpression(value, context, customResolver); + } else if (typeof value === 'object') { + result[newKey] = recursiveRender(value, context, customResolver); + } else { + result[newKey] = value; + } + } + return result as T; +} diff --git a/Extension/src/common.ts b/Extension/src/common.ts index d14824a0ad..b7ff8d3e04 100644 --- a/Extension/src/common.ts +++ b/Extension/src/common.ts @@ -30,15 +30,13 @@ export type Mutable = { -readonly [P in keyof T]: T[P] extends ReadonlyArray ? Mutable[] : Mutable }; -// Platform-specific environment variable delimiter -export const envDelimiter: string = (process.platform === 'win32') ? ";" : ":"; - export let extensionPath: string; export let extensionContext: vscode.ExtensionContext | undefined; export function setExtensionContext(context: vscode.ExtensionContext): void { extensionContext = context; extensionPath = extensionContext.extensionPath; } + export function setExtensionPath(path: string): void { extensionPath = path; } @@ -47,6 +45,7 @@ let cachedClangFormatPath: string | undefined; export function getCachedClangFormatPath(): string | undefined { return cachedClangFormatPath; } + export function setCachedClangFormatPath(path: string): void { cachedClangFormatPath = path; } @@ -55,6 +54,7 @@ let cachedClangTidyPath: string | undefined; export function getCachedClangTidyPath(): string | undefined { return cachedClangTidyPath; } + export function setCachedClangTidyPath(path: string): void { cachedClangTidyPath = path; } @@ -200,9 +200,10 @@ export function isCpp(document: vscode.TextDocument): boolean { return document.uri.scheme === "file" && (document.languageId === "c" || document.languageId === "cpp" || document.languageId === "cuda-cpp"); } + export function isCppPropertiesJson(document: vscode.TextDocument): boolean { return document.uri.scheme === "file" && (document.languageId === "json" || document.languageId === "jsonc") && - (document.fileName.endsWith("c_cpp_properties.json")); + document.fileName.endsWith("c_cpp_properties.json"); } let isWorkspaceCpp: boolean = false; export function setWorkspaceIsCpp(): void { @@ -210,9 +211,11 @@ export function setWorkspaceIsCpp(): void { isWorkspaceCpp = true; } } + export function getWorkspaceIsCpp(): boolean { return isWorkspaceCpp; } + export function isCppOrRelated(document: vscode.TextDocument): boolean { return isCpp(document) || isCppPropertiesJson(document) || (document.uri.scheme === "output" && document.uri.fsPath.startsWith("extension-output-ms-vscode.cpptools")) || (isWorkspaceCpp && (document.languageId === "json" || document.languageId === "jsonc") && @@ -304,19 +307,19 @@ export function isUri(input: any): input is vscode.Uri { } export function isString(input: any): input is string { - return typeof (input) === "string"; + return typeof input === "string"; } export function isNumber(input: any): input is number { - return typeof (input) === "number"; + return typeof input === "number"; } export function isBoolean(input: any): input is boolean { - return typeof (input) === "boolean"; + return typeof input === "boolean"; } export function isObject(input: any): input is object { - return typeof (input) === "object"; + return typeof input === "object"; } export function isArray(input: any): input is any[] { @@ -354,7 +357,7 @@ export function defaultExePath(): string { } export function findExePathInArgs(args: string[]): string | undefined { - const exePath: string | undefined = args.find((arg: string, index: number) => (arg.includes(".exe") || (index > 0 && args[index - 1] === "-o"))); + const exePath: string | undefined = args.find((arg: string, index: number) => arg.includes(".exe") || (index > 0 && args[index - 1] === "-o")); if (exePath?.startsWith("/Fe")) { return exePath.substring(3); } @@ -404,7 +407,7 @@ export function resolveVariables(input: string | undefined, additionalEnvironmen newValue = ""; break; } else { - newValue = v.join(envDelimiter); + newValue = v.join(path.delimiter); } } } @@ -495,7 +498,7 @@ export async function fsStat(filePath: fs.PathLike): Promise { - return !!(await fsStat(filePath)); + return !!await fsStat(filePath); } /** Test whether a file exists */ @@ -1089,7 +1092,7 @@ export function extractCompilerPathAndArgs(useLegacyBehavior: boolean, inputComp if (isCl(compilerPath) || checkExecutableWithoutExtensionExistsSync(compilerPath)) { // If the path ends with cl, or if a file is found at that path, accept it without further validation. compilerName = path.basename(compilerPath); - } else if ((compilerPath.startsWith("\"") || (os.platform() !== 'win32' && compilerPath.startsWith("'")))) { + } else if (compilerPath.startsWith("\"") || (os.platform() !== 'win32' && compilerPath.startsWith("'"))) { // If the string starts with a quote, treat it as a command line. // Otherwise, a path with a leading quote would not be valid. if (useLegacyBehavior) { @@ -1256,7 +1259,7 @@ const allowedIdentifierUnicodeRanges: number[][] = [ [0xB0000, 0xBFFFD], // [0xC0000, 0xCFFFD], // [0xD0000, 0xDFFFD], // - [0xE0000, 0xEFFFD] // LANGUAGE TAG (U+E0001) - VARIATION SELECTOR-256 (U+E01EF) + [0xE0000, 0xEFFFD] // LANGUAGE TAG (U+E0001) - VARIATION SELECTOR-256 (U+E01EF) ]; const disallowedFirstCharacterIdentifierUnicodeRanges: number[][] = [ @@ -1264,7 +1267,7 @@ const disallowedFirstCharacterIdentifierUnicodeRanges: number[][] = [ [0x0300, 0x036F], // COMBINING GRAVE ACCENT - COMBINING LATIN SMALL LETTER X [0x1DC0, 0x1DFF], // COMBINING DOTTED GRAVE ACCENT - COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW [0x20D0, 0x20FF], // COMBINING LEFT HARPOON ABOVE - COMBINING ASTERISK ABOVE - [0xFE20, 0xFE2F] // COMBINING LIGATURE LEFT HALF - COMBINING CYRILLIC TITLO RIGHT HALF + [0xFE20, 0xFE2F] // COMBINING LIGATURE LEFT HALF - COMBINING CYRILLIC TITLO RIGHT HALF ]; export function isValidIdentifier(candidate: string): boolean { @@ -1337,7 +1340,7 @@ export function sequentialResolve(items: T[], promiseBuilder: (item: T) => Pr export function normalizeArg(arg: string): string { arg = arg.trim(); // Check if the arg is enclosed in backtick, - // or includes unescaped double-quotes (or single-quotes on windows), + // or includes unescaped double-quotes (or single-quotes on Windows), // or includes unescaped single-quotes on mac and linux. if (/^`.*`$/g.test(arg) || /.*[^\\]".*/g.test(arg) || (process.platform.includes("win") && /.*[^\\]'.*/g.test(arg)) || diff --git a/Extension/src/constants.ts b/Extension/src/constants.ts index ae178f4daf..e38b513df2 100644 --- a/Extension/src/constants.ts +++ b/Extension/src/constants.ts @@ -4,5 +4,12 @@ * ------------------------------------------------------------------------------------------ */ import { platform } from 'os'; -export const isWindows = platform() === 'win32'; +export const OperatingSystem = platform(); + +export const isWindows = OperatingSystem === 'win32'; +export const isMacOS = OperatingSystem === 'darwin'; +export const isLinux = OperatingSystem === 'linux'; + +// if you want to see the output of verbose logging, set this to true. +export const verboseEnabled = false; diff --git a/Extension/src/expand.ts b/Extension/src/expand.ts index 59319162c6..f3586a54bc 100644 --- a/Extension/src/expand.ts +++ b/Extension/src/expand.ts @@ -3,6 +3,8 @@ * See 'LICENSE' in the project root for license information. * ------------------------------------------------------------------------------------------ */ +/* eslint-disable no-cond-assign */ + import * as vscode from 'vscode'; import * as nls from 'vscode-nls'; import { isString, replaceAll } from './common'; @@ -72,7 +74,7 @@ async function expandStringImpl(input: string, options: ExpansionOptions): Promi const var_re: RegExp = /\$\{(\w+)\}/g; let match: RegExpMatchArray | null = null; - while ((match = var_re.exec(input))) { + while (match = var_re.exec(input)) { const full: string = match[0]; const key: string = match[1]; if (key !== 'dollar') { @@ -91,7 +93,7 @@ async function expandStringImpl(input: string, options: ExpansionOptions): Promi // as few times as possible, expanding as needed (lazy) const varValueRegexp: string = ".+?"; const env_re: RegExp = RegExp(`\\$\\{env:(${varValueRegexp})\\}`, "g"); - while ((match = env_re.exec(input))) { + while (match = env_re.exec(input)) { const full: string = match[0]; const varname: string = match[1]; if (process.env[varname] === undefined) { @@ -102,7 +104,7 @@ async function expandStringImpl(input: string, options: ExpansionOptions): Promi } const command_re: RegExp = RegExp(`\\$\\{command:(${varValueRegexp})\\}`, "g"); - while ((match = command_re.exec(input))) { + while (match = command_re.exec(input)) { if (options.doNotSupportCommands) { void getOutputChannelLogger().showWarningMessage(localize('commands.not.supported', 'Commands are not supported for string: {0}.', input)); break; @@ -110,7 +112,7 @@ async function expandStringImpl(input: string, options: ExpansionOptions): Promi const full: string = match[0]; const command: string = match[1]; if (subs.has(full)) { - continue; // Don't execute commands more than once per string + continue; // Don't execute commands more than once per string } try { const command_ret: unknown = await vscode.commands.executeCommand(command, options.vars.workspaceFolder); diff --git a/Extension/src/main.ts b/Extension/src/main.ts index c02ee313cc..aab4a873bf 100644 --- a/Extension/src/main.ts +++ b/Extension/src/main.ts @@ -84,7 +84,7 @@ export async function activate(context: vscode.ExtensionContext): Promise boolean)): {it: Mocha.TestFunction} { + if (is.function(prerequisite)) { + prerequisite = prerequisite(); + } + if (prerequisite) { + return {it}; + } else { + const skip = (title: string, test: AsyncFunc | Func) => it.skip(`Dynamically skipping test: <<${title}>> - prerequisite not met.`, test); + return {it:skip as Mocha.TestFunction}; + } +} + +import { MessagePort } from 'worker_threads'; +import { collectGarbage } from '../../src/Utility/System/garbageCollector'; + +function showActiveHandles() { + const open = (process as any)._getActiveHandles().filter( + (each: any) => + !each.destroyed && // discard handles that claim they are destroyed. + !(each.fd === 0) && // ignore stdin/stdout/stderr + !(each.fd === 1) && // ignore stdin/stdout/stderr + !(each.fd === 2) && // ignore stdin/stdout/stderr + !(each instanceof MessagePort) && // ignore worker thread message ports + each.listening // keep servers that are still listening. + + ); + + if (open.length) { + console.log('################'); + console.log('Active Handles: '); + console.log('################'); + console.log(open); + } +} + +let misbehavingPromises: Set>; + +export function addMisbehavingPromise(promise: Promise) { + misbehavingPromises?.add(promise); + return promise; +} +(global as any).addMisbehavingPromise = addMisbehavingPromise; +let MAX = 20; + +export function initDevModeChecks() { + misbehavingPromises = new Set>(); + + try { + // eslint-disable-next-line @typescript-eslint/no-var-requires + require('mocha').afterAll?.(() => { + collectGarbage(); + console.log("showing!"); + showActiveHandles(); + }); + } catch { + // ignore + console.log('oops'); + } + + process.on('unhandledRejection', (reason: any, p) => { + + console.log(`Unhandled Rejection at: Promise ${p} - reason:, ${(reason as any)?.stack ?? reason}`); + }); + + process.on('multipleResolves', (type, promise, reason) => { + if (misbehavingPromises.has(promise)) { + return; + } + if (reason && (reason as any).stack) { + console.error((reason as any).stack); + return; + } + if (!MAX--) { + throw new Error('MAX MULTIPLE RESOLVED REACHED'); + } + console.error({text: 'Multiple Resolves', type, promise, reason}); + }); + + process.on('exit', showActiveHandles); +} + +initDevModeChecks(); diff --git a/Extension/test/common/selectTests.ts b/Extension/test/common/selectTests.ts new file mode 100644 index 0000000000..fc564b4f7f --- /dev/null +++ b/Extension/test/common/selectTests.ts @@ -0,0 +1,122 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ +/* eslint-disable no-cond-assign */ +/* eslint-disable @typescript-eslint/no-unused-vars */ + +import { readdir } from 'fs/promises'; +import { IOptions, glob as globSync } from 'glob'; +import * as Mocha from 'mocha'; +import { basename, dirname, resolve } from 'path'; +import { env } from 'process'; +import { promisify } from 'util'; +import { returns } from '../../src/Utility/Async/returns'; +import { filepath } from '../../src/Utility/Filesystem/filepath'; + +export const glob: (pattern: string, options?: IOptions | undefined) => Promise = promisify(globSync); + +// depending if this is pulled in as a ts-node script, or an already-compiled file in dist/... +const $root = __dirname.includes('dist') ? resolve(__dirname, '..', '..', '..') : resolve(__dirname, '..', '..'); + +const scenariosFolder = resolve($root, 'test', 'scenarios'); + +async function getScenarioInfo(val: string) { + + // is it a name relative to the tests/scenarios folder? + const folder = await filepath.isFolder(val, scenariosFolder); + + if (folder) { + let name = basename(folder); + if (name === 'assets') { + name = basename(dirname(folder)); + } + + if ((await readdir(`${$root}/dist/test/scenarios/${name}/tests`).catch(returns.empty)).length === 0) { + // no tests in this scenario have been compiled + return undefined; + } + const assets = await filepath.isFolder('assets', folder) ?? folder; + + return { + name, + assets, + workspace: (await glob(`${folder}/**/*.code-workspace`))[0] || assets + }; + } + + const file = await filepath.isFile(val, scenariosFolder); + if (file) { + const assets = dirname(dirname(file)); + const name = basename(assets); + if ((await readdir(`${$root}/dist/test/scenarios/${name}/tests`)).length === 0) { + // no tests in this scenario have been compiled + return undefined; + } + + return { + name, + assets, + workspace: file + }; + } + return undefined; +} + +export async function getTestInfo(...scenarioOptions: (string | undefined)[]) { + for (const each of scenarioOptions) { + if (each) { + const result = await getScenarioInfo(each); + if (result) { + return result; + } + } + } + return undefined; +} + +export function run (testsRoot: string, cb: (error: any, failures?: number) => void): void { +/** + * This code runs in the extension host process, and not in the launch (main.ts) process. + */ + let location = ''; + + // scan through the $args to find the --scenario=... + process.argv.slice(2).find(arg => arg.startsWith('--scenario=') && (location = arg.substring('--scenario='.length))); + + void getTestInfo(location, env.SCENARIO).then(async (testInfo) => { + if (!testInfo) { + console.error(`The Scenario folder must be specified either by '--scenario=...' or an environment variable 'SCENARIO=...'`); + process.exit(1); + } + const { name} = testInfo; + + void glob(`${$root}/dist/test/scenarios/${name}/tests/**/**.test.js`).then((files) => { + + try { + if (!files.length) { + throw new Error(`Unable to find unit tests for ${name} at '${$root}/dist/test/scenarios/${name}/tests/**/**.test.js'`); + } + const mocha = new Mocha({ + ui: 'tdd', + timeout: 500000, + require: ['source-map-support/register'], + color: true + }); + + // Add files to the test suite + files.forEach(f => mocha.addFile(resolve(testsRoot, f))); + + console.log('\n\n=============================================\n Test Output\n\n'); + // Run the mocha test + mocha.run((failures: any) => { + cb(null, failures); + console.log('\n\n=============================================\n\n'); + }); + } catch (err) { + console.error(err); + cb(err); + } + }); + }); +} diff --git a/Extension/test/integrationTests/testHelpers.ts b/Extension/test/common/testHelpers.ts similarity index 85% rename from Extension/test/integrationTests/testHelpers.ts rename to Extension/test/common/testHelpers.ts index 8eda747602..e935a5d5ab 100644 --- a/Extension/test/integrationTests/testHelpers.ts +++ b/Extension/test/common/testHelpers.ts @@ -4,18 +4,17 @@ * ------------------------------------------------------------------------------------------ */ /* eslint-disable @typescript-eslint/triple-slash-reference */ /// -import { fail } from 'assert'; import * as vscode from 'vscode'; export const defaultTimeout: number = 100000; export async function activateCppExtension(): Promise { - const extension = vscode.extensions.getExtension("ms-vscode.cpptools") ?? fail("Could not get CppTools extension"); - - if (!extension.isActive) { + const extension = vscode.extensions.getExtension("ms-vscode.cpptools"); + if (extension && !extension.isActive) { await extension.activate(); } } + export function delay(ms: number): Promise { return new Promise(resolve => setTimeout(resolve, ms)); } diff --git a/Extension/test/integrationTests/IntelliSenseFeatures/index.ts b/Extension/test/integrationTests/IntelliSenseFeatures/index.ts deleted file mode 100644 index 7882af5634..0000000000 --- a/Extension/test/integrationTests/IntelliSenseFeatures/index.ts +++ /dev/null @@ -1,38 +0,0 @@ -import * as path from 'path'; -import * as Mocha from 'mocha'; -import * as glob from 'glob'; - -export function run(): Promise { - // Create the mocha test - const mocha = new Mocha({ - ui: 'tdd', - color: true - }); - - const testsRoot = __dirname; - - return new Promise((c, e) => { - glob('**/**.test.js', { cwd: testsRoot }, (err, files) => { - if (err) { - return e(err); - } - - // Add files to the test suite - files.forEach(f => mocha.addFile(path.resolve(testsRoot, f))); - - try { - // Run the mocha test - mocha.timeout(100000); - mocha.run(failures => { - if (failures > 0) { - e(new Error(`${failures} tests failed.`)); - } else { - c(); - } - }); - } catch (err) { - e(err); - } - }); - }); -} diff --git a/Extension/test/integrationTests/IntelliSenseFeatures/runTest.ts b/Extension/test/integrationTests/IntelliSenseFeatures/runTest.ts deleted file mode 100644 index 6db161bb20..0000000000 --- a/Extension/test/integrationTests/IntelliSenseFeatures/runTest.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { downloadAndUnzipVSCode, resolveCliArgsFromVSCodeExecutablePath, runTests } from '@vscode/test-electron'; -import { ok } from 'assert'; -import { createHash } from 'crypto'; -import { existsSync } from 'fs'; -import { mkdir as md, stat } from 'fs/promises'; -import { tmpdir } from 'os'; -import { resolve } from 'path'; - -// The folder containing the Extension Manifest package.json -// Passed to `--extensionDevelopmentPath` -const extensionDevelopmentPath = resolve(__dirname, '../../../../'); - -const isolated = resolve(tmpdir(), '.vscode-test', createHash('sha256').update(extensionDevelopmentPath).digest('hex').substring(0,6) ); - -const options = { - cachePath: `${isolated}/cache`, - launchArgs: ['--no-sandbox', '--disable-updates', '--skip-welcome', '--skip-release-notes', `--extensions-dir=${isolated}/extensions`, `--user-data-dir=${isolated}/user-data`] -}; -async function mkdir(filePath:string) { - filePath = resolve(filePath); - try { - const s = await stat(filePath); - if( s.isDirectory() ) { - return filePath; - } - throw new Error(`Cannot create directory '${filePath}' because thre is a file there.`); - } catch { - // no worries - } - - await md(filePath, { recursive: true }) - return filePath; -} - -async function main() { - try { - // create a folder for the isolated test environment - await mkdir(isolated); - - // download VSCode to that location - const vscodeExecutablePath = await downloadAndUnzipVSCode(options); - const [cli, ...launchArgs] = resolveCliArgsFromVSCodeExecutablePath(vscodeExecutablePath).filter(each => !each.startsWith('--extensions-dir=') && !each.startsWith('--user-data-dir=')); - - // clean up args so that it works with the isolate extensions and data directories - launchArgs.push(`--extensions-dir=${isolated}/extensions`, `--user-data-dir=${isolated}/user-data`); - - // The path to the extension test script - // Passed to --extensionTestsPath - const extensionTestsPath = resolve(__dirname, './index'); - - // Note, when running tests locally, replace TESTS_WORKSPACE with local path to "~/Vcls-vscode-test/MultirootDeadlockTest/test.code-workspace" - // in the Launch.json file. - let testWorkspace: string | undefined = process.env.TESTS_WORKSPACE || resolve(extensionDevelopmentPath, '../../Vcls-vscode-test/MultirootDeadlockTest/test.code-workspace'); - ok(existsSync(testWorkspace), `TESTS_WORKSPACE '${testWorkspace}' does not exist.`); - - console.log("TESTS_WORKSPACE: " + testWorkspace); - - launchArgs.push("--disable-extensions", testWorkspace ); - - // Download VS Code, unzip it and run the integration test - await runTests({ - ...options, - launchArgs, - extensionDevelopmentPath, - extensionTestsPath - }); - } catch (err) { - console.log(err); - console.log('Failed to run tests.'); - process.exit(1); - } -} - -main(); - diff --git a/Extension/test/integrationTests/MockDebugger/debugAdapterDescriptorFactory.ts b/Extension/test/integrationTests/MockDebugger/debugAdapterDescriptorFactory.ts deleted file mode 100644 index 8262d93b18..0000000000 --- a/Extension/test/integrationTests/MockDebugger/debugAdapterDescriptorFactory.ts +++ /dev/null @@ -1,46 +0,0 @@ -/* -------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All Rights Reserved. - * See 'LICENSE' in the project root for license information. - * ------------------------------------------------------------------------------------------ */ -import * as path from 'path'; -import * as vscode from "vscode"; - -// import * as util from '../src/common' <- DO NOT USE. Also do not use anything with relative paths, it will break during replacing in test/integrationTests/debug/integration.test.ts - -abstract class AbstractDebugAdapterDescriptorFactory implements vscode.DebugAdapterDescriptorFactory { - protected readonly context: vscode.ExtensionContext; - - constructor(context: vscode.ExtensionContext) { - this.context = context; - } - - abstract createDebugAdapterDescriptor(session: vscode.DebugSession, executable?: vscode.DebugAdapterExecutable): vscode.ProviderResult; -} - -export class CppdbgDebugAdapterDescriptorFactory extends AbstractDebugAdapterDescriptorFactory { - public static DEBUG_TYPE: string = "cppdbg"; - - constructor(context: vscode.ExtensionContext) { - super(context); - } - - createDebugAdapterDescriptor(_session: vscode.DebugSession, _executable?: vscode.DebugAdapterExecutable): vscode.ProviderResult { - console.warn("This should only appear in a test scenario."); - - return new vscode.DebugAdapterExecutable('node', [path.join(this.context.extensionPath, './out/test/integrationTests/MockDebugger/mockDebug.js')]); - } -} - -export class CppvsdbgDebugAdapterDescriptorFactory extends AbstractDebugAdapterDescriptorFactory { - public static DEBUG_TYPE: string = "cppvsdbg"; - - constructor(context: vscode.ExtensionContext) { - super(context); - } - - createDebugAdapterDescriptor(_session: vscode.DebugSession, _executable?: vscode.DebugAdapterExecutable): vscode.ProviderResult { - console.warn("This should only appear in a test scenario."); - - return new vscode.DebugAdapterExecutable('node', [path.join(this.context.extensionPath, './out/test/integrationTests/MockDebugger/mockDebug.js')]); - } -} diff --git a/Extension/test/integrationTests/MockDebugger/mockDebugSession.ts b/Extension/test/integrationTests/MockDebugger/mockDebugSession.ts deleted file mode 100644 index 01c4090780..0000000000 --- a/Extension/test/integrationTests/MockDebugger/mockDebugSession.ts +++ /dev/null @@ -1,65 +0,0 @@ -/* -------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All Rights Reserved. - * See 'LICENSE' in the project root for license information. - * ------------------------------------------------------------------------------------------ */ - -import { InitializedEvent, Logger, logger, LoggingDebugSession, TerminatedEvent } from '@vscode/debugadapter'; -import { DebugProtocol } from '@vscode/debugprotocol'; -import { Subject } from 'await-notify'; - -interface LaunchRequestArguments extends DebugProtocol.LaunchRequestArguments { - /** An absolute path to the "program" to debug. */ - program: string; - - /** enable logging the Debug Adapter Protocol */ - logPath?: string; -} - -export class MockDebugSession extends LoggingDebugSession { - private _configurationDone = new Subject(); - - public constructor() { - super("mock-debug.txt"); - } - - protected initializeRequest(response: DebugProtocol.InitializeResponse, _args: DebugProtocol.InitializeRequestArguments): void { - // build and return the capabilities of this debug adapter: - response.body = response.body || {}; - - // the adapter implements the configurationDoneRequest. - - response.body.supportsConfigurationDoneRequest = true; - - this.sendResponse(response); - // since this debug adapter can accept configuration requests like 'setBreakpoint' at any time, - // we request them early by sending an 'initializeRequest' to the frontend. - // The frontend will end the configuration sequence by calling 'configurationDone' request. - this.sendEvent(new InitializedEvent()); - - } - - protected configurationDoneRequest(response: DebugProtocol.ConfigurationDoneResponse, args: DebugProtocol.ConfigurationDoneArguments): void { - - super.configurationDoneRequest(response, args); - // notify the launchRequest that configuration has finished - this._configurationDone.notify(); - - } - - protected async launchRequest(response: DebugProtocol.LaunchResponse, args: LaunchRequestArguments): Promise { - // make sure to 'Stop' the buffered logging if 'trace' is not set - logger.setup(Logger.LogLevel.Verbose, args.logPath); - - // wait until configuration has finished (and configurationDoneRequest has been called) - await this._configurationDone.wait(1000); - - this.sendResponse(response); - - // Terminate after launch. - this.sendEvent(new TerminatedEvent()); - } - - protected async disconnectRequest(response: DebugProtocol.DisconnectResponse, _args: DebugProtocol.DisconnectArguments): Promise { - this.sendResponse(response); - } -} diff --git a/Extension/test/integrationTests/debug/index.ts b/Extension/test/integrationTests/debug/index.ts deleted file mode 100644 index b9011acab0..0000000000 --- a/Extension/test/integrationTests/debug/index.ts +++ /dev/null @@ -1,39 +0,0 @@ -import * as path from 'path'; -import * as Mocha from 'mocha'; -import * as glob from 'glob'; -const MochaTest = (Mocha as any) as (new (options?: Mocha.MochaOptions) => Mocha); - -export function run(): Promise { - // Create the mocha test - const mocha = new MochaTest({ - ui: 'tdd', - color: true - }); - - const testsRoot = __dirname; - - return new Promise((c, e) => { - glob('**/**.test.js', { cwd: testsRoot }, (err, files) => { - if (err) { - return e(err); - } - - // Add files to the test suite - files.forEach(f => mocha.addFile(path.resolve(testsRoot, f))); - - try { - // Run the mocha test - mocha.timeout(100000); - mocha.run(failures => { - if (failures > 0) { - e(new Error(`${failures} tests failed.`)); - } else { - c(); - } - }); - } catch (err) { - e(err); - } - }); - }); -} diff --git a/Extension/test/integrationTests/debug/runTest.ts b/Extension/test/integrationTests/debug/runTest.ts deleted file mode 100644 index 74974f50a2..0000000000 --- a/Extension/test/integrationTests/debug/runTest.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { downloadAndUnzipVSCode, resolveCliArgsFromVSCodeExecutablePath, runTests } from '@vscode/test-electron'; -import { createHash } from 'crypto'; -import { mkdir as md, stat } from 'fs/promises'; -import { tmpdir } from 'os'; -import { resolve } from 'path'; - -// The folder containing the Extension Manifest package.json -// Passed to `--extensionDevelopmentPath` -const extensionDevelopmentPath = resolve(__dirname, '../../../../'); - -const isolated = resolve(tmpdir(), '.vscode-test', createHash('sha256').update(extensionDevelopmentPath).digest('hex').substring(0,6) ); - -const options = { - cachePath: `${isolated}/cache`, - launchArgs: ['--no-sandbox', '--disable-updates', '--skip-welcome', '--skip-release-notes', `--extensions-dir=${isolated}/extensions`, `--user-data-dir=${isolated}/user-data`] -}; -async function mkdir(filePath:string) { - filePath = resolve(filePath); - try { - const s = await stat(filePath); - if( s.isDirectory() ) { - return filePath; - } - throw new Error(`Cannot create directory '${filePath}' because thre is a file there.`); - } catch { - // no worries - } - - await md(filePath, { recursive: true }) - return filePath; -} - -async function main() { - try { - // create a folder for the isolated test environment - await mkdir(isolated); - - // download VSCode to that location - const vscodeExecutablePath = await downloadAndUnzipVSCode(options); - const [cli, ...launchArgs] = resolveCliArgsFromVSCodeExecutablePath(vscodeExecutablePath).filter(each => !each.startsWith('--extensions-dir=') && !each.startsWith('--user-data-dir=')); - - // clean up args so that it works with the isolate extensions and data directories - launchArgs.push(`--extensions-dir=${isolated}/extensions`, `--user-data-dir=${isolated}/user-data`); - - // The path to the extension test script - // Passed to --extensionTestsPath - const extensionTestsPath = resolve(__dirname, './index'); - - launchArgs.push("--disable-extensions"); - - // Download VS Code, unzip it and run the integration test - await runTests({ - ...options, - launchArgs, - extensionDevelopmentPath, - extensionTestsPath - }); - } catch (err) { - console.log(err); - console.log('Failed to run tests.'); - process.exit(1); - } -} - -main(); diff --git a/Extension/test/integrationTests/languageServer/index.ts b/Extension/test/integrationTests/languageServer/index.ts deleted file mode 100644 index 3208127d61..0000000000 --- a/Extension/test/integrationTests/languageServer/index.ts +++ /dev/null @@ -1,39 +0,0 @@ -import * as glob from 'glob'; -import * as Mocha from 'mocha'; -import * as path from 'path'; -const MochaTest = (Mocha as any) as (new (options?: Mocha.MochaOptions) => Mocha); - -export function run(): Promise { - // Create the mocha test - const mocha = new MochaTest({ - ui: 'tdd', - color: true - }); - - const testsRoot = __dirname; - - return new Promise((c, e) => { - glob('**/**.test.js', { cwd: testsRoot }, (err, files) => { - if (err) { - return e(err); - } - - // Add files to the test suite - files.forEach(f => mocha.addFile(path.resolve(testsRoot, f))); - - try { - // Run the mocha test - mocha.timeout(100000); - mocha.run(failures => { - if (failures > 0) { - e(new Error(`${failures} tests failed.`)); - } else { - c(); - } - }); - } catch (err) { - e(err); - } - }); - }); -} diff --git a/Extension/test/integrationTests/languageServer/runTest.ts b/Extension/test/integrationTests/languageServer/runTest.ts deleted file mode 100644 index 879a16eeb1..0000000000 --- a/Extension/test/integrationTests/languageServer/runTest.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { downloadAndUnzipVSCode, resolveCliArgsFromVSCodeExecutablePath, runTests } from '@vscode/test-electron'; -import { createHash } from 'crypto'; -import { mkdir as md, stat } from 'fs/promises'; -import { tmpdir } from 'os'; -import { resolve } from 'path'; - -// The folder containing the Extension Manifest package.json -// Passed to `--extensionDevelopmentPath` -const extensionDevelopmentPath = resolve(__dirname, '../../../../'); - -const isolated = resolve(tmpdir(), '.vscode-test', createHash('sha256').update(extensionDevelopmentPath).digest('hex').substring(0,6) ); - -const options = { - cachePath: `${isolated}/cache`, - launchArgs: ['--no-sandbox', '--disable-updates', '--skip-welcome', '--skip-release-notes', `--extensions-dir=${isolated}/extensions`, `--user-data-dir=${isolated}/user-data`] -}; -async function mkdir(filePath:string) { - filePath = resolve(filePath); - try { - const s = await stat(filePath); - if( s.isDirectory() ) { - return filePath; - } - throw new Error(`Cannot create directory '${filePath}' because thre is a file there.`); - } catch { - // no worries - } - - await md(filePath, { recursive: true }) - return filePath; -} - -async function main() { - try { - // create a folder for the isolated test environment - await mkdir(isolated); - - // download VSCode to that location - const vscodeExecutablePath = await downloadAndUnzipVSCode(options); - const [cli, ...launchArgs] = resolveCliArgsFromVSCodeExecutablePath(vscodeExecutablePath).filter(each => !each.startsWith('--extensions-dir=') && !each.startsWith('--user-data-dir=')); - - // clean up args so that it works with the isolate extensions and data directories - launchArgs.push(`--extensions-dir=${isolated}/extensions`, `--user-data-dir=${isolated}/user-data`); - - // The path to the extension test script - // Passed to --extensionTestsPath - const extensionTestsPath = resolve(__dirname, './index'); - - const testWorkspace = resolve(extensionDevelopmentPath, 'test/integrationTests/testAssets/SimpleCppProject/simpleCppProject.code-workspace'); - - launchArgs.push("--disable-extensions", testWorkspace ); - - // Download VS Code, unzip it and run the integration test - await runTests({ - ...options, - launchArgs, - extensionDevelopmentPath, - extensionTestsPath - }); - } catch (err) { - console.log(err); - console.log('Failed to run tests.'); - process.exit(1); - } -} - -main(); diff --git a/Extension/test/integrationTests/debug/integration.test.ts b/Extension/test/scenarios/Debugger/tests/integration.test.ts similarity index 91% rename from Extension/test/integrationTests/debug/integration.test.ts rename to Extension/test/scenarios/Debugger/tests/integration.test.ts index 32c8ea8c37..5ce790cbdb 100644 --- a/Extension/test/integrationTests/debug/integration.test.ts +++ b/Extension/test/scenarios/Debugger/tests/integration.test.ts @@ -4,14 +4,12 @@ * ------------------------------------------------------------------------------------------ */ /* eslint-disable @typescript-eslint/no-unused-vars */ /* eslint-disable @typescript-eslint/triple-slash-reference */ -/// -import * as vscode from 'vscode'; +/// import * as assert from 'assert'; +import { suite } from 'mocha'; +import * as vscode from 'vscode'; suite(`Debug Integration Test: `, function(): void { - let origFactoryFile: string; - let tempFactoryFile: string; - let hijackedFactoryFile: string; suiteSetup(async function(): Promise { const extension: vscode.Extension = vscode.extensions.getExtension("ms-vscode.cpptools") || assert.fail("Extension not found"); diff --git a/Extension/test/scenarios/MultiRootProjects/assets/project_A/documentSymbols/levelOneFolder/levelOneFile.cpp b/Extension/test/scenarios/MultiRootProjects/assets/project_A/documentSymbols/levelOneFolder/levelOneFile.cpp new file mode 100644 index 0000000000..f25a2a44cf --- /dev/null +++ b/Extension/test/scenarios/MultiRootProjects/assets/project_A/documentSymbols/levelOneFolder/levelOneFile.cpp @@ -0,0 +1,26 @@ +#include "levelOneFile.h" + +namespace test +{ + namespace extra + { + helper::helper(/* args */) + { + my_val_help = 2; + } + + int helper::getHelp() + { + return my_val_help; + } + } + document_symbol_tests::document_symbol_tests(/* args */) + { + val = 10 * h.getHelp(); + } +} + +rootClass::rootClass() +{ + rootVal = 10; +} \ No newline at end of file diff --git a/Extension/test/scenarios/MultiRootProjects/assets/project_A/documentSymbols/levelOneFolder/levelOneFile.h b/Extension/test/scenarios/MultiRootProjects/assets/project_A/documentSymbols/levelOneFolder/levelOneFile.h new file mode 100644 index 0000000000..52b8a35cab --- /dev/null +++ b/Extension/test/scenarios/MultiRootProjects/assets/project_A/documentSymbols/levelOneFolder/levelOneFile.h @@ -0,0 +1,32 @@ +namespace test +{ + namespace extra + { + class helper + { + private: + int my_val_help; + public: + helper(/* args */); + int getHelp(); + }; + } + + class document_symbol_tests + { + private: + int val; + extra::helper h; + public: + document_symbol_tests(/* args */); + ~document_symbol_tests(); + }; +} + +class rootClass +{ + private: + int rootVal; + public: + rootClass(); +}; \ No newline at end of file diff --git a/Extension/test/scenarios/MultiRootProjects/assets/project_A/documentSymbols/levelOneFolder/levelTwoFolder/levelTwoFile.cpp b/Extension/test/scenarios/MultiRootProjects/assets/project_A/documentSymbols/levelOneFolder/levelTwoFolder/levelTwoFile.cpp new file mode 100644 index 0000000000..f96ef19895 --- /dev/null +++ b/Extension/test/scenarios/MultiRootProjects/assets/project_A/documentSymbols/levelOneFolder/levelTwoFolder/levelTwoFile.cpp @@ -0,0 +1,22 @@ +#include "levelTwoFile.h" + +namespace foo { + namespace bar { + namespace baz { + int qux = 42; + } + } +} + +namespace foo::bar::baz +{ + namespace foo3 + { + class c {}; + } +} + +int main() +{ + return 0; +} \ No newline at end of file diff --git a/Extension/test/scenarios/MultiRootProjects/assets/project_A/documentSymbols/levelOneFolder/levelTwoFolder/levelTwoFile.h b/Extension/test/scenarios/MultiRootProjects/assets/project_A/documentSymbols/levelOneFolder/levelTwoFolder/levelTwoFile.h new file mode 100644 index 0000000000..5242cdf236 --- /dev/null +++ b/Extension/test/scenarios/MultiRootProjects/assets/project_A/documentSymbols/levelOneFolder/levelTwoFolder/levelTwoFile.h @@ -0,0 +1,29 @@ +namespace NS +{ + class F + { + void f(); + void g(); + void l(); + }; +} + +void h() +{ +} + +namespace NS +{ + void F::f() + { + } + void F::g() + { + } +} + +using namespace NS; + +void F::l() +{ +} diff --git a/Extension/test/scenarios/MultiRootProjects/assets/project_A/main.cpp b/Extension/test/scenarios/MultiRootProjects/assets/project_A/main.cpp new file mode 100644 index 0000000000..858b4d56b5 --- /dev/null +++ b/Extension/test/scenarios/MultiRootProjects/assets/project_A/main.cpp @@ -0,0 +1,6 @@ +#include "references.h" + +int main() +{ + nsReferences::funcInHeader1(); +} \ No newline at end of file diff --git a/Extension/test/scenarios/MultiRootProjects/assets/project_A/project_subfolder_H/documentSymbols/levelOneFolder/levelOneFile.cpp b/Extension/test/scenarios/MultiRootProjects/assets/project_A/project_subfolder_H/documentSymbols/levelOneFolder/levelOneFile.cpp new file mode 100644 index 0000000000..f25a2a44cf --- /dev/null +++ b/Extension/test/scenarios/MultiRootProjects/assets/project_A/project_subfolder_H/documentSymbols/levelOneFolder/levelOneFile.cpp @@ -0,0 +1,26 @@ +#include "levelOneFile.h" + +namespace test +{ + namespace extra + { + helper::helper(/* args */) + { + my_val_help = 2; + } + + int helper::getHelp() + { + return my_val_help; + } + } + document_symbol_tests::document_symbol_tests(/* args */) + { + val = 10 * h.getHelp(); + } +} + +rootClass::rootClass() +{ + rootVal = 10; +} \ No newline at end of file diff --git a/Extension/test/scenarios/MultiRootProjects/assets/project_A/project_subfolder_H/documentSymbols/levelOneFolder/levelOneFile.h b/Extension/test/scenarios/MultiRootProjects/assets/project_A/project_subfolder_H/documentSymbols/levelOneFolder/levelOneFile.h new file mode 100644 index 0000000000..52b8a35cab --- /dev/null +++ b/Extension/test/scenarios/MultiRootProjects/assets/project_A/project_subfolder_H/documentSymbols/levelOneFolder/levelOneFile.h @@ -0,0 +1,32 @@ +namespace test +{ + namespace extra + { + class helper + { + private: + int my_val_help; + public: + helper(/* args */); + int getHelp(); + }; + } + + class document_symbol_tests + { + private: + int val; + extra::helper h; + public: + document_symbol_tests(/* args */); + ~document_symbol_tests(); + }; +} + +class rootClass +{ + private: + int rootVal; + public: + rootClass(); +}; \ No newline at end of file diff --git a/Extension/test/scenarios/MultiRootProjects/assets/project_A/project_subfolder_H/documentSymbols/levelOneFolder/levelTwoFolder/levelTwoFile.cpp b/Extension/test/scenarios/MultiRootProjects/assets/project_A/project_subfolder_H/documentSymbols/levelOneFolder/levelTwoFolder/levelTwoFile.cpp new file mode 100644 index 0000000000..f96ef19895 --- /dev/null +++ b/Extension/test/scenarios/MultiRootProjects/assets/project_A/project_subfolder_H/documentSymbols/levelOneFolder/levelTwoFolder/levelTwoFile.cpp @@ -0,0 +1,22 @@ +#include "levelTwoFile.h" + +namespace foo { + namespace bar { + namespace baz { + int qux = 42; + } + } +} + +namespace foo::bar::baz +{ + namespace foo3 + { + class c {}; + } +} + +int main() +{ + return 0; +} \ No newline at end of file diff --git a/Extension/test/scenarios/MultiRootProjects/assets/project_A/project_subfolder_H/documentSymbols/levelOneFolder/levelTwoFolder/levelTwoFile.h b/Extension/test/scenarios/MultiRootProjects/assets/project_A/project_subfolder_H/documentSymbols/levelOneFolder/levelTwoFolder/levelTwoFile.h new file mode 100644 index 0000000000..5242cdf236 --- /dev/null +++ b/Extension/test/scenarios/MultiRootProjects/assets/project_A/project_subfolder_H/documentSymbols/levelOneFolder/levelTwoFolder/levelTwoFile.h @@ -0,0 +1,29 @@ +namespace NS +{ + class F + { + void f(); + void g(); + void l(); + }; +} + +void h() +{ +} + +namespace NS +{ + void F::f() + { + } + void F::g() + { + } +} + +using namespace NS; + +void F::l() +{ +} diff --git a/Extension/test/scenarios/MultiRootProjects/assets/project_A/project_subfolder_H/main.cpp b/Extension/test/scenarios/MultiRootProjects/assets/project_A/project_subfolder_H/main.cpp new file mode 100644 index 0000000000..858b4d56b5 --- /dev/null +++ b/Extension/test/scenarios/MultiRootProjects/assets/project_A/project_subfolder_H/main.cpp @@ -0,0 +1,6 @@ +#include "references.h" + +int main() +{ + nsReferences::funcInHeader1(); +} \ No newline at end of file diff --git a/Extension/test/scenarios/MultiRootProjects/assets/project_A/project_subfolder_H/quickInfo.cpp b/Extension/test/scenarios/MultiRootProjects/assets/project_A/project_subfolder_H/quickInfo.cpp new file mode 100644 index 0000000000..44974d5eef --- /dev/null +++ b/Extension/test/scenarios/MultiRootProjects/assets/project_A/project_subfolder_H/quickInfo.cpp @@ -0,0 +1,15 @@ + +#include + +// comment for myfunction +void myfunction(int var1, std::string var2, std::string var3) +{ +} + +int main() +{ + std::string stringVar = "myString"; + int intVar = 0; + myfunction(intVar, stringVar, "stringVar"); + myfunction(intVar); +} \ No newline at end of file diff --git a/Extension/test/scenarios/MultiRootProjects/assets/project_A/project_subfolder_H/references.cpp b/Extension/test/scenarios/MultiRootProjects/assets/project_A/project_subfolder_H/references.cpp new file mode 100644 index 0000000000..475dd14749 --- /dev/null +++ b/Extension/test/scenarios/MultiRootProjects/assets/project_A/project_subfolder_H/references.cpp @@ -0,0 +1,54 @@ +namespace foo { + namespace bar { + namespace baz { + int qux = 42; + } + } +} + +namespace foo::bar::baz +{ +} + +#include "references.h" + +using namespace nsReferences; + +int var1; // file scope extern +int func1(); // declaration +int func1(float var1) // local param +{ + { + double var1 = 0; // new local scope + return var1; + } + return var1 + func1(); +} + +int func1() // overload. Returns confirmed and non-confirmed references. +{ + if (var1 == 0) + return func1(0); +} + +void func2() +{ + funcInHeader1(); +} + +void func3() +{ + // func1 comment reference func1 (source file) + const char *s = "func1"; // string reference +#if 0 + func1(0); // inactive reference +#endif + cannotConfirmReference1; + { + int cannotConfirmReference1; + } +} + +const char* myLibStr = "MyLibStr"; // References in the IDL +#include "testIdl.idl" +void MyTypeLibrary() { return ; } // Not an IDL reference diff --git a/Extension/test/scenarios/MultiRootProjects/assets/project_A/project_subfolder_H/references.h b/Extension/test/scenarios/MultiRootProjects/assets/project_A/project_subfolder_H/references.h new file mode 100644 index 0000000000..67ebada6dc --- /dev/null +++ b/Extension/test/scenarios/MultiRootProjects/assets/project_A/project_subfolder_H/references.h @@ -0,0 +1,13 @@ +namespace nsReferences +{ + void funcInHeader1(); // referenced in source files references.cpp and main.cpp + + void funcInHeader2() + { + funcInHeader1(); + } + + void funcInHeader3(); + + // func1 comment reference (header file) +} diff --git a/Extension/test/scenarios/MultiRootProjects/assets/project_A/project_subfolder_H/semantic_colorization.cpp b/Extension/test/scenarios/MultiRootProjects/assets/project_A/project_subfolder_H/semantic_colorization.cpp new file mode 100644 index 0000000000..ae1d6088c6 --- /dev/null +++ b/Extension/test/scenarios/MultiRootProjects/assets/project_A/project_subfolder_H/semantic_colorization.cpp @@ -0,0 +1,344 @@ + +// The following file exercises all semantic tokens supported by the C/C++ Extension. +// +// To test, toggle the setting "C_Cpp.enhancedColorization" between "Enabled" and "Disabled". +// All tokens referred to as being "colored semantically" below, should be colored differently if enabled. +// +// Some language features (ref classes, value classes, etc.) require C++/CLI support to be enabled. +// Enable C++/CLI by configuring the C/C++ Extension to use "cl.exe" as the compiler (so, on WIndows), +// and set "compilerArgs" to: ["/clr"] +// +// Use the Dark+ theme to test. +// Since not all semantic tokens are colored by the Dark+ theme, add the following settings: +// +// "editor.tokenColorCustomizations": { +// "textMateRules": [ +// { +// "scope": "variable.other.event", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "entity.name.type.class.generic", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "variable.other.global", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "entity.name.label", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "entity.name.function.preprocessor", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "variable.other.property", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "entity.name.namespace", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "keyword.operator.new", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "entity.name.function.operator", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "entity.name.function.operator.member", +// "settings": { +// "foreground": "#FFFF00" +// } +// }, +// { +// "scope": "variable.parameter", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "entity.name.type.class.reference", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "variable.other.property.static", +// "settings": { +// "foreground": "#FFFF00" +// } +// }, +// { +// "scope": "entity.name.function.member.static", +// "settings": { +// "foreground": "#FFFF00" +// } +// }, +// { +// "scope": "entity.name.type", +// "settings": { +// "foreground": "#00FF00" +// } +// }, +// { +// "scope": "entity.name.operator.custom-literal.number", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "entity.name.operator.custom-literal.string", +// "settings": { +// "foreground": "#00FF00" +// } +// }, +// { +// "scope": "entity.name.operator.custom-literal", +// "settings": { +// "foreground": "#FFFF00" +// } +// }, +// { +// "scope": "entity.name.type.class.value", +// "settings": { +// "foreground": "#FFFF00" +// } +// }, +// { +// "scope": "variable.other.property.cli", +// "settings": { +// "foreground": "#FFFF00" +// } +// } +// ] +// } + + +// Class Template - entity.name.type.class.templated +template +class template_class // "template_class" colored syntactically +{ +}; + +template_class instance; // "template_class" colored semantically + +// Enumerator - variable.other.enummember +enum enum_type { + enum_member = 0 // "enum_member" colored syntactically +}; + +enum_type enum_instance = enum_type::enum_member; // "enum_member" colored semantically + +// Event (C++/CLI) - variable.other.event +// This requiress CLR support. i.e. Use cl.exe and: "compilerArgs": ["/clr"] +delegate void event_delegate(); +ref class A +{ + event event_delegate^ event_instance; // "event_instance" colored semantically +}; + +// Function - entity.name.function +void function() { } // "function" colored synatically +void function2() +{ + function(); // "function" colored synatically + void(*function_pointer)() = &function; // "function" color semantically +} + +// Function Template - entity.name.function.templated +template +void template_function() +{ + template_function(); + void(*function_pointer)() = &function; // "function" color semantically +} + +// Generic Type (C++/CLI) - entity.name.type.class.generic +// This requiress CLR support. i.e. Use cl.exe and: "compilerArgs": ["/clr"] +// KNOWN BUG: https://developercommunity.visualstudio.com/content/problem/565052/color-setting-for-c-user-types-generic-types-does.html +generic +ref class generic_class +{ +}; + +void generic_class_test() +{ + generic_class generic_class_instance; // "generic_class_instance" colored semantically +} + +// Global Variable - variable.other.global +int global_instance; // "global_instance" colored semantically + +// Label - entity.name.label +void label_test() +{ + goto Label1; // "Label1" colored semantically +Label1: // "Label1" colored syntactically +} + +// Local Variable - variable.other.local +void local_variable_test() +{ + int local_instance; // "local_instance" colored semantically +} + +// Macro - entity.name.function.preprocessor +#define MACRO(a, b) // "local_instance" colored syntactically +MACRO(a, b) // "local_instance" colored semantically + +// Member Field - variable.other.property +class member_field_test +{ + int member_instance; // "member_instance" colored semantically +}; + +// Member Function - entity.name.function.member +class C +{ +public: + void member_function() { } // "member_function" colored syntactically +}; + +void member_function_test() +{ + void(C::*member_function_ptr)() = &C::member_function; // "member_function" colored semantically +}; + +// Namespace - entity.name.namespace +namespace my_namespace { +class A +{ +}; +} + +my_namespace::A a; // "my_namesapce" color semantically + // "my_namespace" will also be colored synatically as a "entity.name.scope-resolution.cpp". + // Use a distinct color for entity.name.namespace to see the difference + + +// New / Delete - keyword.operator.new +struct operator_new_test_class +{ + void* operator new(size_t sz); // "operator new" is colored semantically +}; + +// Operator Overload Function - entity.name.function.operator +class OOF { }; +OOF& operator+=(OOF& b1, OOF& b2) // "operator+=" is colored semantically +{ + b1 += b2; // "+=" is colored semantically + return b1; +}; + +// Operator Overload Member - entity.name.function.operator.member +class OOM { + OOM& operator+=(OOM& b) // "operator+=" is colored semantically + { + *this += b; // "+=" is colored semantically + return *this; + }; +}; + +// Parameter - variable.parameter +void param_test(int param1) +{ + int i = param1; // "param1" is colored semantically here, where used. +} + +// Property (C++/CLI) - variable.other.property.cli +ref class ref_class_with_property { +public: + property int prop; // "prop" is colored semantically +}; +void property_test(ref_class_with_property^ obj) +{ + obj->prop = 111; // "prop" is colored semantically +} + +// Reference Type (C++/CLI) - entity.name.type.class.reference +ref class ref_class // "ref_class" is colored semantically +{ +}; +void ref_test() +{ + ref_class a; // "ref_class" is colored semantically +} + +// Static Member Field - variable.other.property.static +struct static_member_test +{ + static int static_member_instance; // "static_member_instance" is colored semantically + void foo() + { + static_member_instance = 2; // "static_member_instance" is colored semantically + } +}; + +// Static Member Function - entity.name.function.member.static +struct static_member_test +{ + static void foo() // "static_member_instance" is colored semantically + { + foo(); // "static_member_instance" is colored semantically + } +}; + +// Type - entity.name.type +class my_class +{ +}; +void my_class_test() +{ + my_class c; // "my_class" is colored semantically here +} + +// User-Defined Literal - Number - entity.name.operator.custom-literal.number +unsigned long long operator""_numeric(unsigned long long i) // "operator""_numeric" is colored semantically +{ + return 12345_numeric; // "12345_numeric" is colored semantically +} + +// User-Defined Literal - String - entity.name.operator.custom-literal.string +const char* operator""_str(const char* arr, size_t size) // "operator""_str" is colored semantically +{ + "ABC"_str; // ""ABC"_str" is colored semantically +} + +// User-Defined Literal - Raw - entity.name.operator.custom-literal +void operator"" _custom(const char* i) // "operator"" _custom" is colored semantically +{ + 0xABC_custom; // "0xABC_custom" is colored semantically +} + + +// Value Type (C++/CLI) - entity.name.type.class.value +value class value_class // "value_class" is colored semantically +{ +}; +void value_test() +{ + value_class a; // "value_class" is colored semantically +} diff --git a/Extension/test/scenarios/MultiRootProjects/assets/project_A/project_subfolder_H/testIdl.idl b/Extension/test/scenarios/MultiRootProjects/assets/project_A/project_subfolder_H/testIdl.idl new file mode 100644 index 0000000000..7c81bf9b2e --- /dev/null +++ b/Extension/test/scenarios/MultiRootProjects/assets/project_A/project_subfolder_H/testIdl.idl @@ -0,0 +1,12 @@ + +library MyTypeLibrary +{ + [ + uuid(5B98C2C0-CD7B-11d0-92DF-00A0C9138C45), + helpstring(myLibStr) + ] + coclass MyPackage + { + [default] interface IMyPackage; + }; +}; diff --git a/Extension/test/scenarios/MultiRootProjects/assets/project_A/quickInfo.cpp b/Extension/test/scenarios/MultiRootProjects/assets/project_A/quickInfo.cpp new file mode 100644 index 0000000000..44974d5eef --- /dev/null +++ b/Extension/test/scenarios/MultiRootProjects/assets/project_A/quickInfo.cpp @@ -0,0 +1,15 @@ + +#include + +// comment for myfunction +void myfunction(int var1, std::string var2, std::string var3) +{ +} + +int main() +{ + std::string stringVar = "myString"; + int intVar = 0; + myfunction(intVar, stringVar, "stringVar"); + myfunction(intVar); +} \ No newline at end of file diff --git a/Extension/test/scenarios/MultiRootProjects/assets/project_A/references.cpp b/Extension/test/scenarios/MultiRootProjects/assets/project_A/references.cpp new file mode 100644 index 0000000000..475dd14749 --- /dev/null +++ b/Extension/test/scenarios/MultiRootProjects/assets/project_A/references.cpp @@ -0,0 +1,54 @@ +namespace foo { + namespace bar { + namespace baz { + int qux = 42; + } + } +} + +namespace foo::bar::baz +{ +} + +#include "references.h" + +using namespace nsReferences; + +int var1; // file scope extern +int func1(); // declaration +int func1(float var1) // local param +{ + { + double var1 = 0; // new local scope + return var1; + } + return var1 + func1(); +} + +int func1() // overload. Returns confirmed and non-confirmed references. +{ + if (var1 == 0) + return func1(0); +} + +void func2() +{ + funcInHeader1(); +} + +void func3() +{ + // func1 comment reference func1 (source file) + const char *s = "func1"; // string reference +#if 0 + func1(0); // inactive reference +#endif + cannotConfirmReference1; + { + int cannotConfirmReference1; + } +} + +const char* myLibStr = "MyLibStr"; // References in the IDL +#include "testIdl.idl" +void MyTypeLibrary() { return ; } // Not an IDL reference diff --git a/Extension/test/scenarios/MultiRootProjects/assets/project_A/references.h b/Extension/test/scenarios/MultiRootProjects/assets/project_A/references.h new file mode 100644 index 0000000000..67ebada6dc --- /dev/null +++ b/Extension/test/scenarios/MultiRootProjects/assets/project_A/references.h @@ -0,0 +1,13 @@ +namespace nsReferences +{ + void funcInHeader1(); // referenced in source files references.cpp and main.cpp + + void funcInHeader2() + { + funcInHeader1(); + } + + void funcInHeader3(); + + // func1 comment reference (header file) +} diff --git a/Extension/test/scenarios/MultiRootProjects/assets/project_A/semantic_colorization.cpp b/Extension/test/scenarios/MultiRootProjects/assets/project_A/semantic_colorization.cpp new file mode 100644 index 0000000000..ae1d6088c6 --- /dev/null +++ b/Extension/test/scenarios/MultiRootProjects/assets/project_A/semantic_colorization.cpp @@ -0,0 +1,344 @@ + +// The following file exercises all semantic tokens supported by the C/C++ Extension. +// +// To test, toggle the setting "C_Cpp.enhancedColorization" between "Enabled" and "Disabled". +// All tokens referred to as being "colored semantically" below, should be colored differently if enabled. +// +// Some language features (ref classes, value classes, etc.) require C++/CLI support to be enabled. +// Enable C++/CLI by configuring the C/C++ Extension to use "cl.exe" as the compiler (so, on WIndows), +// and set "compilerArgs" to: ["/clr"] +// +// Use the Dark+ theme to test. +// Since not all semantic tokens are colored by the Dark+ theme, add the following settings: +// +// "editor.tokenColorCustomizations": { +// "textMateRules": [ +// { +// "scope": "variable.other.event", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "entity.name.type.class.generic", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "variable.other.global", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "entity.name.label", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "entity.name.function.preprocessor", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "variable.other.property", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "entity.name.namespace", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "keyword.operator.new", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "entity.name.function.operator", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "entity.name.function.operator.member", +// "settings": { +// "foreground": "#FFFF00" +// } +// }, +// { +// "scope": "variable.parameter", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "entity.name.type.class.reference", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "variable.other.property.static", +// "settings": { +// "foreground": "#FFFF00" +// } +// }, +// { +// "scope": "entity.name.function.member.static", +// "settings": { +// "foreground": "#FFFF00" +// } +// }, +// { +// "scope": "entity.name.type", +// "settings": { +// "foreground": "#00FF00" +// } +// }, +// { +// "scope": "entity.name.operator.custom-literal.number", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "entity.name.operator.custom-literal.string", +// "settings": { +// "foreground": "#00FF00" +// } +// }, +// { +// "scope": "entity.name.operator.custom-literal", +// "settings": { +// "foreground": "#FFFF00" +// } +// }, +// { +// "scope": "entity.name.type.class.value", +// "settings": { +// "foreground": "#FFFF00" +// } +// }, +// { +// "scope": "variable.other.property.cli", +// "settings": { +// "foreground": "#FFFF00" +// } +// } +// ] +// } + + +// Class Template - entity.name.type.class.templated +template +class template_class // "template_class" colored syntactically +{ +}; + +template_class instance; // "template_class" colored semantically + +// Enumerator - variable.other.enummember +enum enum_type { + enum_member = 0 // "enum_member" colored syntactically +}; + +enum_type enum_instance = enum_type::enum_member; // "enum_member" colored semantically + +// Event (C++/CLI) - variable.other.event +// This requiress CLR support. i.e. Use cl.exe and: "compilerArgs": ["/clr"] +delegate void event_delegate(); +ref class A +{ + event event_delegate^ event_instance; // "event_instance" colored semantically +}; + +// Function - entity.name.function +void function() { } // "function" colored synatically +void function2() +{ + function(); // "function" colored synatically + void(*function_pointer)() = &function; // "function" color semantically +} + +// Function Template - entity.name.function.templated +template +void template_function() +{ + template_function(); + void(*function_pointer)() = &function; // "function" color semantically +} + +// Generic Type (C++/CLI) - entity.name.type.class.generic +// This requiress CLR support. i.e. Use cl.exe and: "compilerArgs": ["/clr"] +// KNOWN BUG: https://developercommunity.visualstudio.com/content/problem/565052/color-setting-for-c-user-types-generic-types-does.html +generic +ref class generic_class +{ +}; + +void generic_class_test() +{ + generic_class generic_class_instance; // "generic_class_instance" colored semantically +} + +// Global Variable - variable.other.global +int global_instance; // "global_instance" colored semantically + +// Label - entity.name.label +void label_test() +{ + goto Label1; // "Label1" colored semantically +Label1: // "Label1" colored syntactically +} + +// Local Variable - variable.other.local +void local_variable_test() +{ + int local_instance; // "local_instance" colored semantically +} + +// Macro - entity.name.function.preprocessor +#define MACRO(a, b) // "local_instance" colored syntactically +MACRO(a, b) // "local_instance" colored semantically + +// Member Field - variable.other.property +class member_field_test +{ + int member_instance; // "member_instance" colored semantically +}; + +// Member Function - entity.name.function.member +class C +{ +public: + void member_function() { } // "member_function" colored syntactically +}; + +void member_function_test() +{ + void(C::*member_function_ptr)() = &C::member_function; // "member_function" colored semantically +}; + +// Namespace - entity.name.namespace +namespace my_namespace { +class A +{ +}; +} + +my_namespace::A a; // "my_namesapce" color semantically + // "my_namespace" will also be colored synatically as a "entity.name.scope-resolution.cpp". + // Use a distinct color for entity.name.namespace to see the difference + + +// New / Delete - keyword.operator.new +struct operator_new_test_class +{ + void* operator new(size_t sz); // "operator new" is colored semantically +}; + +// Operator Overload Function - entity.name.function.operator +class OOF { }; +OOF& operator+=(OOF& b1, OOF& b2) // "operator+=" is colored semantically +{ + b1 += b2; // "+=" is colored semantically + return b1; +}; + +// Operator Overload Member - entity.name.function.operator.member +class OOM { + OOM& operator+=(OOM& b) // "operator+=" is colored semantically + { + *this += b; // "+=" is colored semantically + return *this; + }; +}; + +// Parameter - variable.parameter +void param_test(int param1) +{ + int i = param1; // "param1" is colored semantically here, where used. +} + +// Property (C++/CLI) - variable.other.property.cli +ref class ref_class_with_property { +public: + property int prop; // "prop" is colored semantically +}; +void property_test(ref_class_with_property^ obj) +{ + obj->prop = 111; // "prop" is colored semantically +} + +// Reference Type (C++/CLI) - entity.name.type.class.reference +ref class ref_class // "ref_class" is colored semantically +{ +}; +void ref_test() +{ + ref_class a; // "ref_class" is colored semantically +} + +// Static Member Field - variable.other.property.static +struct static_member_test +{ + static int static_member_instance; // "static_member_instance" is colored semantically + void foo() + { + static_member_instance = 2; // "static_member_instance" is colored semantically + } +}; + +// Static Member Function - entity.name.function.member.static +struct static_member_test +{ + static void foo() // "static_member_instance" is colored semantically + { + foo(); // "static_member_instance" is colored semantically + } +}; + +// Type - entity.name.type +class my_class +{ +}; +void my_class_test() +{ + my_class c; // "my_class" is colored semantically here +} + +// User-Defined Literal - Number - entity.name.operator.custom-literal.number +unsigned long long operator""_numeric(unsigned long long i) // "operator""_numeric" is colored semantically +{ + return 12345_numeric; // "12345_numeric" is colored semantically +} + +// User-Defined Literal - String - entity.name.operator.custom-literal.string +const char* operator""_str(const char* arr, size_t size) // "operator""_str" is colored semantically +{ + "ABC"_str; // ""ABC"_str" is colored semantically +} + +// User-Defined Literal - Raw - entity.name.operator.custom-literal +void operator"" _custom(const char* i) // "operator"" _custom" is colored semantically +{ + 0xABC_custom; // "0xABC_custom" is colored semantically +} + + +// Value Type (C++/CLI) - entity.name.type.class.value +value class value_class // "value_class" is colored semantically +{ +}; +void value_test() +{ + value_class a; // "value_class" is colored semantically +} diff --git a/Extension/test/scenarios/MultiRootProjects/assets/project_A/testIdl.idl b/Extension/test/scenarios/MultiRootProjects/assets/project_A/testIdl.idl new file mode 100644 index 0000000000..7c81bf9b2e --- /dev/null +++ b/Extension/test/scenarios/MultiRootProjects/assets/project_A/testIdl.idl @@ -0,0 +1,12 @@ + +library MyTypeLibrary +{ + [ + uuid(5B98C2C0-CD7B-11d0-92DF-00A0C9138C45), + helpstring(myLibStr) + ] + coclass MyPackage + { + [default] interface IMyPackage; + }; +}; diff --git a/Extension/test/scenarios/MultiRootProjects/assets/project_B/documentSymbols/levelOneFolder/levelOneFile.cpp b/Extension/test/scenarios/MultiRootProjects/assets/project_B/documentSymbols/levelOneFolder/levelOneFile.cpp new file mode 100644 index 0000000000..f25a2a44cf --- /dev/null +++ b/Extension/test/scenarios/MultiRootProjects/assets/project_B/documentSymbols/levelOneFolder/levelOneFile.cpp @@ -0,0 +1,26 @@ +#include "levelOneFile.h" + +namespace test +{ + namespace extra + { + helper::helper(/* args */) + { + my_val_help = 2; + } + + int helper::getHelp() + { + return my_val_help; + } + } + document_symbol_tests::document_symbol_tests(/* args */) + { + val = 10 * h.getHelp(); + } +} + +rootClass::rootClass() +{ + rootVal = 10; +} \ No newline at end of file diff --git a/Extension/test/scenarios/MultiRootProjects/assets/project_B/documentSymbols/levelOneFolder/levelOneFile.h b/Extension/test/scenarios/MultiRootProjects/assets/project_B/documentSymbols/levelOneFolder/levelOneFile.h new file mode 100644 index 0000000000..52b8a35cab --- /dev/null +++ b/Extension/test/scenarios/MultiRootProjects/assets/project_B/documentSymbols/levelOneFolder/levelOneFile.h @@ -0,0 +1,32 @@ +namespace test +{ + namespace extra + { + class helper + { + private: + int my_val_help; + public: + helper(/* args */); + int getHelp(); + }; + } + + class document_symbol_tests + { + private: + int val; + extra::helper h; + public: + document_symbol_tests(/* args */); + ~document_symbol_tests(); + }; +} + +class rootClass +{ + private: + int rootVal; + public: + rootClass(); +}; \ No newline at end of file diff --git a/Extension/test/scenarios/MultiRootProjects/assets/project_B/documentSymbols/levelOneFolder/levelTwoFolder/levelTwoFile.cpp b/Extension/test/scenarios/MultiRootProjects/assets/project_B/documentSymbols/levelOneFolder/levelTwoFolder/levelTwoFile.cpp new file mode 100644 index 0000000000..f96ef19895 --- /dev/null +++ b/Extension/test/scenarios/MultiRootProjects/assets/project_B/documentSymbols/levelOneFolder/levelTwoFolder/levelTwoFile.cpp @@ -0,0 +1,22 @@ +#include "levelTwoFile.h" + +namespace foo { + namespace bar { + namespace baz { + int qux = 42; + } + } +} + +namespace foo::bar::baz +{ + namespace foo3 + { + class c {}; + } +} + +int main() +{ + return 0; +} \ No newline at end of file diff --git a/Extension/test/scenarios/MultiRootProjects/assets/project_B/documentSymbols/levelOneFolder/levelTwoFolder/levelTwoFile.h b/Extension/test/scenarios/MultiRootProjects/assets/project_B/documentSymbols/levelOneFolder/levelTwoFolder/levelTwoFile.h new file mode 100644 index 0000000000..5242cdf236 --- /dev/null +++ b/Extension/test/scenarios/MultiRootProjects/assets/project_B/documentSymbols/levelOneFolder/levelTwoFolder/levelTwoFile.h @@ -0,0 +1,29 @@ +namespace NS +{ + class F + { + void f(); + void g(); + void l(); + }; +} + +void h() +{ +} + +namespace NS +{ + void F::f() + { + } + void F::g() + { + } +} + +using namespace NS; + +void F::l() +{ +} diff --git a/Extension/test/scenarios/MultiRootProjects/assets/project_B/main.cpp b/Extension/test/scenarios/MultiRootProjects/assets/project_B/main.cpp new file mode 100644 index 0000000000..858b4d56b5 --- /dev/null +++ b/Extension/test/scenarios/MultiRootProjects/assets/project_B/main.cpp @@ -0,0 +1,6 @@ +#include "references.h" + +int main() +{ + nsReferences::funcInHeader1(); +} \ No newline at end of file diff --git a/Extension/test/scenarios/MultiRootProjects/assets/project_B/quickInfo.cpp b/Extension/test/scenarios/MultiRootProjects/assets/project_B/quickInfo.cpp new file mode 100644 index 0000000000..44974d5eef --- /dev/null +++ b/Extension/test/scenarios/MultiRootProjects/assets/project_B/quickInfo.cpp @@ -0,0 +1,15 @@ + +#include + +// comment for myfunction +void myfunction(int var1, std::string var2, std::string var3) +{ +} + +int main() +{ + std::string stringVar = "myString"; + int intVar = 0; + myfunction(intVar, stringVar, "stringVar"); + myfunction(intVar); +} \ No newline at end of file diff --git a/Extension/test/scenarios/MultiRootProjects/assets/project_B/references.cpp b/Extension/test/scenarios/MultiRootProjects/assets/project_B/references.cpp new file mode 100644 index 0000000000..475dd14749 --- /dev/null +++ b/Extension/test/scenarios/MultiRootProjects/assets/project_B/references.cpp @@ -0,0 +1,54 @@ +namespace foo { + namespace bar { + namespace baz { + int qux = 42; + } + } +} + +namespace foo::bar::baz +{ +} + +#include "references.h" + +using namespace nsReferences; + +int var1; // file scope extern +int func1(); // declaration +int func1(float var1) // local param +{ + { + double var1 = 0; // new local scope + return var1; + } + return var1 + func1(); +} + +int func1() // overload. Returns confirmed and non-confirmed references. +{ + if (var1 == 0) + return func1(0); +} + +void func2() +{ + funcInHeader1(); +} + +void func3() +{ + // func1 comment reference func1 (source file) + const char *s = "func1"; // string reference +#if 0 + func1(0); // inactive reference +#endif + cannotConfirmReference1; + { + int cannotConfirmReference1; + } +} + +const char* myLibStr = "MyLibStr"; // References in the IDL +#include "testIdl.idl" +void MyTypeLibrary() { return ; } // Not an IDL reference diff --git a/Extension/test/scenarios/MultiRootProjects/assets/project_B/references.h b/Extension/test/scenarios/MultiRootProjects/assets/project_B/references.h new file mode 100644 index 0000000000..67ebada6dc --- /dev/null +++ b/Extension/test/scenarios/MultiRootProjects/assets/project_B/references.h @@ -0,0 +1,13 @@ +namespace nsReferences +{ + void funcInHeader1(); // referenced in source files references.cpp and main.cpp + + void funcInHeader2() + { + funcInHeader1(); + } + + void funcInHeader3(); + + // func1 comment reference (header file) +} diff --git a/Extension/test/scenarios/MultiRootProjects/assets/project_B/semantic_colorization.cpp b/Extension/test/scenarios/MultiRootProjects/assets/project_B/semantic_colorization.cpp new file mode 100644 index 0000000000..ae1d6088c6 --- /dev/null +++ b/Extension/test/scenarios/MultiRootProjects/assets/project_B/semantic_colorization.cpp @@ -0,0 +1,344 @@ + +// The following file exercises all semantic tokens supported by the C/C++ Extension. +// +// To test, toggle the setting "C_Cpp.enhancedColorization" between "Enabled" and "Disabled". +// All tokens referred to as being "colored semantically" below, should be colored differently if enabled. +// +// Some language features (ref classes, value classes, etc.) require C++/CLI support to be enabled. +// Enable C++/CLI by configuring the C/C++ Extension to use "cl.exe" as the compiler (so, on WIndows), +// and set "compilerArgs" to: ["/clr"] +// +// Use the Dark+ theme to test. +// Since not all semantic tokens are colored by the Dark+ theme, add the following settings: +// +// "editor.tokenColorCustomizations": { +// "textMateRules": [ +// { +// "scope": "variable.other.event", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "entity.name.type.class.generic", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "variable.other.global", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "entity.name.label", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "entity.name.function.preprocessor", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "variable.other.property", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "entity.name.namespace", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "keyword.operator.new", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "entity.name.function.operator", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "entity.name.function.operator.member", +// "settings": { +// "foreground": "#FFFF00" +// } +// }, +// { +// "scope": "variable.parameter", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "entity.name.type.class.reference", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "variable.other.property.static", +// "settings": { +// "foreground": "#FFFF00" +// } +// }, +// { +// "scope": "entity.name.function.member.static", +// "settings": { +// "foreground": "#FFFF00" +// } +// }, +// { +// "scope": "entity.name.type", +// "settings": { +// "foreground": "#00FF00" +// } +// }, +// { +// "scope": "entity.name.operator.custom-literal.number", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "entity.name.operator.custom-literal.string", +// "settings": { +// "foreground": "#00FF00" +// } +// }, +// { +// "scope": "entity.name.operator.custom-literal", +// "settings": { +// "foreground": "#FFFF00" +// } +// }, +// { +// "scope": "entity.name.type.class.value", +// "settings": { +// "foreground": "#FFFF00" +// } +// }, +// { +// "scope": "variable.other.property.cli", +// "settings": { +// "foreground": "#FFFF00" +// } +// } +// ] +// } + + +// Class Template - entity.name.type.class.templated +template +class template_class // "template_class" colored syntactically +{ +}; + +template_class instance; // "template_class" colored semantically + +// Enumerator - variable.other.enummember +enum enum_type { + enum_member = 0 // "enum_member" colored syntactically +}; + +enum_type enum_instance = enum_type::enum_member; // "enum_member" colored semantically + +// Event (C++/CLI) - variable.other.event +// This requiress CLR support. i.e. Use cl.exe and: "compilerArgs": ["/clr"] +delegate void event_delegate(); +ref class A +{ + event event_delegate^ event_instance; // "event_instance" colored semantically +}; + +// Function - entity.name.function +void function() { } // "function" colored synatically +void function2() +{ + function(); // "function" colored synatically + void(*function_pointer)() = &function; // "function" color semantically +} + +// Function Template - entity.name.function.templated +template +void template_function() +{ + template_function(); + void(*function_pointer)() = &function; // "function" color semantically +} + +// Generic Type (C++/CLI) - entity.name.type.class.generic +// This requiress CLR support. i.e. Use cl.exe and: "compilerArgs": ["/clr"] +// KNOWN BUG: https://developercommunity.visualstudio.com/content/problem/565052/color-setting-for-c-user-types-generic-types-does.html +generic +ref class generic_class +{ +}; + +void generic_class_test() +{ + generic_class generic_class_instance; // "generic_class_instance" colored semantically +} + +// Global Variable - variable.other.global +int global_instance; // "global_instance" colored semantically + +// Label - entity.name.label +void label_test() +{ + goto Label1; // "Label1" colored semantically +Label1: // "Label1" colored syntactically +} + +// Local Variable - variable.other.local +void local_variable_test() +{ + int local_instance; // "local_instance" colored semantically +} + +// Macro - entity.name.function.preprocessor +#define MACRO(a, b) // "local_instance" colored syntactically +MACRO(a, b) // "local_instance" colored semantically + +// Member Field - variable.other.property +class member_field_test +{ + int member_instance; // "member_instance" colored semantically +}; + +// Member Function - entity.name.function.member +class C +{ +public: + void member_function() { } // "member_function" colored syntactically +}; + +void member_function_test() +{ + void(C::*member_function_ptr)() = &C::member_function; // "member_function" colored semantically +}; + +// Namespace - entity.name.namespace +namespace my_namespace { +class A +{ +}; +} + +my_namespace::A a; // "my_namesapce" color semantically + // "my_namespace" will also be colored synatically as a "entity.name.scope-resolution.cpp". + // Use a distinct color for entity.name.namespace to see the difference + + +// New / Delete - keyword.operator.new +struct operator_new_test_class +{ + void* operator new(size_t sz); // "operator new" is colored semantically +}; + +// Operator Overload Function - entity.name.function.operator +class OOF { }; +OOF& operator+=(OOF& b1, OOF& b2) // "operator+=" is colored semantically +{ + b1 += b2; // "+=" is colored semantically + return b1; +}; + +// Operator Overload Member - entity.name.function.operator.member +class OOM { + OOM& operator+=(OOM& b) // "operator+=" is colored semantically + { + *this += b; // "+=" is colored semantically + return *this; + }; +}; + +// Parameter - variable.parameter +void param_test(int param1) +{ + int i = param1; // "param1" is colored semantically here, where used. +} + +// Property (C++/CLI) - variable.other.property.cli +ref class ref_class_with_property { +public: + property int prop; // "prop" is colored semantically +}; +void property_test(ref_class_with_property^ obj) +{ + obj->prop = 111; // "prop" is colored semantically +} + +// Reference Type (C++/CLI) - entity.name.type.class.reference +ref class ref_class // "ref_class" is colored semantically +{ +}; +void ref_test() +{ + ref_class a; // "ref_class" is colored semantically +} + +// Static Member Field - variable.other.property.static +struct static_member_test +{ + static int static_member_instance; // "static_member_instance" is colored semantically + void foo() + { + static_member_instance = 2; // "static_member_instance" is colored semantically + } +}; + +// Static Member Function - entity.name.function.member.static +struct static_member_test +{ + static void foo() // "static_member_instance" is colored semantically + { + foo(); // "static_member_instance" is colored semantically + } +}; + +// Type - entity.name.type +class my_class +{ +}; +void my_class_test() +{ + my_class c; // "my_class" is colored semantically here +} + +// User-Defined Literal - Number - entity.name.operator.custom-literal.number +unsigned long long operator""_numeric(unsigned long long i) // "operator""_numeric" is colored semantically +{ + return 12345_numeric; // "12345_numeric" is colored semantically +} + +// User-Defined Literal - String - entity.name.operator.custom-literal.string +const char* operator""_str(const char* arr, size_t size) // "operator""_str" is colored semantically +{ + "ABC"_str; // ""ABC"_str" is colored semantically +} + +// User-Defined Literal - Raw - entity.name.operator.custom-literal +void operator"" _custom(const char* i) // "operator"" _custom" is colored semantically +{ + 0xABC_custom; // "0xABC_custom" is colored semantically +} + + +// Value Type (C++/CLI) - entity.name.type.class.value +value class value_class // "value_class" is colored semantically +{ +}; +void value_test() +{ + value_class a; // "value_class" is colored semantically +} diff --git a/Extension/test/scenarios/MultiRootProjects/assets/project_B/testIdl.idl b/Extension/test/scenarios/MultiRootProjects/assets/project_B/testIdl.idl new file mode 100644 index 0000000000..7c81bf9b2e --- /dev/null +++ b/Extension/test/scenarios/MultiRootProjects/assets/project_B/testIdl.idl @@ -0,0 +1,12 @@ + +library MyTypeLibrary +{ + [ + uuid(5B98C2C0-CD7B-11d0-92DF-00A0C9138C45), + helpstring(myLibStr) + ] + coclass MyPackage + { + [default] interface IMyPackage; + }; +}; diff --git a/Extension/test/scenarios/MultiRootProjects/assets/project_C/documentSymbols/levelOneFolder/levelOneFile.cpp b/Extension/test/scenarios/MultiRootProjects/assets/project_C/documentSymbols/levelOneFolder/levelOneFile.cpp new file mode 100644 index 0000000000..f25a2a44cf --- /dev/null +++ b/Extension/test/scenarios/MultiRootProjects/assets/project_C/documentSymbols/levelOneFolder/levelOneFile.cpp @@ -0,0 +1,26 @@ +#include "levelOneFile.h" + +namespace test +{ + namespace extra + { + helper::helper(/* args */) + { + my_val_help = 2; + } + + int helper::getHelp() + { + return my_val_help; + } + } + document_symbol_tests::document_symbol_tests(/* args */) + { + val = 10 * h.getHelp(); + } +} + +rootClass::rootClass() +{ + rootVal = 10; +} \ No newline at end of file diff --git a/Extension/test/scenarios/MultiRootProjects/assets/project_C/documentSymbols/levelOneFolder/levelOneFile.h b/Extension/test/scenarios/MultiRootProjects/assets/project_C/documentSymbols/levelOneFolder/levelOneFile.h new file mode 100644 index 0000000000..52b8a35cab --- /dev/null +++ b/Extension/test/scenarios/MultiRootProjects/assets/project_C/documentSymbols/levelOneFolder/levelOneFile.h @@ -0,0 +1,32 @@ +namespace test +{ + namespace extra + { + class helper + { + private: + int my_val_help; + public: + helper(/* args */); + int getHelp(); + }; + } + + class document_symbol_tests + { + private: + int val; + extra::helper h; + public: + document_symbol_tests(/* args */); + ~document_symbol_tests(); + }; +} + +class rootClass +{ + private: + int rootVal; + public: + rootClass(); +}; \ No newline at end of file diff --git a/Extension/test/scenarios/MultiRootProjects/assets/project_C/documentSymbols/levelOneFolder/levelTwoFolder/levelTwoFile.cpp b/Extension/test/scenarios/MultiRootProjects/assets/project_C/documentSymbols/levelOneFolder/levelTwoFolder/levelTwoFile.cpp new file mode 100644 index 0000000000..f96ef19895 --- /dev/null +++ b/Extension/test/scenarios/MultiRootProjects/assets/project_C/documentSymbols/levelOneFolder/levelTwoFolder/levelTwoFile.cpp @@ -0,0 +1,22 @@ +#include "levelTwoFile.h" + +namespace foo { + namespace bar { + namespace baz { + int qux = 42; + } + } +} + +namespace foo::bar::baz +{ + namespace foo3 + { + class c {}; + } +} + +int main() +{ + return 0; +} \ No newline at end of file diff --git a/Extension/test/scenarios/MultiRootProjects/assets/project_C/documentSymbols/levelOneFolder/levelTwoFolder/levelTwoFile.h b/Extension/test/scenarios/MultiRootProjects/assets/project_C/documentSymbols/levelOneFolder/levelTwoFolder/levelTwoFile.h new file mode 100644 index 0000000000..5242cdf236 --- /dev/null +++ b/Extension/test/scenarios/MultiRootProjects/assets/project_C/documentSymbols/levelOneFolder/levelTwoFolder/levelTwoFile.h @@ -0,0 +1,29 @@ +namespace NS +{ + class F + { + void f(); + void g(); + void l(); + }; +} + +void h() +{ +} + +namespace NS +{ + void F::f() + { + } + void F::g() + { + } +} + +using namespace NS; + +void F::l() +{ +} diff --git a/Extension/test/scenarios/MultiRootProjects/assets/project_C/main.cpp b/Extension/test/scenarios/MultiRootProjects/assets/project_C/main.cpp new file mode 100644 index 0000000000..858b4d56b5 --- /dev/null +++ b/Extension/test/scenarios/MultiRootProjects/assets/project_C/main.cpp @@ -0,0 +1,6 @@ +#include "references.h" + +int main() +{ + nsReferences::funcInHeader1(); +} \ No newline at end of file diff --git a/Extension/test/scenarios/MultiRootProjects/assets/project_C/quickInfo.cpp b/Extension/test/scenarios/MultiRootProjects/assets/project_C/quickInfo.cpp new file mode 100644 index 0000000000..44974d5eef --- /dev/null +++ b/Extension/test/scenarios/MultiRootProjects/assets/project_C/quickInfo.cpp @@ -0,0 +1,15 @@ + +#include + +// comment for myfunction +void myfunction(int var1, std::string var2, std::string var3) +{ +} + +int main() +{ + std::string stringVar = "myString"; + int intVar = 0; + myfunction(intVar, stringVar, "stringVar"); + myfunction(intVar); +} \ No newline at end of file diff --git a/Extension/test/scenarios/MultiRootProjects/assets/project_C/references.cpp b/Extension/test/scenarios/MultiRootProjects/assets/project_C/references.cpp new file mode 100644 index 0000000000..475dd14749 --- /dev/null +++ b/Extension/test/scenarios/MultiRootProjects/assets/project_C/references.cpp @@ -0,0 +1,54 @@ +namespace foo { + namespace bar { + namespace baz { + int qux = 42; + } + } +} + +namespace foo::bar::baz +{ +} + +#include "references.h" + +using namespace nsReferences; + +int var1; // file scope extern +int func1(); // declaration +int func1(float var1) // local param +{ + { + double var1 = 0; // new local scope + return var1; + } + return var1 + func1(); +} + +int func1() // overload. Returns confirmed and non-confirmed references. +{ + if (var1 == 0) + return func1(0); +} + +void func2() +{ + funcInHeader1(); +} + +void func3() +{ + // func1 comment reference func1 (source file) + const char *s = "func1"; // string reference +#if 0 + func1(0); // inactive reference +#endif + cannotConfirmReference1; + { + int cannotConfirmReference1; + } +} + +const char* myLibStr = "MyLibStr"; // References in the IDL +#include "testIdl.idl" +void MyTypeLibrary() { return ; } // Not an IDL reference diff --git a/Extension/test/scenarios/MultiRootProjects/assets/project_C/references.h b/Extension/test/scenarios/MultiRootProjects/assets/project_C/references.h new file mode 100644 index 0000000000..67ebada6dc --- /dev/null +++ b/Extension/test/scenarios/MultiRootProjects/assets/project_C/references.h @@ -0,0 +1,13 @@ +namespace nsReferences +{ + void funcInHeader1(); // referenced in source files references.cpp and main.cpp + + void funcInHeader2() + { + funcInHeader1(); + } + + void funcInHeader3(); + + // func1 comment reference (header file) +} diff --git a/Extension/test/scenarios/MultiRootProjects/assets/project_C/semantic_colorization.cpp b/Extension/test/scenarios/MultiRootProjects/assets/project_C/semantic_colorization.cpp new file mode 100644 index 0000000000..ae1d6088c6 --- /dev/null +++ b/Extension/test/scenarios/MultiRootProjects/assets/project_C/semantic_colorization.cpp @@ -0,0 +1,344 @@ + +// The following file exercises all semantic tokens supported by the C/C++ Extension. +// +// To test, toggle the setting "C_Cpp.enhancedColorization" between "Enabled" and "Disabled". +// All tokens referred to as being "colored semantically" below, should be colored differently if enabled. +// +// Some language features (ref classes, value classes, etc.) require C++/CLI support to be enabled. +// Enable C++/CLI by configuring the C/C++ Extension to use "cl.exe" as the compiler (so, on WIndows), +// and set "compilerArgs" to: ["/clr"] +// +// Use the Dark+ theme to test. +// Since not all semantic tokens are colored by the Dark+ theme, add the following settings: +// +// "editor.tokenColorCustomizations": { +// "textMateRules": [ +// { +// "scope": "variable.other.event", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "entity.name.type.class.generic", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "variable.other.global", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "entity.name.label", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "entity.name.function.preprocessor", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "variable.other.property", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "entity.name.namespace", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "keyword.operator.new", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "entity.name.function.operator", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "entity.name.function.operator.member", +// "settings": { +// "foreground": "#FFFF00" +// } +// }, +// { +// "scope": "variable.parameter", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "entity.name.type.class.reference", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "variable.other.property.static", +// "settings": { +// "foreground": "#FFFF00" +// } +// }, +// { +// "scope": "entity.name.function.member.static", +// "settings": { +// "foreground": "#FFFF00" +// } +// }, +// { +// "scope": "entity.name.type", +// "settings": { +// "foreground": "#00FF00" +// } +// }, +// { +// "scope": "entity.name.operator.custom-literal.number", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "entity.name.operator.custom-literal.string", +// "settings": { +// "foreground": "#00FF00" +// } +// }, +// { +// "scope": "entity.name.operator.custom-literal", +// "settings": { +// "foreground": "#FFFF00" +// } +// }, +// { +// "scope": "entity.name.type.class.value", +// "settings": { +// "foreground": "#FFFF00" +// } +// }, +// { +// "scope": "variable.other.property.cli", +// "settings": { +// "foreground": "#FFFF00" +// } +// } +// ] +// } + + +// Class Template - entity.name.type.class.templated +template +class template_class // "template_class" colored syntactically +{ +}; + +template_class instance; // "template_class" colored semantically + +// Enumerator - variable.other.enummember +enum enum_type { + enum_member = 0 // "enum_member" colored syntactically +}; + +enum_type enum_instance = enum_type::enum_member; // "enum_member" colored semantically + +// Event (C++/CLI) - variable.other.event +// This requiress CLR support. i.e. Use cl.exe and: "compilerArgs": ["/clr"] +delegate void event_delegate(); +ref class A +{ + event event_delegate^ event_instance; // "event_instance" colored semantically +}; + +// Function - entity.name.function +void function() { } // "function" colored synatically +void function2() +{ + function(); // "function" colored synatically + void(*function_pointer)() = &function; // "function" color semantically +} + +// Function Template - entity.name.function.templated +template +void template_function() +{ + template_function(); + void(*function_pointer)() = &function; // "function" color semantically +} + +// Generic Type (C++/CLI) - entity.name.type.class.generic +// This requiress CLR support. i.e. Use cl.exe and: "compilerArgs": ["/clr"] +// KNOWN BUG: https://developercommunity.visualstudio.com/content/problem/565052/color-setting-for-c-user-types-generic-types-does.html +generic +ref class generic_class +{ +}; + +void generic_class_test() +{ + generic_class generic_class_instance; // "generic_class_instance" colored semantically +} + +// Global Variable - variable.other.global +int global_instance; // "global_instance" colored semantically + +// Label - entity.name.label +void label_test() +{ + goto Label1; // "Label1" colored semantically +Label1: // "Label1" colored syntactically +} + +// Local Variable - variable.other.local +void local_variable_test() +{ + int local_instance; // "local_instance" colored semantically +} + +// Macro - entity.name.function.preprocessor +#define MACRO(a, b) // "local_instance" colored syntactically +MACRO(a, b) // "local_instance" colored semantically + +// Member Field - variable.other.property +class member_field_test +{ + int member_instance; // "member_instance" colored semantically +}; + +// Member Function - entity.name.function.member +class C +{ +public: + void member_function() { } // "member_function" colored syntactically +}; + +void member_function_test() +{ + void(C::*member_function_ptr)() = &C::member_function; // "member_function" colored semantically +}; + +// Namespace - entity.name.namespace +namespace my_namespace { +class A +{ +}; +} + +my_namespace::A a; // "my_namesapce" color semantically + // "my_namespace" will also be colored synatically as a "entity.name.scope-resolution.cpp". + // Use a distinct color for entity.name.namespace to see the difference + + +// New / Delete - keyword.operator.new +struct operator_new_test_class +{ + void* operator new(size_t sz); // "operator new" is colored semantically +}; + +// Operator Overload Function - entity.name.function.operator +class OOF { }; +OOF& operator+=(OOF& b1, OOF& b2) // "operator+=" is colored semantically +{ + b1 += b2; // "+=" is colored semantically + return b1; +}; + +// Operator Overload Member - entity.name.function.operator.member +class OOM { + OOM& operator+=(OOM& b) // "operator+=" is colored semantically + { + *this += b; // "+=" is colored semantically + return *this; + }; +}; + +// Parameter - variable.parameter +void param_test(int param1) +{ + int i = param1; // "param1" is colored semantically here, where used. +} + +// Property (C++/CLI) - variable.other.property.cli +ref class ref_class_with_property { +public: + property int prop; // "prop" is colored semantically +}; +void property_test(ref_class_with_property^ obj) +{ + obj->prop = 111; // "prop" is colored semantically +} + +// Reference Type (C++/CLI) - entity.name.type.class.reference +ref class ref_class // "ref_class" is colored semantically +{ +}; +void ref_test() +{ + ref_class a; // "ref_class" is colored semantically +} + +// Static Member Field - variable.other.property.static +struct static_member_test +{ + static int static_member_instance; // "static_member_instance" is colored semantically + void foo() + { + static_member_instance = 2; // "static_member_instance" is colored semantically + } +}; + +// Static Member Function - entity.name.function.member.static +struct static_member_test +{ + static void foo() // "static_member_instance" is colored semantically + { + foo(); // "static_member_instance" is colored semantically + } +}; + +// Type - entity.name.type +class my_class +{ +}; +void my_class_test() +{ + my_class c; // "my_class" is colored semantically here +} + +// User-Defined Literal - Number - entity.name.operator.custom-literal.number +unsigned long long operator""_numeric(unsigned long long i) // "operator""_numeric" is colored semantically +{ + return 12345_numeric; // "12345_numeric" is colored semantically +} + +// User-Defined Literal - String - entity.name.operator.custom-literal.string +const char* operator""_str(const char* arr, size_t size) // "operator""_str" is colored semantically +{ + "ABC"_str; // ""ABC"_str" is colored semantically +} + +// User-Defined Literal - Raw - entity.name.operator.custom-literal +void operator"" _custom(const char* i) // "operator"" _custom" is colored semantically +{ + 0xABC_custom; // "0xABC_custom" is colored semantically +} + + +// Value Type (C++/CLI) - entity.name.type.class.value +value class value_class // "value_class" is colored semantically +{ +}; +void value_test() +{ + value_class a; // "value_class" is colored semantically +} diff --git a/Extension/test/scenarios/MultiRootProjects/assets/project_C/testIdl.idl b/Extension/test/scenarios/MultiRootProjects/assets/project_C/testIdl.idl new file mode 100644 index 0000000000..7c81bf9b2e --- /dev/null +++ b/Extension/test/scenarios/MultiRootProjects/assets/project_C/testIdl.idl @@ -0,0 +1,12 @@ + +library MyTypeLibrary +{ + [ + uuid(5B98C2C0-CD7B-11d0-92DF-00A0C9138C45), + helpstring(myLibStr) + ] + coclass MyPackage + { + [default] interface IMyPackage; + }; +}; diff --git a/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/.vscode/c_cpp_properties.json b/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/.vscode/c_cpp_properties.json new file mode 100644 index 0000000000..1ca3502d4b --- /dev/null +++ b/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/.vscode/c_cpp_properties.json @@ -0,0 +1,8 @@ +{ + "configurations": [ + { + "name": "Win32" + } + ], + "version": 4 +} \ No newline at end of file diff --git a/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/code_folding.cpp b/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/code_folding.cpp new file mode 100644 index 0000000000..6c47080e26 --- /dev/null +++ b/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/code_folding.cpp @@ -0,0 +1,56 @@ +// Comment block +// should +// get +// folded + +/* + Comment block + should + get + folded +*/ + +#include "notfound1.h" +#include "notfound2.h" +#include "notfound3.h" + +#define TEST + +#ifdef TEST +void foo() +{ +} +#endif + +#ifndef TEST +void foo() +{ +} +#endif + +void bar() +{ +#ifdef TEST + foo(); +#else + foo(); +#endif +} + +class A +{ +}; + +class B +{ + int i; +#ifdef TEST + void foo2() + { + } +#else + void foo2(int i) + { + } +#endif +}; diff --git a/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/documentSymbols/levelOneFolder/levelOneFile.cpp b/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/documentSymbols/levelOneFolder/levelOneFile.cpp new file mode 100644 index 0000000000..0f77c8a644 --- /dev/null +++ b/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/documentSymbols/levelOneFolder/levelOneFile.cpp @@ -0,0 +1,26 @@ +#include "levelOneFile.h" + +namespace test +{ + namespace extra + { + helper::helper(/* args */) + { + my_val_help = 2; + } + + int helper::getHelp() + { + return my_val_help; + } + } + document_symbol_tests::document_symbol_tests(/* args */) + { + val = 10 * h.getHelp(); + } +} + +rootClass::rootClass() +{ + rootVal = 10; +} \ No newline at end of file diff --git a/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/documentSymbols/levelOneFolder/levelOneFile.h b/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/documentSymbols/levelOneFolder/levelOneFile.h new file mode 100644 index 0000000000..ea826c6947 --- /dev/null +++ b/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/documentSymbols/levelOneFolder/levelOneFile.h @@ -0,0 +1,32 @@ +namespace test +{ + namespace extra + { + class helper + { + private: + int my_val_help; + public: + helper(/* args */); + int getHelp(); + }; + } + + class document_symbol_tests + { + private: + int val; + extra::helper h; + public: + document_symbol_tests(/* args */); + ~document_symbol_tests(); + }; +} + +class rootClass +{ + private: + int rootVal; + public: + rootClass(); +}; \ No newline at end of file diff --git a/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/documentSymbols/levelOneFolder/levelTwoFolder/levelTwoFile.cpp b/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/documentSymbols/levelOneFolder/levelTwoFolder/levelTwoFile.cpp new file mode 100644 index 0000000000..ecc54b2d9f --- /dev/null +++ b/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/documentSymbols/levelOneFolder/levelTwoFolder/levelTwoFile.cpp @@ -0,0 +1,22 @@ +#include "levelTwoFile.h" + +namespace foo { + namespace bar { + namespace baz { + int qux = 42; + } + } +} + +namespace foo::bar::baz +{ + namespace foo3 + { + class c {}; + } +} + +int main() +{ + return 0; +} \ No newline at end of file diff --git a/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/documentSymbols/levelOneFolder/levelTwoFolder/levelTwoFile.h b/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/documentSymbols/levelOneFolder/levelTwoFolder/levelTwoFile.h new file mode 100644 index 0000000000..b5d022526f --- /dev/null +++ b/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/documentSymbols/levelOneFolder/levelTwoFolder/levelTwoFile.h @@ -0,0 +1,29 @@ +namespace NS +{ + class F + { + void f(); + void g(); + void l(); + }; +} + +void h() +{ +} + +namespace NS +{ + void F::f() + { + } + void F::g() + { + } +} + +using namespace NS; + +void F::l() +{ +} diff --git a/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/doxygen.cpp b/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/doxygen.cpp new file mode 100644 index 0000000000..52f227fefe --- /dev/null +++ b/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/doxygen.cpp @@ -0,0 +1,64 @@ +/// @brief Calculates area of triangle +/// @tparam T is template param +/// @param base is horizontal length +/// @param height is vertical length +/// @return Area of triangle +/// @exception This is an exception comment +/// @deprecated This is deprecated comment +/// @note this is note +/// @attention this is attention +/// @pre this is pre comment +template +T TriangleArea(T base, T height) +{ + double result; + result = base * height * 0.5; + return (T)result; +} + +/// @brief Calculates area of rectangle +/// @tparam T is template param +/// @param base is horizontal length +/// @param height is vertical length +/// @return Area of rectangle +/// @exception This is an exception comment +template +T RectangleArea(T base, T height) +{ + double result; + result = base * height; + return (T)result; +} + +/// @brief function with no parameters and no returns +void func_zero() +{} + +/// @brief function with one parameter and no returns +/// @param myParam is horizontal length +void func_one(int myParam) +{} + +/// @brief function with two parameter and no returns +/// @param value_one is first parameter +/// @param value_two is second parameter +void func_two(int value_one, double value_two) +{} + +/// @brief function with two parameters +/// @param value_one is first parameter +/// @param value_two is second parameter +/// @return 1 if value_one is greater than 0, otherwise 3. +int func_three(int value_one, double value_two) +{ + return (value_one > 0) ? 1 : 3; +} + +int main() +{ + int area = TriangleArea(1, 2); + + func_three(8, 7); + + return 0; +} \ No newline at end of file diff --git a/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/doxygen_generation.cpp b/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/doxygen_generation.cpp new file mode 100644 index 0000000000..258d2866ea --- /dev/null +++ b/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/doxygen_generation.cpp @@ -0,0 +1,24 @@ + + +int add_numbers(int a, int b, int c) +{ + return a + b + c; +}; + +template +T TriangleArea(T base, T height) +{ + double result; + result = base * height * 0.5; + return (T)result; +} + +void func_one() +{ + +} + +void func_two(int a) +{ + +} diff --git a/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/inlay_hints.cpp b/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/inlay_hints.cpp new file mode 100644 index 0000000000..58c1a7ba99 --- /dev/null +++ b/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/inlay_hints.cpp @@ -0,0 +1,107 @@ +int area(const int width, const int height) +{ + return width * height; +} + +void swap(int &first, int &last, bool flag) +{} + +void underscores(int ___x, int __y, int _z, int a) +{} + +template +T get(); + +void auto_type_templates() +{ + const auto x = get(); // : int *const + const auto x1 = get(); // : const int *const + const auto& x2 = get(); // : const int *const & + auto * const x3 = get(); // : const int *const + const auto x4 = get(); // : const int + auto& x5 = get(); // : const int & + decltype(auto) x6 = get(); // : const int & + decltype(auto) x7 = get(); // : const int * + decltype(auto) x8 = get(); // : int * + decltype(auto) x9 = get(); // : const int * + + // simple auto usage + auto index = 1; // : int + for (auto i = 0; i < 8; i++) // : int + {} +} + +void params_with_underscore() +{ + underscores(1, 2, 3, 4); // hide or show leading underscores +} + +void param_names() +{ + // Displays all param name hints + int a = area(5, 3); + int a = area(5, + 3); + int a = area( + 5, + 3); + + // Displays param name for "height" only when suppressWhenArgumentContainsName is true + int width = 5; + a = area(width, 3); + a = area(4 /*width*/, 3); + a = area( 4 /*width*/, 3); + a = area(4 /*width*/, + 3); + a = area( + 4 /*width*/, + 3); + + // Displays param name for "width" only when suppressWhenArgumentContainsName is true + int height = 3; + a = area(5, height); + a = area(5, 8 /*height*/); + a = area( 5, 8 /*height*/); + a = area(5, + 8 /*height*/); + a = area( + 5, + 8 /*height*/); + + // No hints only when suppressWhenArgumentContainsName is true + a = area(width, height); + a = area( width, height); + a = area(width, + height); + a = area( + width, + height); +} + +void param_and_reference_operator() +{ + int x = 1; + int y = 2; + bool ff = true; + + // Displays "&" operator and/or param name hints + swap(x, y, ff); + swap(x /*first*/, y, ff); + swap(x /*first*/, + y, + ff); + swap( + x /*first*/, + y, + ff); + + swap(x, y, ff); + swap(x, y /*last*/, ff); + swap(x, + y /*last*/, + ff); + swap( + x, + y /*last*/, + ff); +} diff --git a/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/main.cpp b/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/main.cpp new file mode 100644 index 0000000000..7ff21ab818 --- /dev/null +++ b/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/main.cpp @@ -0,0 +1,6 @@ +#include "references.h" + +int main() +{ + nsReferences::funcInHeader1(); +} \ No newline at end of file diff --git a/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/quickInfo.cpp b/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/quickInfo.cpp new file mode 100644 index 0000000000..db844e8e56 --- /dev/null +++ b/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/quickInfo.cpp @@ -0,0 +1,38 @@ + +#include + +// comment for myfunction +void myfunction(int var1, std::string var2, std::string var3) +{ +} + +// Verifies if input is even number or not +bool isEven(int value) +{ + return value % 2 == 0; +} + +/// @brief Calculates area of rectangle +/// @tparam T is template param +/// @param base is horizontal length +/// @param height is vertical length +/// @return Area of rectangle +/// @exception This is an exception comment +/// @pre This is pre comment +template +T testDoxygen(T base, T height) +{ + double result; + result = base * height; + return (T)result; +} + +int main() +{ + std::string stringVar = "myString"; + int intVar = 0; + myfunction(intVar, stringVar, "stringVar"); + myfunction(false); + bool result = isEven(1); + testDoxygen(2, 3); +} \ No newline at end of file diff --git a/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/references.cpp b/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/references.cpp new file mode 100644 index 0000000000..bef073ac8d --- /dev/null +++ b/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/references.cpp @@ -0,0 +1,54 @@ +namespace foo { + namespace bar { + namespace baz { + int qux = 42; + } + } +} + +namespace foo::bar::baz +{ +} + +#include "references.h" + +using namespace nsReferences; + +int var1; // file scope extern +int func1(); // declaration +int func1(float var1) // local param +{ + { + double var1 = 0; // new local scope + return var1; + } + return var1 + func1(); +} + +int func1() // overload. Returns confirmed and non-confirmed references. +{ + if (var1 == 0) + return func1(0); +} + +void func2() +{ + funcInHeader1(); +} + +void func3() +{ + // func1 comment reference func1 (source file) + const char *s = "func1"; // string reference +#if 0 + func1(0); // inactive reference +#endif + cannotConfirmReference1; + { + int cannotConfirmReference1; + } +} + +const char* myLibStr = "MyLibStr"; // References in the IDL +#include "testIdl.idl" +void MyTypeLibrary() { return ; } // Not an IDL reference diff --git a/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/references.h b/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/references.h new file mode 100644 index 0000000000..147f27a94e --- /dev/null +++ b/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/references.h @@ -0,0 +1,13 @@ +namespace nsReferences +{ + void funcInHeader1(); // referenced in source files references.cpp and main.cpp + + void funcInHeader2() + { + funcInHeader1(); + } + + void funcInHeader3(); + + // func1 comment reference (header file) +} diff --git a/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/semantic_colorization.cpp b/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/semantic_colorization.cpp new file mode 100644 index 0000000000..dc0e880960 --- /dev/null +++ b/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/semantic_colorization.cpp @@ -0,0 +1,373 @@ + +// The following file exercises all semantic tokens supported by the C/C++ Extension. +// +// To test, toggle the setting "C_Cpp.enhancedColorization" between "Enabled" and "Disabled". +// All tokens referred to as being "colored semantically" below, should be colored differently if enabled. +// +// Some language features (ref classes, value classes, etc.) require C++/CLI support to be enabled. +// Enable C++/CLI by configuring the C/C++ Extension to use "cl.exe" as the compiler (so, on WIndows), +// and set "compilerArgs" to: ["/clr"] +// +// Use the Dark+ theme to test. +// Since not all semantic tokens are colored by the Dark+ theme, add the following settings: +// +// "editor.semanticTokenColorCustomizations": { +// "enabled": true, +// "rules": { +// "event": "#FF0000", +// "genericType": "#ff0000", +// "variable.global": "#ff0000", +// "label": "#ff0000", +// "macro": "#ff0000", +// "property": "#ff0000", +// "namespace": "#ff0000", +// "newOperator": "#ff0000", +// "operatorOverload": "#ff0000", +// "memberOperatorOverload": "#ffff00", +// "parameter": "#ff0000", +// "referenceType": "#ff0000", +// "property.static": "#ffff00", +// "member.static": "#ffff00", +// "type": "#00ff00", +// "numberLiteral": "#ff0000", +// "stringLiteral": "#00ff00", +// "customLiteral": "#ffff00", +// "valueType": "#ffff00", +// "cliProperty": "#ffff00" +// } +// } +// +// To test backwards compatibility, also test using legacy TextMate scopes: +// +// "editor.tokenColorCustomizations": { +// "textMateRules": [ +// { +// "scope": "variable.other.event", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "entity.name.type.class.generic", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "variable.other.global", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "entity.name.label", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "entity.name.function.preprocessor", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "variable.other.property", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "entity.name.namespace", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "keyword.operator.new", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "entity.name.function.operator", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "entity.name.function.operator.member", +// "settings": { +// "foreground": "#FFFF00" +// } +// }, +// { +// "scope": "variable.parameter", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "entity.name.type.class.reference", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "variable.other.property.static", +// "settings": { +// "foreground": "#FFFF00" +// } +// }, +// { +// "scope": "entity.name.function.member.static", +// "settings": { +// "foreground": "#FFFF00" +// } +// }, +// { +// "scope": "entity.name.type", +// "settings": { +// "foreground": "#00FF00" +// } +// }, +// { +// "scope": "entity.name.operator.custom-literal.number", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "entity.name.operator.custom-literal.string", +// "settings": { +// "foreground": "#00FF00" +// } +// }, +// { +// "scope": "entity.name.operator.custom-literal", +// "settings": { +// "foreground": "#FFFF00" +// } +// }, +// { +// "scope": "entity.name.type.class.value", +// "settings": { +// "foreground": "#FFFF00" +// } +// }, +// { +// "scope": "variable.other.property.cli", +// "settings": { +// "foreground": "#FFFF00" +// } +// } +// ] +// } +// +// Documentation on these scopes can be found here: https://code.visualstudio.com/docs/cpp/colorization-cpp + +// Class Template - entity.name.type.class.templated +template +class template_class // "template_class" colored syntactically +{ +}; + +template_class instance; // "template_class" colored semantically + +// Enumerator - variable.other.enummember +enum enum_type { + enum_member = 0 // "enum_member" colored syntactically +}; + +enum_type enum_instance = enum_type::enum_member; // "enum_member" colored semantically + +// Event (C++/CLI) - variable.other.event +// This requiress CLR support. i.e. Use cl.exe and: "compilerArgs": ["/clr"] +delegate void event_delegate(); +ref class A +{ + event event_delegate^ event_instance; // "event_instance" colored semantically +}; + +// Function - entity.name.function +void function() { } // "function" colored synatically +void function2() +{ + function(); // "function" colored synatically + void(*function_pointer)() = &function; // "function" color semantically +} + +// Function Template - entity.name.function.templated +template +void template_function() +{ + template_function(); + void(*function_pointer)() = &function; // "function" color semantically +} + +// Generic Type (C++/CLI) - entity.name.type.class.generic +// This requiress CLR support. i.e. Use cl.exe and: "compilerArgs": ["/clr"] +// KNOWN BUG: https://developercommunity.visualstudio.com/content/problem/565052/color-setting-for-c-user-types-generic-types-does.html +generic +ref class generic_class +{ +}; + +void generic_class_test() +{ + generic_class generic_class_instance; // "generic_class_instance" colored semantically +} + +// Global Variable - variable.other.global +int global_instance; // "global_instance" colored semantically + +// Label - entity.name.label +void label_test() +{ + goto Label1; // "Label1" colored semantically +Label1: // "Label1" colored syntactically +} + +// Local Variable - variable.other.local +void local_variable_test() +{ + int local_instance; // "local_instance" colored semantically +} + +// Macro - entity.name.function.preprocessor +#define MACRO(a, b) // "local_instance" colored syntactically +MACRO(a, b) // "local_instance" colored semantically + +// Member Field - variable.other.property +class member_field_test +{ + int member_instance; // "member_instance" colored semantically +}; + +// Member Function - entity.name.function.member +class C +{ +public: + void member_function() { } // "member_function" colored syntactically +}; + +void member_function_test() +{ + void(C::*member_function_ptr)() = &C::member_function; // "member_function" colored semantically +}; + +// Namespace - entity.name.namespace +namespace my_namespace { +class A +{ +}; +} + +my_namespace::A a; // "my_namesapce" color semantically + // "my_namespace" will also be colored synatically as a "entity.name.scope-resolution.cpp". + // Use a distinct color for entity.name.namespace to see the difference + + +// New / Delete - keyword.operator.new +struct operator_new_test_class +{ + void* operator new(size_t sz); // "operator new" is colored semantically +}; + +// Operator Overload Function - entity.name.function.operator +class OOF { }; +OOF& operator+=(OOF& b1, OOF& b2) // "operator+=" is colored semantically +{ + b1 += b2; // "+=" is colored semantically + return b1; +}; + +// Operator Overload Member - entity.name.function.operator.member +class OOM { + OOM& operator+=(OOM& b) // "operator+=" is colored semantically + { + *this += b; // "+=" is colored semantically + return *this; + }; +}; + +// Parameter - variable.parameter +void param_test(int param1) +{ + int i = param1; // "param1" is colored semantically here, where used. +} + +// Property (C++/CLI) - variable.other.property.cli +ref class ref_class_with_property { +public: + property int prop; // "prop" is colored semantically +}; +void property_test(ref_class_with_property^ obj) +{ + obj->prop = 111; // "prop" is colored semantically +} + +// Reference Type (C++/CLI) - entity.name.type.class.reference +ref class ref_class // "ref_class" is colored semantically +{ +}; +void ref_test() +{ + ref_class a; // "ref_class" is colored semantically +} + +// Static Member Field - variable.other.property.static +struct static_member_test +{ + static int static_member_instance; // "static_member_instance" is colored semantically + void foo() + { + static_member_instance = 2; // "static_member_instance" is colored semantically + } +}; + +// Static Member Function - entity.name.function.member.static +struct static_member_test +{ + static void foo() // "static_member_instance" is colored semantically + { + foo(); // "static_member_instance" is colored semantically + } +}; + +// Type - entity.name.type +class my_class +{ +}; +void my_class_test() +{ + my_class c; // "my_class" is colored semantically here +} + +// User-Defined Literal - Number - entity.name.operator.custom-literal.number +unsigned long long operator""_numeric(unsigned long long i) // "operator""_numeric" is colored semantically +{ + return 12345_numeric; // "12345_numeric" is colored semantically +} + +// User-Defined Literal - String - entity.name.operator.custom-literal.string +const char* operator""_str(const char* arr, size_t size) // "operator""_str" is colored semantically +{ + "ABC"_str; // ""ABC"_str" is colored semantically +} + +// User-Defined Literal - Raw - entity.name.operator.custom-literal +void operator"" _custom(const char* i) // "operator"" _custom" is colored semantically +{ + 0xABC_custom; // "0xABC_custom" is colored semantically +} + + +// Value Type (C++/CLI) - entity.name.type.class.value +value class value_class // "value_class" is colored semantically +{ +}; +void value_test() +{ + value_class a; // "value_class" is colored semantically +} diff --git a/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/testIdl.idl b/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/testIdl.idl new file mode 100644 index 0000000000..f34aee0182 --- /dev/null +++ b/Extension/test/scenarios/MultirootDeadlockTest/assets/SingleRootProject/testIdl.idl @@ -0,0 +1,12 @@ + +library MyTypeLibrary +{ + [ + uuid(5B98C2C0-CD7B-11d0-92DF-00A0C9138C45), + helpstring(myLibStr) + ] + coclass MyPackage + { + [default] interface IMyPackage; + }; +}; diff --git a/Extension/test/scenarios/MultirootDeadlockTest/assets/sub1/.vscode/c_cpp_properties.json b/Extension/test/scenarios/MultirootDeadlockTest/assets/sub1/.vscode/c_cpp_properties.json new file mode 100644 index 0000000000..1ca3502d4b --- /dev/null +++ b/Extension/test/scenarios/MultirootDeadlockTest/assets/sub1/.vscode/c_cpp_properties.json @@ -0,0 +1,8 @@ +{ + "configurations": [ + { + "name": "Win32" + } + ], + "version": 4 +} \ No newline at end of file diff --git a/Extension/test/scenarios/MultirootDeadlockTest/assets/sub1/sub2/test.cpp b/Extension/test/scenarios/MultirootDeadlockTest/assets/sub1/sub2/test.cpp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Extension/test/scenarios/MultirootDeadlockTest/assets/test.code-workspace b/Extension/test/scenarios/MultirootDeadlockTest/assets/test.code-workspace new file mode 100644 index 0000000000..6ae4e7290b --- /dev/null +++ b/Extension/test/scenarios/MultirootDeadlockTest/assets/test.code-workspace @@ -0,0 +1,14 @@ +{ + "folders": [ + { + "path": "./sub1/sub2" + }, + { + "path": "./SingleRootProject" + }, + { + "path": "./sub1" + } + ], + "settings": {} +} \ No newline at end of file diff --git a/Extension/test/integrationTests/IntelliSenseFeatures/inlayhints.test.ts b/Extension/test/scenarios/MultirootDeadlockTest/tests/inlayhints.test.ts similarity index 93% rename from Extension/test/integrationTests/IntelliSenseFeatures/inlayhints.test.ts rename to Extension/test/scenarios/MultirootDeadlockTest/tests/inlayhints.test.ts index a72299629f..56f4912f10 100644 --- a/Extension/test/integrationTests/IntelliSenseFeatures/inlayhints.test.ts +++ b/Extension/test/scenarios/MultirootDeadlockTest/tests/inlayhints.test.ts @@ -2,17 +2,18 @@ * Copyright (c) Microsoft Corporation. All Rights Reserved. * See 'LICENSE' in the project root for license information. * ------------------------------------------------------------------------------------------ */ - -/* eslint-disable @typescript-eslint/triple-slash-reference */ /* eslint-disable @typescript-eslint/no-non-null-assertion */ - -/// +/* eslint-disable @typescript-eslint/no-unused-vars */ +/* eslint-disable @typescript-eslint/triple-slash-reference */ +/// import * as assert from 'assert'; +import { suite } from 'mocha'; import * as vscode from 'vscode'; import * as api from 'vscode-cpptools'; import * as apit from 'vscode-cpptools/out/testApi'; -import * as testHelpers from '../testHelpers'; +import { timeout } from '../../../../src/Utility/Async/timeout'; +import * as testHelpers from '../../../common/testHelpers'; suite("[Inlay hints test]", function(): void { // Settings @@ -48,11 +49,21 @@ suite("[Inlay hints test]", function(): void { const testHook: apit.CppToolsTestHook = cpptools.getTestHook(); disposables.push(testHook); + const getIntelliSenseStatus = new Promise((resolve) => { + disposables.push(testHook.IntelliSenseStatusChanged(result => { + result = result as apit.IntelliSenseStatus; + if (result.filename === "inlay_hints.cpp" && result.status === apit.Status.IntelliSenseReady) { + console.log(`IntelliSense for '${result.filename}' is ready`); + resolve(); + } + })); + }); + // Start language server console.log("Open file: " + fileUri.toString()); const document: vscode.TextDocument = await vscode.workspace.openTextDocument(fileUri); await vscode.window.showTextDocument(document); - + await timeout(5000, getIntelliSenseStatus); saveOriginalSettings(); await useDefaultSettings(); }); @@ -93,16 +104,18 @@ suite("[Inlay hints test]", function(): void { } test("[Inlay Hints - auto type]", async () => { + const range: vscode.Range = new vscode.Range(new vscode.Position(15, 0), new vscode.Position(31, 0)); await changeInlayHintSetting(autoDeclarationTypesEnabled, disabled); await changeInlayHintSetting(autoDeclarationTypesShowOnLeft, disabled); - - const result1 = await vscode.commands.executeCommand('vscode.executeInlayHintProvider', fileUri, range); + + // WARNING: debugging this test will block on this call: (and others like it.) + const result1 = await timeout(1000, vscode.commands.executeCommand('vscode.executeInlayHintProvider', fileUri, range) as Promise); assert.strictEqual(result1.length, 0, "Incorrect number of results."); await changeInlayHintSetting(autoDeclarationTypesEnabled, enabled); - + const result2 = await vscode.commands.executeCommand('vscode.executeInlayHintProvider', fileUri, range); assert.strictEqual(result2.length, 12, "Incorrect number of results."); const expectedKind = vscode.InlayHintKind.Type; @@ -119,7 +132,7 @@ suite("[Inlay hints test]", function(): void { assertHintValues(result2, 10, 28, 14, ": int", expectedKind); assertHintValues(result2, 11, 29, 15, ": int", expectedKind); }); - + test("[Inlay Hints - auto type, show on left]", async () => { const range: vscode.Range = new vscode.Range(new vscode.Position(15, 0), new vscode.Position(31, 0)); diff --git a/Extension/test/integrationTests/IntelliSenseFeatures/quickInfo.test.ts b/Extension/test/scenarios/MultirootDeadlockTest/tests/quickInfo.test.ts similarity index 68% rename from Extension/test/integrationTests/IntelliSenseFeatures/quickInfo.test.ts rename to Extension/test/scenarios/MultirootDeadlockTest/tests/quickInfo.test.ts index abc786ce81..f6bdbadf0c 100644 --- a/Extension/test/integrationTests/IntelliSenseFeatures/quickInfo.test.ts +++ b/Extension/test/scenarios/MultirootDeadlockTest/tests/quickInfo.test.ts @@ -7,9 +7,8 @@ import * as os from 'os'; import * as vscode from 'vscode'; import * as api from 'vscode-cpptools'; import * as apit from 'vscode-cpptools/out/testApi'; -import { ManualSignal } from '../../../src/Utility/Async/manualSignal'; -import { timeout } from '../../../src/Utility/Async/timeout'; -import * as testHelpers from '../testHelpers'; +import { timeout } from '../../../../src/Utility/Async/timeout'; +import * as testHelpers from '../../../common/testHelpers'; suite("[Quick info test]", function(): void { let cpptools: apit.CppToolsTestApi; @@ -17,26 +16,35 @@ suite("[Quick info test]", function(): void { const filePath: string = `${vscode.workspace.workspaceFolders?.[1]?.uri.fsPath}/quickInfo.cpp`; const fileUri: vscode.Uri = vscode.Uri.file(filePath); let platform: string = ""; - const getIntelliSenseStatus = new ManualSignal(); suiteSetup(async function(): Promise { await testHelpers.activateCppExtension(); - cpptools = await apit.getCppToolsTestApi(api.Version.latest) ?? assert.fail("Could not get CppToolsTestApi"); + cpptools = await apit.getCppToolsTestApi(api.Version.latest) ?? assert.fail('Could not get CppToolsTestApi'); platform = os.platform(); const testHook: apit.CppToolsTestHook = cpptools.getTestHook(); disposables.push(testHook); - testHook.IntelliSenseStatusChanged((result: apit.IntelliSenseStatus) => { - if (result.filename === "quickInfo.cpp" && result.status === apit.Status.IntelliSenseReady) { - getIntelliSenseStatus.resolve(); - } + /* + PROBLEM: waiting for the intellisense ready for the file changes the output of the Doxygen comment test + + it changes from to and the test fails + */ + const getIntelliSenseStatus = new Promise((resolve) => { + disposables.push(testHook.IntelliSenseStatusChanged(result => { + result = result as apit.IntelliSenseStatus; + if (result.filename === "quickInfo.cpp" && result.status === apit.Status.IntelliSenseReady) { + console.log(`IntelliSense for '${result.filename}' is ready`); + resolve(); + } + })); }); // Start language server console.log("Open file: " + fileUri.toString()); await vscode.commands.executeCommand("vscode.open", fileUri); - await timeout(5000, getIntelliSenseStatus.then(() => getIntelliSenseStatus.reset())); + await timeout(5000, getIntelliSenseStatus); + }); suiteTeardown(function(): void { @@ -56,19 +64,19 @@ suite("[Quick info test]", function(): void { assert.strictEqual(actual, expected); }); - // [TODO] - temporarily skip this test at the moment - it doesn't currently work (locally anyway) -- + /** TODO: Investigate why this changes from to int inconsistently */ test.skip("[Hover over function call - Doxygen comment]", async () => { const result: vscode.Hover[] = (await vscode.commands.executeCommand('vscode.executeHoverProvider', fileUri, new vscode.Position(36, 9))); - const expected_full_comment: string = `\`\`\`cpp\nint testDoxygen(int base, int height)\n\`\`\` \nCalculates area of rectangle \n \n**Template Parameters:** \n\`T\` – is template param \n \n**Parameters:** \n\`base\` – is horizontal length \n\`height\` – is vertical length \n \n**Returns:** \nArea of rectangle \n \n**Exceptions:** \nThis is an exception comment`; + const expected_full_comment: string = `\`\`\`cpp\nT testDoxygen(T base, T height)\n\`\`\` \nCalculates area of rectangle \n \n**Template Parameters:** \n\`T\` – is template param \n \n**Parameters:** \n\`base\` – is horizontal length \n\`height\` – is vertical length \n \n**Returns:** \nArea of rectangle \n \n**Exceptions:** \nThis is an exception comment`; const expectedMap: Map = new Map(); - expectedMap.set("win32", `\`\`\`cpp\nint testDoxygen(int base, int height)\n\`\`\``); // Running test locally returns full comment, but running test on Azure pipeline does not. + expectedMap.set("win32", `\`\`\`cpp\nT testDoxygen(T base, T height)\n\`\`\``); // Running test locally returns full comment, but running test on Azure pipeline does not. expectedMap.set("linux", expected_full_comment); expectedMap.set("darwin", expected_full_comment); const actual: string = (result[0].contents[0]).value; const expected: string = expectedMap.get(platform) ?? assert.fail("Platform not found"); - assert.strictEqual(actual, expected); + assert.ok(actual === expected_full_comment || actual === expected, `Should match the comment string\n\nACTUAL:===========\n${actual}\n===========\nexpected:===========\n${expected_full_comment}\n===========`); }); test("[Hover over function param string variable]", async () => { diff --git a/Extension/test/integrationTests/IntelliSenseFeatures/reference.test.ts b/Extension/test/scenarios/MultirootDeadlockTest/tests/reference.test.ts similarity index 84% rename from Extension/test/integrationTests/IntelliSenseFeatures/reference.test.ts rename to Extension/test/scenarios/MultirootDeadlockTest/tests/reference.test.ts index 108b5c0653..776c2788c6 100644 --- a/Extension/test/integrationTests/IntelliSenseFeatures/reference.test.ts +++ b/Extension/test/scenarios/MultirootDeadlockTest/tests/reference.test.ts @@ -3,12 +3,12 @@ * See 'LICENSE' in the project root for license information. * ------------------------------------------------------------------------------------------ */ import * as assert from 'assert'; +import { suite } from 'mocha'; import * as vscode from 'vscode'; import * as api from 'vscode-cpptools'; import * as apit from 'vscode-cpptools/out/testApi'; -import { ManualSignal } from '../../../src/Utility/Async/manualSignal'; -import { timeout } from '../../../src/Utility/Async/timeout'; -import * as testHelpers from '../testHelpers'; +import { timeout } from '../../../../src/Utility/Async/timeout'; +import * as testHelpers from '../../../common/testHelpers'; suite(`[Reference test]`, function(): void { let cpptools: apit.CppToolsTestApi; @@ -17,28 +17,29 @@ suite(`[Reference test]`, function(): void { const path: string = wf.uri.fsPath + "/references.cpp"; const fileUri: vscode.Uri = vscode.Uri.file(path); let testHook: apit.CppToolsTestHook; - const getIntelliSenseStatus = new ManualSignal(); let document: vscode.TextDocument; suiteSetup(async function(): Promise { await testHelpers.activateCppExtension(); - cpptools = await apit.getCppToolsTestApi(api.Version.latest) ?? assert.fail("Could not get CppToolsTestApi"); + cpptools = await apit.getCppToolsTestApi(api.Version.latest) ?? assert.fail('Could not get CppToolsTestApi'); testHook = cpptools.getTestHook(); - - testHook.IntelliSenseStatusChanged((result: apit.IntelliSenseStatus) => { - if (result.filename === "references.cpp" && result.status === apit.Status.IntelliSenseReady) { - getIntelliSenseStatus.resolve(); - } - }); - disposables.push(testHook); + const getIntelliSenseStatus = new Promise((resolve) => { + disposables.push(testHook.IntelliSenseStatusChanged(result => { + result = result as apit.IntelliSenseStatus; + if (result.filename === "references.cpp" && result.status === apit.Status.IntelliSenseReady) { + console.log(`IntelliSense for '${result.filename}' is ready`); + resolve(); + } + })); + }); // Start language server console.log("Open file: " + fileUri.toString()); document = await vscode.workspace.openTextDocument(fileUri); await vscode.window.showTextDocument(document); - await timeout(5000, getIntelliSenseStatus.then(() => getIntelliSenseStatus.reset())); + await timeout(5000, getIntelliSenseStatus); }); test("[Find confirmed references of a symbol]", async () => { diff --git a/Extension/test/scenarios/NoWorkspace/assets/open_file.cpp b/Extension/test/scenarios/NoWorkspace/assets/open_file.cpp new file mode 100644 index 0000000000..3d4661976c --- /dev/null +++ b/Extension/test/scenarios/NoWorkspace/assets/open_file.cpp @@ -0,0 +1,10 @@ +// system library includes should work +#include + +int main() +{ + std::string a = ""; + a = some_variable; // Error squiggles are enabled for opening a single file. + ++j; + return 0; +} \ No newline at end of file diff --git a/Extension/test/integrationTests/testAssets/SimpleCppProject/.gitignore b/Extension/test/scenarios/SimpleCppProject/assets/.gitignore similarity index 100% rename from Extension/test/integrationTests/testAssets/SimpleCppProject/.gitignore rename to Extension/test/scenarios/SimpleCppProject/assets/.gitignore diff --git a/Extension/test/integrationTests/testAssets/SimpleCppProject/.vscode/launch.json b/Extension/test/scenarios/SimpleCppProject/assets/.vscode/launch.json similarity index 100% rename from Extension/test/integrationTests/testAssets/SimpleCppProject/.vscode/launch.json rename to Extension/test/scenarios/SimpleCppProject/assets/.vscode/launch.json diff --git a/Extension/test/integrationTests/testAssets/SimpleCppProject/.vscode/tasks.json b/Extension/test/scenarios/SimpleCppProject/assets/.vscode/tasks.json similarity index 100% rename from Extension/test/integrationTests/testAssets/SimpleCppProject/.vscode/tasks.json rename to Extension/test/scenarios/SimpleCppProject/assets/.vscode/tasks.json diff --git a/Extension/test/integrationTests/testAssets/SimpleCppProject/main.cpp b/Extension/test/scenarios/SimpleCppProject/assets/main.cpp similarity index 100% rename from Extension/test/integrationTests/testAssets/SimpleCppProject/main.cpp rename to Extension/test/scenarios/SimpleCppProject/assets/main.cpp diff --git a/Extension/test/integrationTests/testAssets/SimpleCppProject/main1.cpp b/Extension/test/scenarios/SimpleCppProject/assets/main1.cpp similarity index 100% rename from Extension/test/integrationTests/testAssets/SimpleCppProject/main1.cpp rename to Extension/test/scenarios/SimpleCppProject/assets/main1.cpp diff --git a/Extension/test/integrationTests/testAssets/SimpleCppProject/main2.cpp b/Extension/test/scenarios/SimpleCppProject/assets/main2.cpp similarity index 100% rename from Extension/test/integrationTests/testAssets/SimpleCppProject/main2.cpp rename to Extension/test/scenarios/SimpleCppProject/assets/main2.cpp diff --git a/Extension/test/integrationTests/testAssets/SimpleCppProject/main3.cpp b/Extension/test/scenarios/SimpleCppProject/assets/main3.cpp similarity index 100% rename from Extension/test/integrationTests/testAssets/SimpleCppProject/main3.cpp rename to Extension/test/scenarios/SimpleCppProject/assets/main3.cpp diff --git a/Extension/test/integrationTests/testAssets/SimpleCppProject/simpleCppProject.code-workspace b/Extension/test/scenarios/SimpleCppProject/assets/simpleCppProject.code-workspace similarity index 100% rename from Extension/test/integrationTests/testAssets/SimpleCppProject/simpleCppProject.code-workspace rename to Extension/test/scenarios/SimpleCppProject/assets/simpleCppProject.code-workspace diff --git a/Extension/test/integrationTests/languageServer/languageServer.integration.test.ts b/Extension/test/scenarios/SimpleCppProject/tests/languageServer.integration.test.ts similarity index 89% rename from Extension/test/integrationTests/languageServer/languageServer.integration.test.ts rename to Extension/test/scenarios/SimpleCppProject/tests/languageServer.integration.test.ts index 1a348da8c2..20d591cf6c 100644 --- a/Extension/test/integrationTests/languageServer/languageServer.integration.test.ts +++ b/Extension/test/scenarios/SimpleCppProject/tests/languageServer.integration.test.ts @@ -2,18 +2,19 @@ * Copyright (c) Microsoft Corporation. All Rights Reserved. * See 'LICENSE' in the project root for license information. * ------------------------------------------------------------------------------------------ */ - +/* eslint-disable @typescript-eslint/no-unused-vars */ /* eslint-disable @typescript-eslint/triple-slash-reference */ -/// +/// import * as assert from 'assert'; +import { suite } from 'mocha'; import * as vscode from 'vscode'; import * as api from 'vscode-cpptools'; import * as apit from 'vscode-cpptools/out/testApi'; -import * as config from '../../../src/LanguageServer/configurations'; -import { getLanguageConfigFromPatterns } from '../../../src/LanguageServer/languageConfig'; -import * as util from '../../../src/common'; -import * as testHelpers from '../testHelpers'; +import * as config from '../../../../src/LanguageServer/configurations'; +import { getLanguageConfigFromPatterns } from '../../../../src/LanguageServer/languageConfig'; +import * as util from '../../../../src/common'; +import * as testHelpers from '../../../common/testHelpers'; suite("multiline comment setting tests", function(): void { suiteSetup(async function(): Promise { @@ -21,25 +22,25 @@ suite("multiline comment setting tests", function(): void { }); const defaultMLRules: vscode.OnEnterRule[] = [ - { // e.g. /** | */ + { // e.g. /** | */ beforeText: /^\s*\/\*\*(?!\/)([^\*]|\*(?!\/))*$/, afterText: /^\s*\*\/$/, action: { indentAction: vscode.IndentAction.IndentOutdent, appendText: ' * ' } }, - { // e.g. /** ...| + { // e.g. /** ...| beforeText: /^\s*\/\*\*(?!\/)([^\*]|\*(?!\/))*$/, action: { indentAction: vscode.IndentAction.None, appendText: ' * ' } }, - { // e.g. * ...| + { // e.g. * ...| beforeText: /^(\t|[ ])*\ \*(\ ([^\*]|\*(?!\/))*)?$/, previousLineText: /(?=^(\s*(\/\*\*|\*)).*)(?=(?!(\s*\*\/)))/, action: { indentAction: vscode.IndentAction.None, appendText: '* ' } }, - { // e.g. */| + { // e.g. */| beforeText: /^(\t|[ ])*\*\/\s*$/, action: { indentAction: vscode.IndentAction.None, removeText: 1 } }, - { // e.g. *-----*/| + { // e.g. *-----*/| beforeText: /^(\t|[ ])*\*[^/]*\*\/\s*$/, action: { indentAction: vscode.IndentAction.None, removeText: 1 } } @@ -56,27 +57,28 @@ suite("multiline comment setting tests", function(): void { ]; test("Check the default OnEnterRules for C", () => { - const rules: vscode.OnEnterRule[] = getLanguageConfigFromPatterns('c', [ "/**" ]).onEnterRules ?? assert.fail('onEnterRules is undefined'); + const rules = getLanguageConfigFromPatterns('c', [ "/**" ]).onEnterRules; + assert.deepStrictEqual(rules, defaultMLRules); }); test("Check for removal of single line comment continuations for C", () => { - const rules: vscode.OnEnterRule[] = getLanguageConfigFromPatterns('c', [ "/**", "///" ]).onEnterRules ?? assert.fail('onEnterRules is undefined'); + const rules = getLanguageConfigFromPatterns('c', [ "/**", "///" ]).onEnterRules; assert.deepStrictEqual(rules, defaultMLRules); }); test("Check the default OnEnterRules for C++", () => { - const rules: vscode.OnEnterRule[] = getLanguageConfigFromPatterns('cpp', [ "/**" ]).onEnterRules ?? assert.fail('onEnterRules is undefined'); + const rules = getLanguageConfigFromPatterns('cpp', [ "/**" ]).onEnterRules; assert.deepStrictEqual(rules, defaultMLRules); }); test("Make sure duplicate rules are removed", () => { - const rules: vscode.OnEnterRule[] = getLanguageConfigFromPatterns('cpp', [ "/**", { begin: "/**", continue: " * " }, "/**" ]).onEnterRules ?? assert.fail('onEnterRules is undefined'); + const rules = getLanguageConfigFromPatterns('cpp', [ "/**", { begin: "/**", continue: " * " }, "/**" ]).onEnterRules; assert.deepStrictEqual(rules, defaultMLRules); }); test("Check single line rules for C++", () => { - const rules: vscode.OnEnterRule[] = getLanguageConfigFromPatterns('cpp', [ "///" ]).onEnterRules ?? assert.fail('onEnterRules is undefined'); + const rules = getLanguageConfigFromPatterns('cpp', [ "///" ]).onEnterRules; assert.deepStrictEqual(rules, defaultSLRules); }); @@ -85,8 +87,10 @@ suite("multiline comment setting tests", function(): void { /* **************************************************************************** */ function cppPropertiesPath(): string { - const wf = vscode.workspace.workspaceFolders?.[0] ?? assert.fail("No workspace folder open"); - return `${wf.uri.fsPath}/.vscode/c_cpp_properties.json`; + const folder = vscode.workspace.workspaceFolders?.[0]; + assert.ok(folder, 'workspace folder should be set.'); + + return folder.uri.fsPath + "/.vscode/c_cpp_properties.json"; } async function changeCppProperties(cppProperties: config.ConfigurationJson, _disposables: vscode.Disposable[]): Promise { @@ -161,7 +165,7 @@ suite("extensibility tests v3", function(): void { const disposables: vscode.Disposable[] = []; suiteSetup(async function(): Promise { - cpptools = await apit.getCppToolsTestApi(api.Version.v3) ?? assert.fail('Unable to get the CppToolsTestApi'); + cpptools = await apit.getCppToolsTestApi(api.Version.v3) ?? assert.fail('Could not get CppToolsTestApi'); cpptools.registerCustomConfigurationProvider(provider); cpptools.notifyReady(provider); disposables.push(cpptools); @@ -179,8 +183,10 @@ suite("extensibility tests v3", function(): void { test("Check provider - main3.cpp", async () => { // Open a c++ file to start the language server. - const wf = vscode.workspace.workspaceFolders?.[0] ?? assert.fail("No workspace folder open"); - const path: string = `${wf.uri.fsPath}/main3.cpp`; + const folder = vscode.workspace.workspaceFolders?.[0]; + assert.ok(folder, 'workspace folder should be set.'); + + const path: string = folder.uri.fsPath + "/main3.cpp"; const uri: vscode.Uri = vscode.Uri.file(path); const testHook: apit.CppToolsTestHook = cpptools.getTestHook(); @@ -255,7 +261,7 @@ suite("extensibility tests v2", function(): void { const disposables: vscode.Disposable[] = []; suiteSetup(async function(): Promise { - cpptools = await apit.getCppToolsTestApi(api.Version.v2) ?? assert.fail('Unable to get the CppToolsTestApi'); + cpptools = await apit.getCppToolsTestApi(api.Version.v2) ?? assert.fail('Could not get CppToolsTestApi'); cpptools.registerCustomConfigurationProvider(provider); cpptools.notifyReady(provider); disposables.push(cpptools); @@ -273,8 +279,10 @@ suite("extensibility tests v2", function(): void { test("Check provider - main2.cpp", async () => { // Open a c++ file to start the language server. - const wf = vscode.workspace.workspaceFolders?.[0] ?? assert.fail("No workspace folder open"); - const path: string = `${wf.uri.fsPath}/main2.cpp`; + const folder = vscode.workspace.workspaceFolders?.[0]; + assert.ok(folder, 'workspace folder should be set.'); + + const path: string = folder.uri.fsPath + "/main2.cpp"; const uri: vscode.Uri = vscode.Uri.file(path); const testHook: apit.CppToolsTestHook = cpptools.getTestHook(); @@ -336,7 +344,7 @@ suite("extensibility tests v1", function(): void { const disposables: vscode.Disposable[] = []; suiteSetup(async function(): Promise { - cpptools = await apit.getCppToolsTestApi(api.Version.v1) ?? assert.fail('Unable to get the CppToolsTestApi'); + cpptools = await apit.getCppToolsTestApi(api.Version.v1) ?? assert.fail('Could not get CppToolsTestApi'); cpptools.registerCustomConfigurationProvider(provider); disposables.push(cpptools); @@ -353,8 +361,10 @@ suite("extensibility tests v1", function(): void { test("Check provider - main1.cpp", async () => { // Open a c++ file to start the language server. - const wf = vscode.workspace.workspaceFolders?.[0] ?? assert.fail("No workspace folder open"); - const path: string = `${wf.uri.fsPath}/main1.cpp`; + const folder = vscode.workspace.workspaceFolders?.[0]; + assert.ok(folder, 'workspace folder should be set.'); + + const path: string = folder.uri.fsPath + "/main1.cpp"; const uri: vscode.Uri = vscode.Uri.file(path); const testHook: apit.CppToolsTestHook = cpptools.getTestHook(); @@ -410,7 +420,7 @@ suite("extensibility tests v0", function(): void { const disposables: vscode.Disposable[] = []; suiteSetup(async function(): Promise { - cpptools = await apit.getCppToolsTestApi(api.Version.v0) ?? assert.fail('Unable to get the CppToolsTestApi'); + cpptools = await apit.getCppToolsTestApi(api.Version.v0) ?? assert.fail('Could not get CppToolsTestApi'); cpptools.registerCustomConfigurationProvider(provider); disposables.push(cpptools); // This is a no-op for v0, but do it anyway to make sure nothing breaks. @@ -428,8 +438,10 @@ suite("extensibility tests v0", function(): void { test("Check provider - main.cpp", async () => { // Open a C++ file to start the language server. - const wf = vscode.workspace.workspaceFolders?.[0] ?? assert.fail("No workspace folder open"); - const path: string = `${wf.uri.fsPath}/main.cpp`; + const folder = vscode.workspace.workspaceFolders?.[0]; + assert.ok(folder, 'workspace folder should be set.'); + + const path: string = folder.uri.fsPath + "/main.cpp"; const uri: vscode.Uri = vscode.Uri.file(path); const testHook: apit.CppToolsTestHook = cpptools.getTestHook(); diff --git a/Extension/test/scenarios/SingleRootProject/assets/call_hierarchy/call_test1.cpp b/Extension/test/scenarios/SingleRootProject/assets/call_hierarchy/call_test1.cpp new file mode 100644 index 0000000000..01a27c709d --- /dev/null +++ b/Extension/test/scenarios/SingleRootProject/assets/call_hierarchy/call_test1.cpp @@ -0,0 +1,16 @@ +#include "call_test1.h" + +void call_test1::call_function_one(int x) +{ + call_cleanup(); +} + +int call_test1::call_function_two(bool a) +{ + call_cleanup(); + return 0; +} + +void call_test1::call_cleanup() +{ +} \ No newline at end of file diff --git a/Extension/test/scenarios/SingleRootProject/assets/call_hierarchy/call_test1.h b/Extension/test/scenarios/SingleRootProject/assets/call_hierarchy/call_test1.h new file mode 100644 index 0000000000..c808b3f2b0 --- /dev/null +++ b/Extension/test/scenarios/SingleRootProject/assets/call_hierarchy/call_test1.h @@ -0,0 +1,9 @@ +class call_test1 +{ +public: + void call_function_one(int x); + int call_function_two(bool a); + +private: + void call_cleanup(); +}; \ No newline at end of file diff --git a/Extension/test/scenarios/SingleRootProject/assets/call_hierarchy/call_test2.cpp b/Extension/test/scenarios/SingleRootProject/assets/call_hierarchy/call_test2.cpp new file mode 100644 index 0000000000..9fafe37042 --- /dev/null +++ b/Extension/test/scenarios/SingleRootProject/assets/call_hierarchy/call_test2.cpp @@ -0,0 +1,27 @@ +#include "call_test1.h" + +namespace call_namespace +{ + void local_call_one() + { + } + + void local_call_two() + { + local_call_one(); + } +} + +void function_caller() +{ + call_namespace::local_call_two(); + + call_test1 c; + c.call_function_one(1); + c.call_function_two(true); +} + +void top_caller() +{ + function_caller(); +} \ No newline at end of file diff --git a/Extension/test/scenarios/SingleRootProject/assets/code_folding.cpp b/Extension/test/scenarios/SingleRootProject/assets/code_folding.cpp new file mode 100644 index 0000000000..6c47080e26 --- /dev/null +++ b/Extension/test/scenarios/SingleRootProject/assets/code_folding.cpp @@ -0,0 +1,56 @@ +// Comment block +// should +// get +// folded + +/* + Comment block + should + get + folded +*/ + +#include "notfound1.h" +#include "notfound2.h" +#include "notfound3.h" + +#define TEST + +#ifdef TEST +void foo() +{ +} +#endif + +#ifndef TEST +void foo() +{ +} +#endif + +void bar() +{ +#ifdef TEST + foo(); +#else + foo(); +#endif +} + +class A +{ +}; + +class B +{ + int i; +#ifdef TEST + void foo2() + { + } +#else + void foo2(int i) + { + } +#endif +}; diff --git a/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Auto.cpp b/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Auto.cpp new file mode 100644 index 0000000000..aadcd60537 --- /dev/null +++ b/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Auto.cpp @@ -0,0 +1,10 @@ +int i; + +class Test +{ + auto AutoFunction1() -> double; + auto AutoFunction2(); + decltype(i) AutoFunction3(); + decltype(auto) AutoFunction4(); + int *AutoFunction5(); +}; diff --git a/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/C_File.c b/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/C_File.c new file mode 100644 index 0000000000..1ce01687ba --- /dev/null +++ b/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/C_File.c @@ -0,0 +1,5 @@ +// Test a C file. + +void unique_Function_1(); + +int unique_function_2(); \ No newline at end of file diff --git a/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Class.cpp b/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Class.cpp new file mode 100644 index 0000000000..1259032ca8 --- /dev/null +++ b/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Class.cpp @@ -0,0 +1,16 @@ +#include "Class.h" + +// Comment +void Class::ClassFunction1() const +{ +} + +// Another comment +void Class::ClassFunction2() +{ +} + +class LocalClass +{ + void LocalFunction(); +}; diff --git a/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Class.h b/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Class.h new file mode 100644 index 0000000000..26ae648c6c --- /dev/null +++ b/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Class.h @@ -0,0 +1,12 @@ +#pragma once + +class Class +{ +public: + void ClassFunction2(); + // Comment + int ClassFunction3(int param); + + template + void ClassFunction4(); +}; diff --git a/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/ClassConstructor.cpp b/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/ClassConstructor.cpp new file mode 100644 index 0000000000..2d3b5ac448 --- /dev/null +++ b/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/ClassConstructor.cpp @@ -0,0 +1,11 @@ + +class Constructor +{ +public: + Constructor(); + int m_i; +}; + +Constructor::Constructor() : m_i(0) +{ +} diff --git a/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/FunctionTypes.cpp b/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/FunctionTypes.cpp new file mode 100644 index 0000000000..e2e8721929 --- /dev/null +++ b/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/FunctionTypes.cpp @@ -0,0 +1,10 @@ + +void GlobalDeclaration(); +int GlobalDefinition() +{ +} + +class GlobalClass +{ + virtual void AbstractFunction() abstract; +}; \ No newline at end of file diff --git a/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Global.cpp b/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Global.cpp new file mode 100644 index 0000000000..5991139475 --- /dev/null +++ b/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Global.cpp @@ -0,0 +1,13 @@ + +int GlobalFunction1() +{ +} + +int GlobalFunction2() +{ +} + +template +int GlobalFunction4() +{ +} diff --git a/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Global.h b/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Global.h new file mode 100644 index 0000000000..6e51ccfdd6 --- /dev/null +++ b/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Global.h @@ -0,0 +1,6 @@ +#pragma once + +int GlobalFunction2(); +int GlobalFunction3(); +template +int GlobalFunction5(); diff --git a/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Inline.h b/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Inline.h new file mode 100644 index 0000000000..7f9775ba9d --- /dev/null +++ b/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Inline.h @@ -0,0 +1,10 @@ +#pragma once + +class Inline +{ + +}; + +inline void Inline::InlineFunction() +{ +} diff --git a/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/LightBulb.cpp b/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/LightBulb.cpp new file mode 100644 index 0000000000..1b9c96b2f0 --- /dev/null +++ b/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/LightBulb.cpp @@ -0,0 +1,10 @@ + +class SmartClass +{ +public: + int SmartFunction1(int param) const; +}; + +void SmartClass::SmartFunction2(double param) +{ +} diff --git a/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Multi.cpp b/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Multi.cpp new file mode 100644 index 0000000000..92b738ab32 --- /dev/null +++ b/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Multi.cpp @@ -0,0 +1,5 @@ +#include "Multi.h" + +void Multi::MultiFunction1(int param) +{ +} diff --git a/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Multi.h b/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Multi.h new file mode 100644 index 0000000000..34a73f6c70 --- /dev/null +++ b/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Multi.h @@ -0,0 +1,10 @@ +#pragma once + +class Multi +{ +public: + void MultiFunction1(int param); + int MultiFunction2(); +}; + +void MultiFunction(int param); diff --git a/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/MultiNamespace.cpp b/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/MultiNamespace.cpp new file mode 100644 index 0000000000..5f582d1506 --- /dev/null +++ b/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/MultiNamespace.cpp @@ -0,0 +1,23 @@ +namespace MultiNamespace +{ +} + +namespace MultiNamespace +{ +} + +namespace MultiNamespace +{ + void Declaration(); + int Definition() + { + } +} + +namespace MultiNamespace +{ +} + +namespace MultiNamespace +{ +} diff --git a/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Namespace.cpp b/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Namespace.cpp new file mode 100644 index 0000000000..cd12bf9c46 --- /dev/null +++ b/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Namespace.cpp @@ -0,0 +1,24 @@ +#include "Namespace.h" + +namespace NS3 +{ + void NamespaceFunction3(); +} + +namespace NS4 +{ + int NamespaceFunction4() {} +} + +namespace NSDual +{ + int NamespaceFunction5() {} +} + +namespace NSTriple +{ + void NamespaceFunction6() {} +} + +void NSTriple::Neighbor1() {} +void NSTriple::Neighbor2() {} diff --git a/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Namespace.h b/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Namespace.h new file mode 100644 index 0000000000..a21bbf289f --- /dev/null +++ b/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Namespace.h @@ -0,0 +1,19 @@ +#pragma once + +namespace NS1 +{ + int NamespaceFunction1(); +} + +namespace NS2 +{ + void NamespaceFunction2() {} +} + +namespace NSDual +{ +} + +namespace NSTriple +{ +} diff --git a/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/NamespaceOther.h b/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/NamespaceOther.h new file mode 100644 index 0000000000..107b9b47a8 --- /dev/null +++ b/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/NamespaceOther.h @@ -0,0 +1,8 @@ +#pragma once + +namespace NSTriple +{ + void Neighbor2(); + void Neighbor3(); + void Neighbor4() {} +} diff --git a/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/NotInProject.h b/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/NotInProject.h new file mode 100644 index 0000000000..401e9c3072 --- /dev/null +++ b/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/NotInProject.h @@ -0,0 +1,4 @@ +class NotInProject +{ + void AFunction(); +}; diff --git a/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Scope.cpp b/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Scope.cpp new file mode 100644 index 0000000000..15caf97107 --- /dev/null +++ b/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Scope.cpp @@ -0,0 +1,18 @@ + + +void ScopeClass::ScopeFunction1() const +{ +} + +namespace ScopeNamespace +{ +} + +void ScopeNamespace::ScopeFunction2() +{ +} + +template +void ScopeNamespace::ScopeFunction3() +{ +} \ No newline at end of file diff --git a/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Scope.h b/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Scope.h new file mode 100644 index 0000000000..eba79fb6c2 --- /dev/null +++ b/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Scope.h @@ -0,0 +1,9 @@ +#pragma once + +class ScopeClass +{ +}; + +namespace ScopeNamespace +{ +} diff --git a/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Templates.cpp b/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Templates.cpp new file mode 100644 index 0000000000..3012ce3d97 --- /dev/null +++ b/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/Templates.cpp @@ -0,0 +1,19 @@ + +template struct S {}; + +template +struct S +{ + template + void OneTemplateFunction() + { + } +}; + +template<> +struct S +{ + void ZeroTemplateFunction() + { + } +}; \ No newline at end of file diff --git a/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/cdd_test1.cpp b/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/cdd_test1.cpp new file mode 100644 index 0000000000..b995360ef8 --- /dev/null +++ b/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/cdd_test1.cpp @@ -0,0 +1,19 @@ +// Use this file to test Create Declaration / Definiton +// for when a target file already exists. + +#include "cdd_test1.h" + +int cdd_test1::my_function_add(int a, int b) +{ + return 0; +} + +int cdd_test1::my_function_sub(int x, int y) +{ + return 0; +} + +int cdd_test1::my_function_multi(int j, int k) +{ + return 0; +} \ No newline at end of file diff --git a/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/cdd_test1.h b/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/cdd_test1.h new file mode 100644 index 0000000000..2c719c2598 --- /dev/null +++ b/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/cdd_test1.h @@ -0,0 +1,17 @@ +// Use this file to test Create Declaration / Definiton +// for when a target file already exists. + +class cdd_test1 +{ + /// @brief Addition + /// @param a First number + /// @param b Second number + /// @return The sum of a and b + int my_function_add(int a, int b); + + /// @brief Subtraction + /// @param x 1st number + /// @param y 2nd number + /// @return Subtracts y from x + int my_function_sub(int x, int y); +}; \ No newline at end of file diff --git a/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/cdd_test2.h b/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/cdd_test2.h new file mode 100644 index 0000000000..70d64e27ef --- /dev/null +++ b/Extension/test/scenarios/SingleRootProject/assets/create_declaration_definition/cdd_test2.h @@ -0,0 +1,15 @@ +// Use this file to test Create Declaration / Definiton +// for when the target file needs to be created by +// the operation. + +class cdd_test2 +{ + /// @brief This is sample comment + /// @param value The input sample + /// @return The result sample + bool my_function_flag(bool value); + + /// @brief My sample comment + /// @param num The input number sample + void my_function_other(int num); +}; \ No newline at end of file diff --git a/Extension/test/scenarios/SingleRootProject/assets/documentSymbols/levelOneFolder/levelOneFile.cpp b/Extension/test/scenarios/SingleRootProject/assets/documentSymbols/levelOneFolder/levelOneFile.cpp new file mode 100644 index 0000000000..f25a2a44cf --- /dev/null +++ b/Extension/test/scenarios/SingleRootProject/assets/documentSymbols/levelOneFolder/levelOneFile.cpp @@ -0,0 +1,26 @@ +#include "levelOneFile.h" + +namespace test +{ + namespace extra + { + helper::helper(/* args */) + { + my_val_help = 2; + } + + int helper::getHelp() + { + return my_val_help; + } + } + document_symbol_tests::document_symbol_tests(/* args */) + { + val = 10 * h.getHelp(); + } +} + +rootClass::rootClass() +{ + rootVal = 10; +} \ No newline at end of file diff --git a/Extension/test/scenarios/SingleRootProject/assets/documentSymbols/levelOneFolder/levelOneFile.h b/Extension/test/scenarios/SingleRootProject/assets/documentSymbols/levelOneFolder/levelOneFile.h new file mode 100644 index 0000000000..52b8a35cab --- /dev/null +++ b/Extension/test/scenarios/SingleRootProject/assets/documentSymbols/levelOneFolder/levelOneFile.h @@ -0,0 +1,32 @@ +namespace test +{ + namespace extra + { + class helper + { + private: + int my_val_help; + public: + helper(/* args */); + int getHelp(); + }; + } + + class document_symbol_tests + { + private: + int val; + extra::helper h; + public: + document_symbol_tests(/* args */); + ~document_symbol_tests(); + }; +} + +class rootClass +{ + private: + int rootVal; + public: + rootClass(); +}; \ No newline at end of file diff --git a/Extension/test/scenarios/SingleRootProject/assets/documentSymbols/levelOneFolder/levelTwoFolder/levelTwoFile.cpp b/Extension/test/scenarios/SingleRootProject/assets/documentSymbols/levelOneFolder/levelTwoFolder/levelTwoFile.cpp new file mode 100644 index 0000000000..f96ef19895 --- /dev/null +++ b/Extension/test/scenarios/SingleRootProject/assets/documentSymbols/levelOneFolder/levelTwoFolder/levelTwoFile.cpp @@ -0,0 +1,22 @@ +#include "levelTwoFile.h" + +namespace foo { + namespace bar { + namespace baz { + int qux = 42; + } + } +} + +namespace foo::bar::baz +{ + namespace foo3 + { + class c {}; + } +} + +int main() +{ + return 0; +} \ No newline at end of file diff --git a/Extension/test/scenarios/SingleRootProject/assets/documentSymbols/levelOneFolder/levelTwoFolder/levelTwoFile.h b/Extension/test/scenarios/SingleRootProject/assets/documentSymbols/levelOneFolder/levelTwoFolder/levelTwoFile.h new file mode 100644 index 0000000000..5242cdf236 --- /dev/null +++ b/Extension/test/scenarios/SingleRootProject/assets/documentSymbols/levelOneFolder/levelTwoFolder/levelTwoFile.h @@ -0,0 +1,29 @@ +namespace NS +{ + class F + { + void f(); + void g(); + void l(); + }; +} + +void h() +{ +} + +namespace NS +{ + void F::f() + { + } + void F::g() + { + } +} + +using namespace NS; + +void F::l() +{ +} diff --git a/Extension/test/scenarios/SingleRootProject/assets/doxygen.cpp b/Extension/test/scenarios/SingleRootProject/assets/doxygen.cpp new file mode 100644 index 0000000000..301f5fec3c --- /dev/null +++ b/Extension/test/scenarios/SingleRootProject/assets/doxygen.cpp @@ -0,0 +1,64 @@ +/// @brief Calculates area of triangle +/// @tparam T is template param +/// @param base is horizontal length +/// @param height is vertical length +/// @return Area of triangle +/// @exception This is an exception comment +/// @deprecated This is deprecated comment +/// @note this is note +/// @attention this is attention +/// @pre this is pre comment +template +T TriangleArea(T base, T height) +{ + double result; + result = base * height * 0.5; + return (T)result; +} + +/// @brief Calculates area of rectangle +/// @tparam T is template param +/// @param base is horizontal length +/// @param height is vertical length +/// @return Area of rectangle +/// @exception This is an exception comment +template +T RectangleArea(T base, T height) +{ + double result; + result = base * height; + return (T)result; +} + +/// @brief function with no parameters and no returns +void func_zero() +{} + +/// @brief function with one parameter and no returns +/// @param myParam is horizontal length +void func_one(int myParam) +{} + +/// @brief function with two parameter and no returns +/// @param value_one is first parameter +/// @param value_two is second parameter +void func_two(int value_one, double value_two) +{} + +/// @brief function with two parameters +/// @param value_one is first parameter +/// @param value_two is second parameter +/// @return 1 if value_one is greater than 0, otherwise 3. +int func_three(int value_one, double value_two) +{ + return (value_one > 0) ? 1 : 3; +} + +int main() +{ + int area = TriangleArea(1, 2); + + func_three(8, 7); + + return 0; +} \ No newline at end of file diff --git a/Extension/test/scenarios/SingleRootProject/assets/doxygen_generation.cpp b/Extension/test/scenarios/SingleRootProject/assets/doxygen_generation.cpp new file mode 100644 index 0000000000..1885e113ad --- /dev/null +++ b/Extension/test/scenarios/SingleRootProject/assets/doxygen_generation.cpp @@ -0,0 +1,24 @@ + + +int add_numbers(int a, int b, int c) +{ + return a + b + c; +}; + +template +T TriangleArea(T base, T height) +{ + double result; + result = base * height * 0.5; + return (T)result; +} + +void func_one() +{ + +} + +void func_two(int a) +{ + +} diff --git a/Extension/test/scenarios/SingleRootProject/assets/inlay_hints.cpp b/Extension/test/scenarios/SingleRootProject/assets/inlay_hints.cpp new file mode 100644 index 0000000000..2e28cd05f3 --- /dev/null +++ b/Extension/test/scenarios/SingleRootProject/assets/inlay_hints.cpp @@ -0,0 +1,107 @@ +int area(const int width, const int height) +{ + return width * height; +} + +void swap(int &first, int &last, bool flag) +{} + +void underscores(int ___x, int __y, int _z, int a) +{} + +template +T get(); + +void auto_type_templates() +{ + const auto x = get(); // : int *const + const auto x1 = get(); // : const int *const + const auto& x2 = get(); // : const int *const & + auto * const x3 = get(); // : const int *const + const auto x4 = get(); // : const int + auto& x5 = get(); // : const int & + decltype(auto) x6 = get(); // : const int & + decltype(auto) x7 = get(); // : const int * + decltype(auto) x8 = get(); // : int * + decltype(auto) x9 = get(); // : const int * + + // simple auto usage + auto index = 1; // : int + for (auto i = 0; i < 8; i++) // : int + {} +} + +void params_with_underscore() +{ + underscores(1, 2, 3, 4); // hide or show leading underscores +} + +void param_names() +{ + // Displays all param name hints + int a = area(5, 3); + int a = area(5, + 3); + int a = area( + 5, + 3); + + // Displays param name for "height" only when suppressWhenArgumentContainsName is true + int width = 5; + a = area(width, 3); + a = area(4 /*width*/, 3); + a = area( 4 /*width*/, 3); + a = area(4 /*width*/, + 3); + a = area( + 4 /*width*/, + 3); + + // Displays param name for "width" only when suppressWhenArgumentContainsName is true + int height = 3; + a = area(5, height); + a = area(5, 8 /*height*/); + a = area( 5, 8 /*height*/); + a = area(5, + 8 /*height*/); + a = area( + 5, + 8 /*height*/); + + // No hints only when suppressWhenArgumentContainsName is true + a = area(width, height); + a = area( width, height); + a = area(width, + height); + a = area( + width, + height); +} + +void param_and_reference_operator() +{ + int x = 1; + int y = 2; + bool ff = true; + + // Displays "&" operator and/or param name hints + swap(x, y, ff); + swap(x /*first*/, y, ff); + swap(x /*first*/, + y, + ff); + swap( + x /*first*/, + y, + ff); + + swap(x, y, ff); + swap(x, y /*last*/, ff); + swap(x, + y /*last*/, + ff); + swap( + x, + y /*last*/, + ff); +} diff --git a/Extension/test/scenarios/SingleRootProject/assets/main.cpp b/Extension/test/scenarios/SingleRootProject/assets/main.cpp new file mode 100644 index 0000000000..858b4d56b5 --- /dev/null +++ b/Extension/test/scenarios/SingleRootProject/assets/main.cpp @@ -0,0 +1,6 @@ +#include "references.h" + +int main() +{ + nsReferences::funcInHeader1(); +} \ No newline at end of file diff --git a/Extension/test/scenarios/SingleRootProject/assets/quickInfo.cpp b/Extension/test/scenarios/SingleRootProject/assets/quickInfo.cpp new file mode 100644 index 0000000000..73ff214d36 --- /dev/null +++ b/Extension/test/scenarios/SingleRootProject/assets/quickInfo.cpp @@ -0,0 +1,38 @@ + +#include + +// comment for myfunction +void myfunction(int var1, std::string var2, std::string var3) +{ +} + +// Verifies if input is even number or not +bool isEven(int value) +{ + return value % 2 == 0; +} + +/// @brief Calculates area of rectangle +/// @tparam T is template param +/// @param base is horizontal length +/// @param height is vertical length +/// @return Area of rectangle +/// @exception This is an exception comment +/// @pre This is pre comment +template +T testDoxygen(T base, T height) +{ + double result; + result = base * height; + return (T)result; +} + +int main() +{ + std::string stringVar = "myString"; + int intVar = 0; + myfunction(intVar, stringVar, "stringVar"); + myfunction(false); + bool result = isEven(1); + testDoxygen(2, 3); +} \ No newline at end of file diff --git a/Extension/test/scenarios/SingleRootProject/assets/references.cpp b/Extension/test/scenarios/SingleRootProject/assets/references.cpp new file mode 100644 index 0000000000..475dd14749 --- /dev/null +++ b/Extension/test/scenarios/SingleRootProject/assets/references.cpp @@ -0,0 +1,54 @@ +namespace foo { + namespace bar { + namespace baz { + int qux = 42; + } + } +} + +namespace foo::bar::baz +{ +} + +#include "references.h" + +using namespace nsReferences; + +int var1; // file scope extern +int func1(); // declaration +int func1(float var1) // local param +{ + { + double var1 = 0; // new local scope + return var1; + } + return var1 + func1(); +} + +int func1() // overload. Returns confirmed and non-confirmed references. +{ + if (var1 == 0) + return func1(0); +} + +void func2() +{ + funcInHeader1(); +} + +void func3() +{ + // func1 comment reference func1 (source file) + const char *s = "func1"; // string reference +#if 0 + func1(0); // inactive reference +#endif + cannotConfirmReference1; + { + int cannotConfirmReference1; + } +} + +const char* myLibStr = "MyLibStr"; // References in the IDL +#include "testIdl.idl" +void MyTypeLibrary() { return ; } // Not an IDL reference diff --git a/Extension/test/scenarios/SingleRootProject/assets/references.h b/Extension/test/scenarios/SingleRootProject/assets/references.h new file mode 100644 index 0000000000..67ebada6dc --- /dev/null +++ b/Extension/test/scenarios/SingleRootProject/assets/references.h @@ -0,0 +1,13 @@ +namespace nsReferences +{ + void funcInHeader1(); // referenced in source files references.cpp and main.cpp + + void funcInHeader2() + { + funcInHeader1(); + } + + void funcInHeader3(); + + // func1 comment reference (header file) +} diff --git a/Extension/test/scenarios/SingleRootProject/assets/semantic_colorization.cpp b/Extension/test/scenarios/SingleRootProject/assets/semantic_colorization.cpp new file mode 100644 index 0000000000..dc0e880960 --- /dev/null +++ b/Extension/test/scenarios/SingleRootProject/assets/semantic_colorization.cpp @@ -0,0 +1,373 @@ + +// The following file exercises all semantic tokens supported by the C/C++ Extension. +// +// To test, toggle the setting "C_Cpp.enhancedColorization" between "Enabled" and "Disabled". +// All tokens referred to as being "colored semantically" below, should be colored differently if enabled. +// +// Some language features (ref classes, value classes, etc.) require C++/CLI support to be enabled. +// Enable C++/CLI by configuring the C/C++ Extension to use "cl.exe" as the compiler (so, on WIndows), +// and set "compilerArgs" to: ["/clr"] +// +// Use the Dark+ theme to test. +// Since not all semantic tokens are colored by the Dark+ theme, add the following settings: +// +// "editor.semanticTokenColorCustomizations": { +// "enabled": true, +// "rules": { +// "event": "#FF0000", +// "genericType": "#ff0000", +// "variable.global": "#ff0000", +// "label": "#ff0000", +// "macro": "#ff0000", +// "property": "#ff0000", +// "namespace": "#ff0000", +// "newOperator": "#ff0000", +// "operatorOverload": "#ff0000", +// "memberOperatorOverload": "#ffff00", +// "parameter": "#ff0000", +// "referenceType": "#ff0000", +// "property.static": "#ffff00", +// "member.static": "#ffff00", +// "type": "#00ff00", +// "numberLiteral": "#ff0000", +// "stringLiteral": "#00ff00", +// "customLiteral": "#ffff00", +// "valueType": "#ffff00", +// "cliProperty": "#ffff00" +// } +// } +// +// To test backwards compatibility, also test using legacy TextMate scopes: +// +// "editor.tokenColorCustomizations": { +// "textMateRules": [ +// { +// "scope": "variable.other.event", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "entity.name.type.class.generic", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "variable.other.global", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "entity.name.label", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "entity.name.function.preprocessor", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "variable.other.property", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "entity.name.namespace", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "keyword.operator.new", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "entity.name.function.operator", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "entity.name.function.operator.member", +// "settings": { +// "foreground": "#FFFF00" +// } +// }, +// { +// "scope": "variable.parameter", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "entity.name.type.class.reference", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "variable.other.property.static", +// "settings": { +// "foreground": "#FFFF00" +// } +// }, +// { +// "scope": "entity.name.function.member.static", +// "settings": { +// "foreground": "#FFFF00" +// } +// }, +// { +// "scope": "entity.name.type", +// "settings": { +// "foreground": "#00FF00" +// } +// }, +// { +// "scope": "entity.name.operator.custom-literal.number", +// "settings": { +// "foreground": "#FF0000" +// } +// }, +// { +// "scope": "entity.name.operator.custom-literal.string", +// "settings": { +// "foreground": "#00FF00" +// } +// }, +// { +// "scope": "entity.name.operator.custom-literal", +// "settings": { +// "foreground": "#FFFF00" +// } +// }, +// { +// "scope": "entity.name.type.class.value", +// "settings": { +// "foreground": "#FFFF00" +// } +// }, +// { +// "scope": "variable.other.property.cli", +// "settings": { +// "foreground": "#FFFF00" +// } +// } +// ] +// } +// +// Documentation on these scopes can be found here: https://code.visualstudio.com/docs/cpp/colorization-cpp + +// Class Template - entity.name.type.class.templated +template +class template_class // "template_class" colored syntactically +{ +}; + +template_class instance; // "template_class" colored semantically + +// Enumerator - variable.other.enummember +enum enum_type { + enum_member = 0 // "enum_member" colored syntactically +}; + +enum_type enum_instance = enum_type::enum_member; // "enum_member" colored semantically + +// Event (C++/CLI) - variable.other.event +// This requiress CLR support. i.e. Use cl.exe and: "compilerArgs": ["/clr"] +delegate void event_delegate(); +ref class A +{ + event event_delegate^ event_instance; // "event_instance" colored semantically +}; + +// Function - entity.name.function +void function() { } // "function" colored synatically +void function2() +{ + function(); // "function" colored synatically + void(*function_pointer)() = &function; // "function" color semantically +} + +// Function Template - entity.name.function.templated +template +void template_function() +{ + template_function(); + void(*function_pointer)() = &function; // "function" color semantically +} + +// Generic Type (C++/CLI) - entity.name.type.class.generic +// This requiress CLR support. i.e. Use cl.exe and: "compilerArgs": ["/clr"] +// KNOWN BUG: https://developercommunity.visualstudio.com/content/problem/565052/color-setting-for-c-user-types-generic-types-does.html +generic +ref class generic_class +{ +}; + +void generic_class_test() +{ + generic_class generic_class_instance; // "generic_class_instance" colored semantically +} + +// Global Variable - variable.other.global +int global_instance; // "global_instance" colored semantically + +// Label - entity.name.label +void label_test() +{ + goto Label1; // "Label1" colored semantically +Label1: // "Label1" colored syntactically +} + +// Local Variable - variable.other.local +void local_variable_test() +{ + int local_instance; // "local_instance" colored semantically +} + +// Macro - entity.name.function.preprocessor +#define MACRO(a, b) // "local_instance" colored syntactically +MACRO(a, b) // "local_instance" colored semantically + +// Member Field - variable.other.property +class member_field_test +{ + int member_instance; // "member_instance" colored semantically +}; + +// Member Function - entity.name.function.member +class C +{ +public: + void member_function() { } // "member_function" colored syntactically +}; + +void member_function_test() +{ + void(C::*member_function_ptr)() = &C::member_function; // "member_function" colored semantically +}; + +// Namespace - entity.name.namespace +namespace my_namespace { +class A +{ +}; +} + +my_namespace::A a; // "my_namesapce" color semantically + // "my_namespace" will also be colored synatically as a "entity.name.scope-resolution.cpp". + // Use a distinct color for entity.name.namespace to see the difference + + +// New / Delete - keyword.operator.new +struct operator_new_test_class +{ + void* operator new(size_t sz); // "operator new" is colored semantically +}; + +// Operator Overload Function - entity.name.function.operator +class OOF { }; +OOF& operator+=(OOF& b1, OOF& b2) // "operator+=" is colored semantically +{ + b1 += b2; // "+=" is colored semantically + return b1; +}; + +// Operator Overload Member - entity.name.function.operator.member +class OOM { + OOM& operator+=(OOM& b) // "operator+=" is colored semantically + { + *this += b; // "+=" is colored semantically + return *this; + }; +}; + +// Parameter - variable.parameter +void param_test(int param1) +{ + int i = param1; // "param1" is colored semantically here, where used. +} + +// Property (C++/CLI) - variable.other.property.cli +ref class ref_class_with_property { +public: + property int prop; // "prop" is colored semantically +}; +void property_test(ref_class_with_property^ obj) +{ + obj->prop = 111; // "prop" is colored semantically +} + +// Reference Type (C++/CLI) - entity.name.type.class.reference +ref class ref_class // "ref_class" is colored semantically +{ +}; +void ref_test() +{ + ref_class a; // "ref_class" is colored semantically +} + +// Static Member Field - variable.other.property.static +struct static_member_test +{ + static int static_member_instance; // "static_member_instance" is colored semantically + void foo() + { + static_member_instance = 2; // "static_member_instance" is colored semantically + } +}; + +// Static Member Function - entity.name.function.member.static +struct static_member_test +{ + static void foo() // "static_member_instance" is colored semantically + { + foo(); // "static_member_instance" is colored semantically + } +}; + +// Type - entity.name.type +class my_class +{ +}; +void my_class_test() +{ + my_class c; // "my_class" is colored semantically here +} + +// User-Defined Literal - Number - entity.name.operator.custom-literal.number +unsigned long long operator""_numeric(unsigned long long i) // "operator""_numeric" is colored semantically +{ + return 12345_numeric; // "12345_numeric" is colored semantically +} + +// User-Defined Literal - String - entity.name.operator.custom-literal.string +const char* operator""_str(const char* arr, size_t size) // "operator""_str" is colored semantically +{ + "ABC"_str; // ""ABC"_str" is colored semantically +} + +// User-Defined Literal - Raw - entity.name.operator.custom-literal +void operator"" _custom(const char* i) // "operator"" _custom" is colored semantically +{ + 0xABC_custom; // "0xABC_custom" is colored semantically +} + + +// Value Type (C++/CLI) - entity.name.type.class.value +value class value_class // "value_class" is colored semantically +{ +}; +void value_test() +{ + value_class a; // "value_class" is colored semantically +} diff --git a/Extension/test/scenarios/SingleRootProject/assets/testIdl.idl b/Extension/test/scenarios/SingleRootProject/assets/testIdl.idl new file mode 100644 index 0000000000..7c81bf9b2e --- /dev/null +++ b/Extension/test/scenarios/SingleRootProject/assets/testIdl.idl @@ -0,0 +1,12 @@ + +library MyTypeLibrary +{ + [ + uuid(5B98C2C0-CD7B-11d0-92DF-00A0C9138C45), + helpstring(myLibStr) + ] + coclass MyPackage + { + [default] interface IMyPackage; + }; +}; diff --git a/Extension/test/unitTests/ParsedEnvironmentFile.test.ts b/Extension/test/scenarios/SingleRootProject/tests/ParsedEnvironmentFile.test.ts similarity index 83% rename from Extension/test/unitTests/ParsedEnvironmentFile.test.ts rename to Extension/test/scenarios/SingleRootProject/tests/ParsedEnvironmentFile.test.ts index 24f477328a..8166289b55 100644 --- a/Extension/test/unitTests/ParsedEnvironmentFile.test.ts +++ b/Extension/test/scenarios/SingleRootProject/tests/ParsedEnvironmentFile.test.ts @@ -3,7 +3,7 @@ * See 'LICENSE' in the project root for license information. * ------------------------------------------------------------------------------------------ */ import * as assert from 'assert'; -import { Environment, ParsedEnvironmentFile } from '../../src/Debugger/ParsedEnvironmentFile'; +import { Environment, ParsedEnvironmentFile } from '../../../../src/Debugger/ParsedEnvironmentFile'; // Because the environment variable is set as an array, the index does not matter. function assertEnvironmentEqual(env: Environment[], name: string, value: string): void { @@ -21,8 +21,7 @@ function assertEnvironmentEqual(env: Environment[], name: string, value: string) suite("ParsedEnvironmentFile", () => { test("Add single variable", () => { const content: string = `MyName=VALUE`; - const fakeConfig: Environment[] = []; - const result: ParsedEnvironmentFile = ParsedEnvironmentFile.CreateFromContent(content, "TestEnvFileName", fakeConfig["env"]); + const result: ParsedEnvironmentFile = ParsedEnvironmentFile.CreateFromContent(content, "TestEnvFileName", []); assert(!result.Warning, `Failed to assert that Warning was empty: ${result.Warning}`); assertEnvironmentEqual(result.Env, "MyName", "VALUE"); @@ -30,8 +29,7 @@ suite("ParsedEnvironmentFile", () => { test("Handle quoted values", () => { const content: string = `MyName="VALUE"`; - const fakeConfig: Environment[] = []; - const result: ParsedEnvironmentFile = ParsedEnvironmentFile.CreateFromContent(content, "TestEnvFileName", fakeConfig["env"]); + const result: ParsedEnvironmentFile = ParsedEnvironmentFile.CreateFromContent(content, "TestEnvFileName", []); assert(!result.Warning, `Failed to assert that Warning was empty: ${result.Warning}`); assertEnvironmentEqual(result.Env, "MyName", "VALUE"); @@ -39,8 +37,7 @@ suite("ParsedEnvironmentFile", () => { test("Handle BOM", () => { const content: string = "\uFEFFMyName=VALUE"; - const fakeConfig: Environment[] = []; - const result: ParsedEnvironmentFile = ParsedEnvironmentFile.CreateFromContent(content, "TestEnvFileName", fakeConfig["env"]); + const result: ParsedEnvironmentFile = ParsedEnvironmentFile.CreateFromContent(content, "TestEnvFileName", []); assert(!result.Warning, `Failed to assert that Warning was empty: ${result.Warning}`); assertEnvironmentEqual(result.Env, "MyName", "VALUE"); @@ -52,8 +49,7 @@ MyName1=Value1 MyName2=Value2 `; - const fakeConfig: Environment[] = []; - const result: ParsedEnvironmentFile = ParsedEnvironmentFile.CreateFromContent(content, "TestEnvFileName", fakeConfig["env"]); + const result: ParsedEnvironmentFile = ParsedEnvironmentFile.CreateFromContent(content, "TestEnvFileName", []); assert(!result.Warning, `Failed to assert that Warning was empty: ${result.Warning}`); assertEnvironmentEqual(result.Env, "MyName1", "Value1"); @@ -84,8 +80,7 @@ MyName1=Value1 # This is a comment in the middle of the file MyName2=Value2 `; - const fakeConfig: Environment[] = []; - const result: ParsedEnvironmentFile = ParsedEnvironmentFile.CreateFromContent(content, "TestEnvFileName", fakeConfig["env"]); + const result: ParsedEnvironmentFile = ParsedEnvironmentFile.CreateFromContent(content, "TestEnvFileName", []); assert(!result.Warning, `Failed to assert that Warning was empty: ${result.Warning}`); assertEnvironmentEqual(result.Env, "MyName1", "Value1"); @@ -99,8 +94,7 @@ MyName1=Value1 MyName2=Value2 `; - const fakeConfig: Environment[] = []; - const result: ParsedEnvironmentFile = ParsedEnvironmentFile.CreateFromContent(content, "TestEnvFileName", fakeConfig["env"]); + const result: ParsedEnvironmentFile = ParsedEnvironmentFile.CreateFromContent(content, "TestEnvFileName", []); assert(result.Warning && result.Warning.startsWith("Ignoring non-parseable lines in envFile TestEnvFileName"), 'Checking if warning exists'); assertEnvironmentEqual(result.Env, "MyName1", "Value1"); diff --git a/Extension/test/scenarios/SingleRootProject/tests/common.test.ts b/Extension/test/scenarios/SingleRootProject/tests/common.test.ts new file mode 100644 index 0000000000..10032e7d8b --- /dev/null +++ b/Extension/test/scenarios/SingleRootProject/tests/common.test.ts @@ -0,0 +1,281 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ +import * as assert from "assert"; +import { suite } from 'mocha'; +import * as os from "os"; +import { delimiter } from 'path'; +import { escapeForSquiggles, normalizeArg, resolveVariables } from "../../../../src/common"; + +suite("resolveVariables", () => { + const success: string = "success"; + const home: string = os.homedir(); + + test("raw input", () => { + const input: string = "test"; + inputAndEnvironment(input, {}) + .shouldResolveTo(input); + }); + + test("raw input with tilde", () => { + inputAndEnvironment("~/test", {}) + .shouldResolveTo(`${home}/test`); + }); + + test("env input with tilde", () => { + inputAndEnvironment("${path}/test", { + path: home + }) + .shouldResolveTo(`${home}/test`); + }); + + test("solo env input resulting in array", () => { + inputAndEnvironment("${test}", { + test: ["foo", "bar"] + }) + .shouldResolveTo(`foo${delimiter}bar`); + }); + + test("solo env input with empty array env value", () => { + resolveVariablesWithInput("${empty}") + .withEnvironment({ + empty: [] + }) + .shouldResolveTo(""); + }); + + test("mixed raw and env input resulting in array", () => { + const input: string = "baz${test}"; + resolveVariablesWithInput(input) + .withEnvironment({ + test: ["foo", "bar"] + }) + .shouldResolveTo(input); + }); + + test("solo env input not in env config finds process env", () => { + const processKey: string = `cpptoolstests_${Date.now()}`; + const input: string = "foo${" + processKey + "}"; + let actual: string; + try { + process.env[processKey] = "bar"; + actual = resolveVariables(input, {}); + } finally { + delete process.env[processKey]; + } + assert.equal(actual, "foobar"); + }); + + test("env input", () => { + resolveVariablesWithInput("${test}") + .withEnvironment({ + "test": success + }) + .shouldResolveTo(success); + }); + + test("env input mixed with plain text", () => { + resolveVariablesWithInput("${test}bar") + .withEnvironment({ + "test": "foo" + }) + .shouldResolveTo("foobar"); + }); + + test("env input with two variables", () => { + resolveVariablesWithInput("f${a}${b}r") + .withEnvironment({ + a: "oo", + b: "ba" + }) + .shouldResolveTo("foobar"); + }); + + test("env input not in env", () => { + const input: string = "${test}"; + resolveVariablesWithInput(input) + .withEnvironment({}) + .shouldResolveTo(input); + }); + + test("env with macro inside environment definition", () => { + resolveVariablesWithInput("${arm6.include}") + .withEnvironment({ + "envRoot": "apps/tool/buildenv", + "arm6.include": "${envRoot}/arm6/include" + }) + .shouldResolveTo("apps/tool/buildenv/arm6/include"); + }); + + test("env nested with half open variable", () => { + resolveVariablesWithInput("${arm6.include}") + .withEnvironment({ + "envRoot": "apps/tool/buildenv", + "arm6.include": "${envRoot/arm6/include" + }) + .shouldResolveTo("${envRoot/arm6/include"); + }); + + test("env nested with half closed variable", () => { + resolveVariablesWithInput("${arm6.include}") + .withEnvironment({ + "envRoot": "apps/tool/buildenv", + "arm6.include": "envRoot}/arm6/include" + }) + .shouldResolveTo("envRoot}/arm6/include"); + }); + + test("env nested with a cycle", () => { + resolveVariablesWithInput("${a}") + .withEnvironment({ + "a": "${b}", + "b": "${c}", + "c": "${a}" + }) + .shouldResolveTo("${a}"); + }); + + test("env input with 1 level of nested variables anchored at end", () => { + resolveVariablesWithInput("${foo${test}}") + .withEnvironment({ + "foobar": success, + "test": "bar" + }) + .shouldResolveTo("${foo${test}}"); + }); + + test("env input with 1 level of nested variables anchored in the middle", () => { + resolveVariablesWithInput("${f${test}r}") + .withEnvironment({ + "foobar": success, + "test": "ooba" + }) + .shouldResolveTo("${f${test}r}"); + }); + + test("env input with 1 level of nested variable anchored at front", () => { + resolveVariablesWithInput("${${test}bar}") + .withEnvironment({ + "foobar": success, + "test": "foo" + }) + .shouldResolveTo("${${test}bar}"); + }); + + test("env input with 3 levels of nested variables", () => { + resolveVariablesWithInput("${foo${a${b${c}}}}") + .withEnvironment({ + "foobar": success, + "a1": "bar", + "b2": "1", + "c": "2" + }) + .shouldResolveTo("${foo${a${b${c}}}}"); + }); + + test("env input contains env", () => { + resolveVariablesWithInput("${envRoot}") + .shouldLookupSymbol("envRoot"); + }); + + test("env input contains config", () => { + resolveVariablesWithInput("${configRoot}") + .shouldLookupSymbol("configRoot"); + }); + + test("env input contains workspaceFolder", () => { + resolveVariablesWithInput("${workspaceFolderRoot}") + .shouldLookupSymbol("workspaceFolderRoot"); + }); + + test("input contains env.", () => { + resolveVariablesWithInput("${env.Root}") + .shouldLookupSymbol("Root"); + }); + + test("input contains env:", () => { + resolveVariablesWithInput("${env:Root}") + .shouldLookupSymbol("Root"); + }); + + test("escapeForSquiggles:", () => { + const testEscapeForSquigglesScenario: any = (input: string, expectedOutput: string) => { + const result: string = escapeForSquiggles(input); + if (result !== expectedOutput) { + throw new Error(`escapeForSquiggles failure: for \"${input}\", \"${result}\" !== \"${expectedOutput}\"`); + } + }; + + testEscapeForSquigglesScenario("\\", "\\\\"); // single backslash + testEscapeForSquigglesScenario("\\\"", "\\\""); // escaped quote + testEscapeForSquigglesScenario("\\\t", "\\\\\t"); // escaped non-quote + testEscapeForSquigglesScenario("\\\\\"", "\\\\\\\\\""); // escaped backslash, unescaped quote + testEscapeForSquigglesScenario("\\\\\t", "\\\\\\\\\t"); // escaped backslash, unescaped non-quote + testEscapeForSquigglesScenario("\\t", "\\\\t"); // escaped non-quote + testEscapeForSquigglesScenario("\\\\\\t", "\\\\\\\\\\\\t"); // escaped backslash, unescaped non-quote + testEscapeForSquigglesScenario("\"\"", "\"\""); // empty quoted string + testEscapeForSquigglesScenario("\"\\\\\"", "\"\\\\\\\\\""); // quoted string containing escaped backslash + }); + + test("normalizeArgs:", () => { + const testNormalizeArgsScenario: any = (input: string, expectedOutput: string) => { + const result: string = normalizeArg(input); + if (result !== expectedOutput) { + throw new Error(`normalizeArgs failure: for \"${input}\", \"${result}\" !== \"${expectedOutput}\"`); + } + }; + /* + this is how the args from tasks.json will be sent to the chilprocess.spawn: + "args":[ + "-DTEST1=TEST1 TEST1", // "-DTEST1=TEST1 TEST1" + "-DTEST2=\"TEST2 TEST2\"", // -DTEST2="TEST2 TEST2" + "-DTEST3=\\\"TEST3 TEST3\\\"", // "-DTEST3=\"TEST3 TEST3\"" + "-DTEST4=TEST4\\ TEST4", // "-DTEST4=TEST4 TEST4" + "-DTEST5='TEST5 TEST5'", // -DTEST5='TEST5 TEST5' + "-DTEST6=TEST6\\ TEST6 Test6", // "-DTEST6=TEST6 TEST6 Test6" + ] + */ + testNormalizeArgsScenario("-DTEST1=TEST1 TEST1", "\"-DTEST1=TEST1 TEST1\""); + testNormalizeArgsScenario("-DTEST2=\"TEST2 TEST2\"", "-DTEST2=\"TEST2 TEST2\""); + testNormalizeArgsScenario("-DTEST3=\\\"TEST3 TEST3\\\"", "\"-DTEST3=\\\"TEST3 TEST3\\\"\""); + if (process.platform.includes("win")) { + testNormalizeArgsScenario("-DTEST4=TEST4\\ TEST4", "\"-DTEST4=TEST4 TEST4\""); + testNormalizeArgsScenario("-DTEST5=\'TEST5 TEST5\'", "-DTEST5=\'TEST5 TEST5\'"); + } else { + testNormalizeArgsScenario("-DTEST4=TEST4\\ TEST4", "-DTEST4=TEST4\\ TEST4"); + testNormalizeArgsScenario("-DTEST5='TEST5 TEST5'", "-DTEST5='TEST5 TEST5'"); + } + testNormalizeArgsScenario("-DTEST6=TEST6\\ TEST6 Test6", "\"-DTEST6=TEST6 TEST6 Test6\""); + }); + + interface ResolveTestFlowEnvironment { + withEnvironment(additionalEnvironment: {[key: string]: string | string[]}): ResolveTestFlowAssert; + shouldLookupSymbol(key: string): void; + } + interface ResolveTestFlowAssert { + shouldResolveTo(x: string): void; + } + + function resolveVariablesWithInput(input: string): ResolveTestFlowEnvironment { + return { + withEnvironment: (additionalEnvironment: {[key: string]: string | string[]}) => inputAndEnvironment(input, additionalEnvironment), + shouldLookupSymbol: (symbol: string) => { + const environment: {[key: string]: string | string[]} = {}; + environment[symbol] = success; + return inputAndEnvironment(input, environment) + .shouldResolveTo(success); + } + }; + } + + function inputAndEnvironment(input: string, additionalEnvironment: {[key: string]: string | string[]}): ResolveTestFlowAssert { + return { + shouldResolveTo: (expected: string) => { + const actual: string = resolveVariables(input, additionalEnvironment); + const msg: string = `Expected ${expected}. Got ${actual} with input ${input} and environment ${JSON.stringify(additionalEnvironment)}.`; + assert.equal(actual, expected, msg); + } + }; + } +}); diff --git a/Extension/test/unitTests/expand.test.ts b/Extension/test/scenarios/SingleRootProject/tests/expand.test.ts similarity index 90% rename from Extension/test/unitTests/expand.test.ts rename to Extension/test/scenarios/SingleRootProject/tests/expand.test.ts index eccac69742..f0acdd4e6a 100644 --- a/Extension/test/unitTests/expand.test.ts +++ b/Extension/test/scenarios/SingleRootProject/tests/expand.test.ts @@ -3,9 +3,10 @@ * See 'LICENSE' in the project root for license information. * ------------------------------------------------------------------------------------------ */ import * as assert from "assert"; -import { expandAllStrings, ExpansionOptions } from "../../src/expand"; +import { describe, test } from "mocha"; +import { ExpansionOptions, expandAllStrings } from "../../../../src/expand"; -suite('Var expansion validation', () => { +describe('${Variable} Expansion', () => { test('Expand all strings', async () => { const input: object = { in1: "${test2}", diff --git a/Extension/test/unitTests/extension.test.ts b/Extension/test/scenarios/SingleRootProject/tests/extension.test.ts similarity index 98% rename from Extension/test/unitTests/extension.test.ts rename to Extension/test/scenarios/SingleRootProject/tests/extension.test.ts index 3418a6e156..62f06236a0 100644 --- a/Extension/test/unitTests/extension.test.ts +++ b/Extension/test/scenarios/SingleRootProject/tests/extension.test.ts @@ -4,9 +4,10 @@ * ------------------------------------------------------------------------------------------ */ import * as assert from 'assert'; +import { suite } from 'mocha'; import * as os from 'os'; -import { CimProcessParser, Process, PsProcessParser, WmicProcessParser } from '../../src/Debugger/nativeAttach'; -import { LinuxDistribution } from '../../src/linuxDistribution'; +import { CimProcessParser, Process, PsProcessParser, WmicProcessParser } from '../../../../src/Debugger/nativeAttach'; +import { LinuxDistribution } from '../../../../src/linuxDistribution'; suite("LinuxDistro Tests", () => { test("Parse valid os-release file", () => { @@ -115,7 +116,6 @@ suite("Pick Process Tests", () => { const process1: Process = parsedOutput[0]; const process2: Process = parsedOutput[1]; - const process3: Process = parsedOutput[2]; assert.equal(process1.commandLine, 'ScopedBookmarkAgent'); assert.equal(process1.name, 'ScopedBookmarkAgent'); diff --git a/Extension/test/unit/async.test.ts b/Extension/test/unit/async.test.ts new file mode 100644 index 0000000000..85a633d593 --- /dev/null +++ b/Extension/test/unit/async.test.ts @@ -0,0 +1,81 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +import { describe, it } from 'mocha'; +import { ok, strict, strictEqual } from 'node:assert'; +import { Factory } from '../../src/Utility/Async/factory'; +import { sleep } from '../../src/Utility/Async/sleep'; + +import { AnotherOne, AnotherThree, Something, SomethingElse } from './examples/someclass'; + +describe('AsyncConstructor', () => { + it('Create an instance of an async class', async () => { + const something = await new Something(100); + ok(something.hasBeenInitialized, 'The class should have been initialized'); + }); + + it('even works when there is no async init method in the class', async () => { + // the SomethingElse doesn't actually have an init() method, but it should still work. + const somethingElse = await new SomethingElse(); + ok(somethingElse.works, 'The class should have been initialized'); + }); + + it('init can be a promise that is created by the constructor instead of a method', async () => { + // this one doesn't have an init method, but does have an init field that is a promise. + const anotherOne = await new AnotherOne(); + ok(anotherOne.works, 'The class should have been initialized'); + }); + + it('Child class?', async () => { + // this one doesn't have an init method, but does have an init field that is a promise. + const three = await new AnotherThree(); + ok(three.works, 'The class should have been initialized'); + }); + + it('if the constructor throws it should still throw', async () => { + try { + await new Something(-1); + strict(false, 'should have thrown during constructor'); + } catch (e) { + strictEqual((e as Error).message, 'constructor throws on -1', 'The class should have thrown'); + } + }); + + it('if the init throws, it should still throw', async () => { + try { + await new Something(-2); + strict(false, 'should have thrown during init'); + } catch (e) { + strictEqual((e as Error).message, 'init throws on -2', 'The class should have thrown'); + } + }); +}); + +describe('AsyncFactory', () => { + it('Factory that creates a number', async () => { + const f = Factory(() => 1); + const result = await new f(); + strictEqual(result, 1, 'The factory should have returned 1'); + }); + + it('Factory that creates a function with an async initializer', async () => { + // a factory is a 'newable' class that can be created with the 'new' keyword, that returns a promise. + const f = Factory(() => { + const value = (() => 100) as any; + + value.init = async () => { + await sleep(1); + value.value = 200; + }; + + // eslint-disable-next-line @typescript-eslint/ban-types + return value as () => number; + }); + const fn = await new f(); + const result = fn(); + strictEqual(result, 100, 'The factory should have returned 100'); + strictEqual((fn as any).value, 200, 'The factory should have a member "value" that is 200 (shows init working)'); + }); +}); diff --git a/Extension/test/unit/asyncIterators.test.ts b/Extension/test/unit/asyncIterators.test.ts new file mode 100644 index 0000000000..80e8cfdca3 --- /dev/null +++ b/Extension/test/unit/asyncIterators.test.ts @@ -0,0 +1,48 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +/* eslint-disable @typescript-eslint/no-unused-vars */ +import { describe, it } from 'mocha'; +import { fail, ok, strictEqual } from 'node:assert'; +import { accumulator } from '../../src/Utility/Async/iterators'; + +describe('Async Iterators', () => { + it('Use the accumulator() for async iterators (empty, manual close)', async () => { + const result = accumulator(); + setTimeout(() => result.complete(), 5); + for await (const _each of result) { + fail('should not have gotten here'); + } + + ok(true, 'should have gotten here'); + + }); + + it('Use the accumulator() for async iterators (add some items)', async () => { + let total = 0; + let count = 0; + + // asyncOf takes any number of arguments, and flattens values, iterables, promises, and async iterables into a single async iterable. + // (good for testing) + + const result = accumulator(0).autoComplete(false); // create an iterable with a single item. + + result.add(1, 2, 3); // add more items + result.add(-10, 10); // add more items + + setTimeout(() => result.add(4, 5, 6), 5); // set a timeout to add more items again. + setTimeout(() => result.complete(), 11); // set a timeout to tell it you won't add more iterables. + + for await (const each of result) { + count++; + total += each; + } + + strictEqual(total, 21, 'The total should be 21'); + strictEqual(count, 8, 'The count should be 8'); + ok(true, 'should have gotten here'); + + }); +}); diff --git a/Extension/test/unit/commandLineParsing.test.ts b/Extension/test/unit/commandLineParsing.test.ts new file mode 100644 index 0000000000..746d7811f6 --- /dev/null +++ b/Extension/test/unit/commandLineParsing.test.ts @@ -0,0 +1,217 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +/* eslint-disable @typescript-eslint/no-unused-vars */ + +import { deepEqual, throws } from 'assert'; +import { describe } from 'mocha'; +import { extractArgs } from '../../src/Utility/Process/commandLine'; +import { is } from '../../src/Utility/System/guards'; +import { isWindows } from '../../src/constants'; +import { when } from '../common/internal'; + +// eslint-disable-next-line import/no-unassigned-import +require('source-map-support/register'); + +function marker() { + try { + throw new Error('Test Marker'); + } catch (E) { + if (is.error(E)){ + return E.stack?.split('\n').filter(each => each.includes('.ts') && each.includes('')).join('\n'); + } + } +} + +const fails: [ string | undefined, string, string?][] = [ + /** command substitution not supported */ + [undefined, "explicit ``", marker()], + [undefined, "$(echo hello)", marker()], + [undefined, "$( (echo hello) )", marker()], + [undefined, "$((echo hello);(echo there))", marker()], + [undefined, "`echo one two`", marker()], + [undefined, "$(echo ')')", marker()], + [undefined, "$(echo hello; echo)", marker()], + [undefined, "a$(echo b)c", marker()], + ["pepperoni", "${var%$(echo oni)}", marker()], + [undefined, "\"$(echo hello there)\"", marker()], + [undefined, "\"$(echo \"hello there\")\"", marker()], + ["1", "$(( $(echo 3)+$var ))", marker()], + [undefined, "\"$(echo \"*\")\"", marker()], + [ undefined, "\"a\n\n$(echo)b\"", marker()], + /* Things that should fail */ + [ undefined, "new\nline", marker()], + [ undefined, "pipe|symbol", marker()], + [ undefined, "&ersand", marker()], + [ undefined, "semi;colon", marker()], + [ undefined, "", marker()], + [ undefined, "(open-paren", marker()], + [ undefined, "close-paren)", marker()], + [ undefined, "{open-brace", marker()], + [ undefined, "close-brace}", marker()], + [ undefined, "$(ls)", marker()], + [ undefined, "${50+20))", marker()], + [ undefined, "${%%noparam]", marker()], + [ undefined, "${missing-brace", marker()], + [ undefined, "$(for i in)", marker()], + [ undefined, "$((2+))", marker()], + [ undefined, "`", marker()], + [ undefined, "$((010+4+))", marker()], + /* Test for CVE-2014-7817. We test 3 combinations of command + substitution inside an arithmetic expression to make sure that + no commands are executed and an error is returned. */ + [ undefined, "$((`echo 1`))", marker() ], + [ undefined, "$((1+`echo 1`))", marker() ], + [ undefined, "$((1+$((`echo 1`))))", marker() ], + + [ undefined, "`\\", marker() ], /* BZ 18042 */ + [ undefined, "${", marker() ], /* BZ 18043 */ + [ undefined, "L${a:", marker()], /* BZ 18043#c4 */ + [ undefined, "${1/0]", marker() ] /* BZ 18100 */ +]; + +const success: [string | undefined, string, string[], string?][] = [ + /* Simple word and field splitting */ + [ undefined, "one", [ "one" ], marker() ], + [ undefined, "one two", [ "one", "two" ], marker() ], + [ undefined, "one two three", [ "one", "two", "three" ], marker() ], + [ undefined, " \tfoo\t\tbar ", [ "foo", "bar" ], marker() ], + [ undefined, "red , white blue", [ "red", ",", "white", "blue" ], marker() ], + [ undefined, "one two three", [ "one", "two", "three" ], marker() ], + [ undefined, "one \"two three\"", [ "one", "two three" ], marker() ], + [ undefined, "one \"two three\"", [ "one", "two three" ], marker() ], + [ "two three", "one \"$var\"", [ "one", "two three" ], marker() ], + [ "two three", "one $var", [ "one", "two", "three" ], marker() ], + [ "two three", "one \"$var\"", [ "one", "two three" ], marker() ], + + /* Simple parameter expansion */ + [ "foo", "${var}", [ "foo" ], marker()], + [ "foo", "$var", [ "foo" ], marker()], + [ "foo", "\\\"$var\\\"", [ "\"foo\"" ], marker()], + [ "foo", "%$var%", [ "%foo%" ], marker()], + [ "foo", "-$var-", [ "-foo-" ], marker()], + + /* Simple quote removal */ + [ undefined, "\"quoted\"", [ "quoted" ], marker()], + [ "foo", "\"$var\"\"$var\"", [ "foofoo" ], marker()], + [ undefined, "'singly-quoted'", [ "singly-quoted" ], marker()], + [ undefined, "contin\\\nuation", [ "continuation" ], marker()], + [ undefined, "explicit ''", [ "explicit", "" ], marker()], + [ undefined, "explicit \"\"", [ "explicit", "" ], marker()], + + /* Simple arithmetic expansion */ + [ undefined, "$((1 + 1))", [ "2" ], marker() ], + [ undefined, "$((2-3))", [ "-1" ], marker() ], + [ undefined, "$((-1))", [ "-1" ], marker() ], + // [ undefined, "$[50+20]", [ "70" ], marker() ], + [ undefined, "$(((2+3)*(4+5)))", [ "45" ], marker() ], + [ undefined, "$((010))", [ "8" ], marker() ], + [ undefined, "$((0x10))", [ "16" ], marker() ], + [ undefined, "$((010+0x10))", [ "24" ], marker() ], + [ undefined, "$((-010+0x10))", [ "8" ], marker() ], + [ undefined, "$((-0x10+010))", [ "-8" ], marker() ], + + /* Advanced parameter expansion */ + [ undefined, "${var:-bar}", [ "bar" ], marker() ], + [ undefined, "${var-bar}", [ "bar" ], marker() ], + [ "", "${var:-bar}", [ "bar" ], marker() ], + [ "foo", "${var:-bar}", [ "foo" ], marker() ], + [ "", "${var-bar}", [ '' ], marker() ], + [ undefined, "${var:=bar}", [ "bar" ], marker() ], + [ undefined, "${var=bar}", [ "bar" ], marker() ], + [ "", "${var:=bar}", [ "bar" ], marker() ], + [ "foo", "${var:=bar}", [ "foo" ], marker() ], + [ "", "${var=bar}", [ '' ], marker() ], + [ "foo", "${var:?bar}", [ "foo" ], marker() ], + [ undefined, "${var:+bar}", [ '' ], marker() ], + [ undefined, "${var+bar}", [ '' ], marker() ], + [ "", "${var:+bar}", [ '' ], marker() ], + [ "foo", "${var:+bar}", [ "bar" ], marker() ], + [ "", "${var+bar}", [ "bar" ], marker() ], + [ "12345", "${#var}", [ "5" ], marker() ], + [ undefined, "${var:-']'}", [ "]" ], marker() ], + [ undefined, "${var-}", [ '' ], marker() ], + + [ "pizza", "${var#${var}}", [ '' ], marker()], + + [ "6pack", "${var#$((6))}", [ "pack" ], marker()], + [ "b*witched", "${var##b*}", [ '' ], marker()], + [ "b*witched", "${var##\"b*\"}", [ "witched" ], marker()], + [ "banana", "${var%na*}", [ "bana" ], marker()], + [ "banana", "${var%%na*}", [ "ba" ], marker()], + [ "borabora-island", "${var#*bora}", [ "bora-island" ], marker()], + [ "borabora-island", "${var##*bora}", [ "-island" ], marker()], + [ "coconut", "${var##\\*co}", [ "coconut" ], marker()], + [ "100%", "${var%0%}", [ "10" ], marker()], + + /* Nested constructs */ + [ "one two", "$var", [ "one", "two" ], marker()], + [ "one two three", "$var", [ "one", "two", "three" ], marker()], + [ " \tfoo\t\tbar ", "$var", [ "foo", "bar" ], marker()], + [ " red , white blue", "$var", [ "red", ',', "white", "blue" ], marker()], + [ " red , white blue", "\"$var\"", [ " red , white blue" ], marker()], + + [ undefined, "${var=one two} \"$var\"", [ "one", "two", "one two" ], marker()], + + [ "foo", "*$var*", [ "*foo*" ], marker()], + + /* Other things that should succeed */ + [ undefined, "\\*\"|&;<>\"\\(\\)\\[\\]", [ "*|&;<>()[]" ], marker()], + [ undefined, "$var", [ '' ], marker()], + [ undefined, "\"\\n\"", [ "\\n" ], marker()], + [ undefined, "", [ '' ], marker()], + + [ undefined, "$var", [ '' ], marker()], + [ undefined, "$9", ['' ], marker()], + + [ undefined, '', [ '' ], marker()] +]; +let stop = false; +describe('Command Lines', () => { + for (const [variable, cmdline, expected, err ] of success) { + if (stop) { + break; + } + when(!isWindows).it(`[Posix] should parse ${JSON.stringify(cmdline)}`, () => { + if (stop) { + return; + } + + if (variable !== undefined) { + process.env['var'] = variable; + } else { + delete process.env['var']; + } + stop = true; + + const result = extractArgs(cmdline); + deepEqual(result, expected, `expected «${expected.join(',')}» got «${result.join(',')}» at ${err}`); + stop = false; + }); + } + + for (const [variable, cmdline, err ] of fails) { + if (stop) { + break; + } + when(!isWindows).it(`[Posix] should not parse ${JSON.stringify(cmdline)}`, () => { + if (stop) { + return; + } + + if (variable !== undefined) { + process.env['var'] = variable; + } else { + delete process.env['var']; + } + stop = true; + + let v: any = []; + throws(() => { v = extractArgs(cmdline);}, `expected error at ${err} - got «${v}»`); + stop = false; + }); + } +}); diff --git a/Extension/test/unit/eventing.test.ts b/Extension/test/unit/eventing.test.ts new file mode 100644 index 0000000000..a3502bb714 --- /dev/null +++ b/Extension/test/unit/eventing.test.ts @@ -0,0 +1,254 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +/* eslint-disable @typescript-eslint/no-unused-vars */ + +import { ok, strictEqual } from 'assert'; +import { beforeEach, describe, it } from 'mocha'; +import { Async } from '../../src/Utility/Async/constructor'; +import { sleep } from '../../src/Utility/Async/sleep'; +import { Descriptors } from '../../src/Utility/Eventing/descriptor'; +import { notify, notifyNow, reset, subscribe } from '../../src/Utility/Eventing/dispatcher'; +import { Emitter } from '../../src/Utility/Eventing/emitter'; +import { Cancelled, Continue } from '../../src/Utility/Eventing/interfaces'; +import { is } from '../../src/Utility/System/guards'; + +export class SomeBase extends Emitter { + +} + +class Something extends SomeBase { + constructor() { + super(); + this.descriptors.add('server', 'mysrv'); + } + + // emitter declarations + readonly initialize = this.newEvent('initialize'); + readonly bump = this.newEvent('bump'); + + async init() { + console.debug('before initialize'); + // tell them we are initializing + if (is.cancelled(await this.initialize())) { + // a handler has cancelled this event. we should stop + console.debug('cancelled?'); + this.wasCancelled = true; + return; + } + this.initWasSuccessful = true; + console.debug('after initialize'); + } + wasCancelled: boolean = false; + initWasSuccessful: boolean = false; + initHandlerRan: boolean = false; + + // event handler for the init event for this instance only + async 'this initialize'() { + this.initHandlerRan = true; + console.debug('init handler that is bound to the instance'); + + return Cancelled; + } +} + +// make an async constructor for the Something class +// eslint-disable-next-line @typescript-eslint/naming-convention +const AsyncSomething = Async(Something); + +describe('Event Emitters', () => { + + beforeEach(() => { + reset(); + // uncomment the following line to show debug messages in the console. + // void on('debug', async (event: EventData) => { console.debug(event.text); }); + }); + + it('try self-bound handlers', async () => { + const something = new Something(); + + // subscribe the object to its own events + subscribe(something); + + // do something that will trigger the event + await something.init(); + + ok(something.initHandlerRan, 'The init handler should have cancelled the event'); + }); + + it('try object handlers', async () => { + const something = new Something(); + + let count = 0; + + const subscriber = { + 'something/initialize': () => { + console.debug('in here !'); + count++; + return Continue; + } + }; + + subscribe(subscriber, { bindAll: true }); + + await something.init(); + strictEqual(count, 1, 'The init handler should have increased count by 1'); + + // create another, that wasn't existing before the subscription + const something2 = new Something(); + await something2.init(); + strictEqual(count, 2, 'The init handler should have increased count by 1 again'); + + }); + + it('ensure that `this` modifiers work correctly', async () => { + let countThisInit = 0; + let countAnyInit = 0; + + const s1 = new Something(); + const s2 = new Something(); + + const subscriber = { + // should only get called for events on the object it is bound to + 'this initialize': () => { + console.debug('`this init` called'); + countThisInit++; + }, + + // should get called for all events named 'init' + 'initialize': () => { + console.debug('`init` called'); + countAnyInit++; + } + }; + + // subscribe the handlers to events + subscribe(subscriber, { bindAll: true, eventSource: s1 }); + + await s1.init(); + await s2.init(); + + strictEqual(countThisInit, 1, 'The `this` init handler should only get called on one of the instances'); + strictEqual(countAnyInit, 2, 'The non-`this` init handler should get called for all instances'); + + }); + + it('show that `on` automatically assumes `this`', async () => { + let countThisInit = 0; + + const s1 = new Something(); + const s2 = new Something(); + + // subscribe the handlers to events + s1.on('initialize', () => { + console.debug('`this init` called'); + countThisInit++; + }); + + await s1.init(); + await s2.init(); + + strictEqual(countThisInit, 1, 'The `this` init handler should only get called on one of the instances'); + }); + + it('ensure that cancellation works correctly', async () => { + const s1 = new Something(); + let count = 0; + const subscriber = { + // should only get called for events on the object it is bound to + 'this initialize': () => { + console.debug('`this init` called, cancelling'); + return Cancelled; + }, + 'this bump': () => { + console.debug(`bump called: ${++count}`); + } + }; + + // subscribe the handlers to events + subscribe(subscriber, { bindAll: true, eventSource: s1 }); + await s1.init(); + await s1.bump(); + + s1.removeAllListeners(); + await s1.bump(); + strictEqual(count, 1, 'The bump handler should have been called once'); + + strictEqual(s1.wasCancelled, true, 'The init event should have been cancelled'); + }); + + it('Use wildcard for event name', async () => { + const something = new Something(); + + let triggered = false; + + subscribe({ + '*/server[/mysrv/g]': () => { + triggered = true; + } + }, { bindAll: true }); + + await something.init(); + ok(triggered, 'The init handler should have been triggered event'); + }); + + it('Use eventing framework with async constructors', async () => { + let worked = false; + const subscriber = { + 'something/initialize': () => { + console.debug('responding to initialize event on something!'); + worked = true; + return Continue; + } + }; + + // subscribe to events before the object is created + subscribe(subscriber, { bindAll: true }); + + // create the object asynchronously, which will trigger the event during init() + const something = await new AsyncSomething(); + ok(something.initWasSuccessful, 'The init should have been called automatically'); + + ok(worked, 'worked should be true, because the event should have been triggered by the async constructor'); + }); + + it('Notifiers don\'t return stuff', async () => { + let count = 0; + subscribe({ + 'note': () => { + count++; + } + }, { bindAll: true }); + + notifyNow('note', Descriptors.none, 'hi there'); + notifyNow('note', Descriptors.none, 'hi there'); + notifyNow('note', Descriptors.none, 'hi there'); + strictEqual(count, 3, 'count should be 3 -- notify now won\'t have to go async for any of this so far.'); + + notify('note', Descriptors.none, 'hi there'); + notify('note', Descriptors.none, 'hi there'); + notify('note', Descriptors.none, 'hi there'); + notify('note', Descriptors.none, 'hi there'); + notify('note', Descriptors.none, 'hi there'); + notify('note', Descriptors.none, 'hi there'); + + console.log(count); + await sleep(1); // allow the async notifiers to catch up. + strictEqual(count, 9, 'count should be 9'); + + }); + + it('works with source code handlers', async () => { + await subscribe({ + 'note': 'console.log(\'hi there\');' + }, { bindAll: true, folder: 'C:/work/2022/getting-started/STMicroelectronics/B-L4S5I-IOT01A' }); + + notifyNow('note', Descriptors.none, 'note'); + notifyNow('note', Descriptors.none, 'note'); + notifyNow('note', Descriptors.none, 'note'); + + }); + +}); diff --git a/Extension/test/internalUnitTests/example.test.ts b/Extension/test/unit/example.test.ts similarity index 100% rename from Extension/test/internalUnitTests/example.test.ts rename to Extension/test/unit/example.test.ts diff --git a/Extension/test/unit/examples/someclass.ts b/Extension/test/unit/examples/someclass.ts new file mode 100644 index 0000000000..69ef091a9f --- /dev/null +++ b/Extension/test/unit/examples/someclass.ts @@ -0,0 +1,63 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +import { Async } from '../../../src/Utility/Async/constructor'; +import { sleep } from '../../../src/Utility/Async/sleep'; + +/* eslint-disable @typescript-eslint/naming-convention */ +export const Something = Async(class Something { + hasBeenInitialized: boolean = false; + constructor(public num: number) { + if (num === -1) { + throw new Error('constructor throws on -1'); + } + } + + async init(_num: number): Promise { + if (this.num === -2) { + throw new Error('init throws on -2'); + } + // ensure that this is delayed by 100ms + await sleep(100); + + this.hasBeenInitialized = true; + return this; + } + + comment() { + console.debug(`Has this been initialized: ${this.hasBeenInitialized}`); + } +}); + +export const SomethingElse = Async(class SomethingElse { + works = true; +}); + +export const AnotherOne = Async(class AnotherOne { + init: Promise; + works = false; + constructor() { + this.init = sleep(1).then(() => { this.works = true; }); + } +}); + +export const AnotherTwo = Async(class AnotherTwo { + async init() { + await sleep(1); + this.works = true; + } + works = false; + constructor() { + + } +}); + +export const AnotherThree = Async(class AnotherThree extends AnotherTwo.class { + override async init() { + console.log(`before calling super.init, works == ${this.works}`); + await super.init(); + console.log(`after calling super.init, works == ${this.works}`); + } +}); diff --git a/Extension/test/internalUnitTests/manualPromise.test.ts b/Extension/test/unit/manualPromise.test.ts similarity index 100% rename from Extension/test/internalUnitTests/manualPromise.test.ts rename to Extension/test/unit/manualPromise.test.ts diff --git a/Extension/test/unit/parser.test.ts b/Extension/test/unit/parser.test.ts new file mode 100644 index 0000000000..35a7d8438d --- /dev/null +++ b/Extension/test/unit/parser.test.ts @@ -0,0 +1,107 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +import { ok, strictEqual } from 'assert'; +import { describe, it } from 'mocha'; +import { parse } from '../../src/Utility/Eventing/eventParser'; + +const tests = [ + 'someEvent[a == 100]', + 'someEvent[a == 100 && b == 200]', + 'someEvent[a == 100 && b == 200 && c == 300]', + 'someEvent[/text-here/g]', + 'someEvent[/over.here/g && a == 100]', + 'someEvent[a === 100 && /text-here/g]', + 'someEvent/something[name !== "bob"]', + 'someEvent/something[name !== "bob"]/somethingElse[happy]', + 'someEvent/somethingElse[!sad && /hello.world/g]', + 'someEvent/somethingElse[!sad && /(hello).world/g]' +]; + +describe('Event Handler/Parser', () => { + it('parses events, successful filter matches.', async () => { + const parsed = tests.map(each => parse(each, undefined)[2]); + + console.log(`Generated filter ${tests.length} functions :`); + + const eventData = { a: 100, b: 200, c: 300 }; + const someEventText = ['there is text-here', 'and some over here too']; + + const somethingData = { name: 'contoso' }; + const somethingText = [] as string[]; + + const somethingElseData = { happy: true, sad: false, color: 'red', value: 123 }; + const somethingElseText = ['hello world']; + + for (const filters of parsed) { + const captures = [] as string[]; + for (const [name, filter] of filters) { + + if (filter === true) { + continue; + } + + switch (name) { + case 'someEvent': + ok(filter(eventData, someEventText, captures), `filter '${filter.toString()}' should return true`); + continue; + + case 'something': + ok(filter(somethingData, somethingText, captures), `filter '${filter.toString()}' should return true`); + continue; + + case 'somethingElse': + ok(filter(somethingElseData, somethingElseText, captures), `filter '${filter.toString()}' should return true`); + + // on the one with 'sad', check to see we get back some filter capture data + if (filter.toString().includes('sad')) { + strictEqual(captures[0], 'hello world', `capture[0] from filter '${filter.toString()}' should be \'hello world\'`); + } + continue; + } + } + } + }); + + it('parses events, fails filter matches.', async () => { + const parsed = tests.map(each => parse(each, undefined)[2]); + + console.log(`Generated filter ${tests.length} functions :`); + + const eventData = { a: 101, b: 200, c: 300 }; + const someEvent = ['there is not text', 'and some not here too']; + + const something = [] as string[]; + const somethingData = { name: 'bob' }; + + const somethingElse = ['helloworld']; + const somethingElseData = { happy: false, sad: false, color: 'red', value: 123 }; + + for (const filters of parsed) { + const captures = [] as string[]; + for (const [name, filter] of filters) { + if (filter === true) { + continue; + } + switch (name) { + case 'someEvent': + ok(!filter(eventData, someEvent, captures), `filter '${filter.toString()}' should return false`); + continue; + + case 'something': + ok(!filter(somethingData, something, captures), `filter '${filter.toString()}' should return false`); + continue; + + case 'somethingElse': + ok(!filter(somethingElseData, somethingElse, captures), `filter '${filter.toString()}' should return false`); + strictEqual(captures.length, 0, `capture[0] from filter '${filter.toString()}' should be empty`); + continue; + } + + } + } + + }); +}); diff --git a/Extension/test/unit/process.test.ts b/Extension/test/unit/process.test.ts new file mode 100644 index 0000000000..ad3e442404 --- /dev/null +++ b/Extension/test/unit/process.test.ts @@ -0,0 +1,97 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +import { fail, notStrictEqual, ok, strictEqual } from 'assert'; +import { describe, it } from 'mocha'; +import { Descriptors } from '../../src/Utility/Eventing/descriptor'; +import { notifyNow } from '../../src/Utility/Eventing/dispatcher'; +import { EventData } from '../../src/Utility/Eventing/interfaces'; +import { Command, Program } from '../../src/Utility/Process/program'; +import { isWindows } from '../../src/constants'; + +describe('Program Automation', () => { + if (isWindows) { + it('can run a program without output [cmd.exe /c rem]', async () => { + + const echo = await new Program('c:/windows/system32/cmd.exe', '/c', 'rem'); + const p = await echo(); + + await p.exitCode; + + strictEqual(p.all().join(), '', 'should not have any text output'); + + }); + + it('can run a command without output [cmd.exe /c rem]', async () => { + console.log("before cmd"); + const echo = await new Command('c:/windows/system32/cmd.exe', '/c', 'rem'); + const p = await echo(); + console.log("before iter"); + for await (const line of p.stdio) { + console.log(line); + fail('should not have any text output'); + } + console.log('hmm that worked'); + ok(true, 'should not have any text output'); + + }); + + it('can run a program [cmd.exe /c echo hello]', async () => { + + const echo = await new Program('c:/windows/system32/cmd.exe', '/c', 'echo'); + const p = await echo('hello'); + + await p.exitCode; + + strictEqual(p.all()[0], 'hello', 'echo should echo the text we sent it'); + + const echo2 = await new Program(echo, 'with', 'some', 'text'); + const p2 = await echo2('there'); + await p2.exitCode; + + strictEqual(p2.all()[0], 'with some text there', 'echo should echo the text we sent it'); + }); + + it('supports events on the console stream', async () => { + + let count = 0; + + const echo = await new Program('c:/windows/system32/cmd.exe', '/c', 'echo', { + on: { + 'this stdio/read': async (event: EventData) => { + if (event.text === 'sample-text') { + count++; + } + notStrictEqual(event.text, 'should-not-see', 'should not have seen this text'); + } + } + }); + + const p = await echo('sample-text'); + + // send an arbitrary console event, this should not show up with 'this' set in the handler above. + notifyNow('read', new Descriptors(undefined, { console: '' }), 'should-not-see'); + + await p.exitCode; + + strictEqual(count, 1, 'should have seen the text we tried to echo'); + }); + } + it('runs a node command, filter the output', async () => { + + // create a command that runs node from this process + const node = await new Command(process.execPath); + + // run the command with the --version argument + const out = (await node('--version')).stdio.filter(/v(\d+\.\d+\.\d+)/g); + + // verify that we got what we expect + strictEqual(out.length, 1, 'should have found the version number'); + strictEqual(out[0], process.versions.node, 'should have found the version number'); + + console.log(out); + + }); +}); diff --git a/Extension/test/internalUnitTests/signals.test.ts b/Extension/test/unit/signals.test.ts similarity index 100% rename from Extension/test/internalUnitTests/signals.test.ts rename to Extension/test/unit/signals.test.ts diff --git a/Extension/test/unit/typeinfo.test.ts b/Extension/test/unit/typeinfo.test.ts new file mode 100644 index 0000000000..b6a46272c2 --- /dev/null +++ b/Extension/test/unit/typeinfo.test.ts @@ -0,0 +1,122 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ + +import { describe, it } from 'mocha'; +import { ok, strictEqual } from 'node:assert'; +import { Async } from '../../src/Utility/Async/constructor'; +import { is } from '../../src/Utility/System/guards'; +import { hierarchy, typeOf } from '../../src/Utility/System/info'; +import { verbose } from '../../src/Utility/Text/streams'; +import { AnotherThree } from './examples/someclass'; + +class Foo { + +} + +class Bar extends Foo { + +} + +class Baz extends Async(class Baz { + +}) +{ + +} + +class Buzz extends Async(class Buzz extends Baz.class { + +}) +{ + +} + +function foo() { + +} + +describe('Type Information', () => { + it('identify class of Async() type ', () => { + console.log(hierarchy(AnotherThree).join('::')); + }); + + it('is not failing subtest', () => { + ok(true, 'looks ok'); + }); + + it('Show the names of what typeOf returns', async () => { + verbose(`Foo: '${typeOf(Foo)}'`); + verbose(`new Foo(): '${typeOf(new Foo())}'`); + verbose(`Bar: '${typeOf(Bar)}'`); + verbose(`new Bar(): '${typeOf(new Bar())}'`); + verbose(`Baz: '${typeOf(Baz)}'`); + verbose(`new Baz(): '${typeOf(new Baz())}'`); + verbose(`await new Baz(): '${typeOf(await new Baz())}'`); + verbose(`Buzz: '${typeOf(Buzz)}'`); + verbose(`new Buzz(): '${typeOf(new Buzz())}'`); + verbose(`await new Buzz(): '${typeOf(await new Buzz())}'`); + verbose(`Date: '${typeOf(Date)}'`); + verbose(`new Date(): '${typeOf(new Date())}'`); + verbose(`foo: '${typeOf(foo)}'`); + verbose(`function(): '${typeOf(function () { })}'`); + verbose(`()=>{}: '${typeOf(() => { })}'`); + verbose(`true: '${typeOf(true)}'`); + verbose(`false: '${typeOf(false)}'`); + verbose(`1: '${typeOf(1)}'`); + verbose(`'': '${typeOf('')}'`); + verbose(`[]: '${typeOf([])}'`); + verbose(`{}: '${typeOf({})}'`); + verbose(`null: '${typeOf(null)}'`); + verbose(`undefined: '${typeOf(undefined)}'`); + verbose(`NaN: '${typeOf(NaN)}'`); + }); + + it('can get the typeof as a string', async () => { + strictEqual(typeOf(Foo), 'class Foo', 'Should return class Foo'); + strictEqual(typeOf(new Foo()), 'Foo', 'Should return Foo'); + strictEqual(typeOf(Bar), 'class Bar', 'Should return class Bar'); + strictEqual(typeOf(new Bar()), 'Bar', 'Should return Bar'); + strictEqual(typeOf(Baz), 'class Baz', 'Should return class Baz'); + strictEqual(typeOf(Buzz), 'class Buzz', 'Should return class Buzz'); + strictEqual(typeOf(await new Baz()), 'Baz', 'Should return Baz'); + strictEqual(typeOf(new Baz()), 'Promise', 'Should return that it is a Promise to a Baz'); + strictEqual(typeOf(Date), 'class Date', 'Should return class Date'); + strictEqual(typeOf(new Date()), 'Date', 'Should return Date'); + strictEqual(typeOf(foo), 'function', 'Should return function'); + strictEqual(typeOf(function () { }), 'function', 'Should return function'); + strictEqual(typeOf(() => { }), 'function', 'Should return function'); + strictEqual(typeOf(true), 'boolean', 'Should return boolean'); + strictEqual(typeOf(false), 'boolean', 'Should return boolean'); + strictEqual(typeOf(1), 'number', 'Should return number'); + strictEqual(typeOf(''), 'string', 'Should return string'); + strictEqual(typeOf([]), 'Array', 'Should return Array'); + strictEqual(typeOf({}), 'Object', 'Should return Object'); + strictEqual(typeOf(null), 'null', 'Should return null'); + strictEqual(typeOf(undefined), 'undefined', 'Should return undefined'); + strictEqual(typeOf(NaN), 'NaN', 'Should return NaN'); + }); + + it('knows what a constructor is', () => { + ok(is.Constructor(Foo), 'Foo is a constructor'); + ok(is.Constructor(Bar), 'Bar is a constructor'); + ok(is.Constructor(Baz), 'Baz is a constructor'); + ok(is.Constructor(Buzz), 'Buzz is a constructor'); + ok(is.Constructor(Date), 'Built in type is a constructor'); + ok(is.Constructor(Boolean), 'Built in type is a constructor'); + ok(!is.Constructor(foo), 'foo is not a constructor'); + ok(!is.Constructor(function () { }), 'not a constructor'); + ok(!is.Constructor(() => { }), 'arrow function not a constructor'); + + ok(!is.asyncConstructor(Foo), 'Foo is an async constructor'); + ok(!is.asyncConstructor(Bar), 'Bar is an async constructor'); + ok(is.asyncConstructor(Baz), 'Baz is an async constructor'); + ok(is.asyncConstructor(Buzz), 'Buzz is an async constructor'); + ok(!is.asyncConstructor(foo), 'foo is not an async constructor'); + ok(!is.asyncConstructor(foo), 'foo is not an async constructor'); + ok(!is.asyncConstructor(function () { }), 'not an async constructor'); + ok(!is.asyncConstructor(() => { }), 'arrow function not an async constructor'); + }); + +}); diff --git a/Extension/test/unitTests/common.test.ts b/Extension/test/unitTests/common.test.ts deleted file mode 100644 index 6f200adbce..0000000000 --- a/Extension/test/unitTests/common.test.ts +++ /dev/null @@ -1,281 +0,0 @@ -/* -------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All Rights Reserved. - * See 'LICENSE' in the project root for license information. - * ------------------------------------------------------------------------------------------ */ -import * as assert from "assert"; -import * as os from "os"; -import { envDelimiter, escapeForSquiggles, normalizeArg, resolveVariables } from "../../src/common"; - -suite("Common Utility validation", () => { - suite("resolveVariables", () => { - const success: string = "success"; - const home: string = os.homedir(); - - test("raw input", () => { - const input: string = "test"; - inputAndEnvironment(input, {}) - .shouldResolveTo(input); - }); - - test("raw input with tilde", () => { - inputAndEnvironment("~/test", {}) - .shouldResolveTo(`${home}/test`); - }); - - test("env input with tilde", () => { - inputAndEnvironment("${path}/test", { - path: home - }) - .shouldResolveTo(`${home}/test`); - }); - - test("solo env input resulting in array", () => { - inputAndEnvironment("${test}", { - test: ["foo", "bar"] - }) - .shouldResolveTo(`foo${envDelimiter}bar`); - }); - - test("solo env input with empty array env value", () => { - resolveVariablesWithInput("${empty}") - .withEnvironment({ - empty: [] - }) - .shouldResolveTo(""); - }); - - test("mixed raw and env input resulting in array", () => { - const input: string = "baz${test}"; - resolveVariablesWithInput(input) - .withEnvironment({ - test: ["foo", "bar"] - }) - .shouldResolveTo(input); - }); - - test("solo env input not in env config finds process env", () => { - const processKey: string = `cpptoolstests_${Date.now()}`; - const input: string = "foo${" + processKey + "}"; - let actual: string; - try { - process.env[processKey] = "bar"; - actual = resolveVariables(input, {}); - } finally { - delete process.env[processKey]; - } - assert.equal(actual, "foobar"); - }); - - test("env input", () => { - resolveVariablesWithInput("${test}") - .withEnvironment({ - "test": success - }) - .shouldResolveTo(success); - }); - - test("env input mixed with plain text", () => { - resolveVariablesWithInput("${test}bar") - .withEnvironment({ - "test": "foo" - }) - .shouldResolveTo("foobar"); - }); - - test("env input with two variables", () => { - resolveVariablesWithInput("f${a}${b}r") - .withEnvironment({ - a: "oo", - b: "ba" - }) - .shouldResolveTo("foobar"); - }); - - test("env input not in env", () => { - const input: string = "${test}"; - resolveVariablesWithInput(input) - .withEnvironment({}) - .shouldResolveTo(input); - }); - - test("env with macro inside environment definition", () => { - resolveVariablesWithInput("${arm6.include}") - .withEnvironment({ - "envRoot": "apps/tool/buildenv", - "arm6.include": "${envRoot}/arm6/include" - }) - .shouldResolveTo("apps/tool/buildenv/arm6/include"); - }); - - test("env nested with half open variable", () => { - resolveVariablesWithInput("${arm6.include}") - .withEnvironment({ - "envRoot": "apps/tool/buildenv", - "arm6.include": "${envRoot/arm6/include" - }) - .shouldResolveTo("${envRoot/arm6/include"); - }); - - test("env nested with half closed variable", () => { - resolveVariablesWithInput("${arm6.include}") - .withEnvironment({ - "envRoot": "apps/tool/buildenv", - "arm6.include": "envRoot}/arm6/include" - }) - .shouldResolveTo("envRoot}/arm6/include"); - }); - - test("env nested with a cycle", () => { - resolveVariablesWithInput("${a}") - .withEnvironment({ - "a": "${b}", - "b": "${c}", - "c": "${a}" - }) - .shouldResolveTo("${a}"); - }); - - test("env input with 1 level of nested variables anchored at end", () => { - resolveVariablesWithInput("${foo${test}}") - .withEnvironment({ - "foobar": success, - "test": "bar" - }) - .shouldResolveTo("${foo${test}}"); - }); - - test("env input with 1 level of nested variables anchored in the middle", () => { - resolveVariablesWithInput("${f${test}r}") - .withEnvironment({ - "foobar": success, - "test": "ooba" - }) - .shouldResolveTo("${f${test}r}"); - }); - - test("env input with 1 level of nested variable anchored at front", () => { - resolveVariablesWithInput("${${test}bar}") - .withEnvironment({ - "foobar": success, - "test": "foo" - }) - .shouldResolveTo("${${test}bar}"); - }); - - test("env input with 3 levels of nested variables", () => { - resolveVariablesWithInput("${foo${a${b${c}}}}") - .withEnvironment({ - "foobar": success, - "a1": "bar", - "b2": "1", - "c": "2" - }) - .shouldResolveTo("${foo${a${b${c}}}}"); - }); - - test("env input contains env", () => { - resolveVariablesWithInput("${envRoot}") - .shouldLookupSymbol("envRoot"); - }); - - test("env input contains config", () => { - resolveVariablesWithInput("${configRoot}") - .shouldLookupSymbol("configRoot"); - }); - - test("env input contains workspaceFolder", () => { - resolveVariablesWithInput("${workspaceFolderRoot}") - .shouldLookupSymbol("workspaceFolderRoot"); - }); - - test("input contains env.", () => { - resolveVariablesWithInput("${env.Root}") - .shouldLookupSymbol("Root"); - }); - - test("input contains env:", () => { - resolveVariablesWithInput("${env:Root}") - .shouldLookupSymbol("Root"); - }); - - test("escapeForSquiggles:", () => { - const testEscapeForSquigglesScenario: any = (input: string, expectedOutput: string) => { - const result: string = escapeForSquiggles(input); - if (result !== expectedOutput) { - throw new Error(`escapeForSquiggles failure: for \"${input}\", \"${result}\" !== \"${expectedOutput}\"`); - } - }; - - testEscapeForSquigglesScenario("\\", "\\\\"); // single backslash - testEscapeForSquigglesScenario("\\\"", "\\\""); // escaped quote - testEscapeForSquigglesScenario("\\\t", "\\\\\t"); // escaped non-quote - testEscapeForSquigglesScenario("\\\\\"", "\\\\\\\\\""); // escaped backslash, unescaped quote - testEscapeForSquigglesScenario("\\\\\t", "\\\\\\\\\t"); // escaped backslash, unescaped non-quote - testEscapeForSquigglesScenario("\\t", "\\\\t"); // escaped non-quote - testEscapeForSquigglesScenario("\\\\\\t", "\\\\\\\\\\\\t"); // escaped backslash, unescaped non-quote - testEscapeForSquigglesScenario("\"\"", "\"\""); // empty quoted string - testEscapeForSquigglesScenario("\"\\\\\"", "\"\\\\\\\\\""); // quoted string containing escaped backslash - }); - - test("normalizeArgs:", () => { - const testNormalizeArgsScenario: any = (input: string, expectedOutput: string) => { - const result: string = normalizeArg(input); - if (result !== expectedOutput) { - throw new Error(`normalizeArgs failure: for \"${input}\", \"${result}\" !== \"${expectedOutput}\"`); - } - }; - /* - this is how the args from tasks.json will be sent to the chilprocess.spawn: - "args":[ - "-DTEST1=TEST1 TEST1", // "-DTEST1=TEST1 TEST1" - "-DTEST2=\"TEST2 TEST2\"", // -DTEST2="TEST2 TEST2" - "-DTEST3=\\\"TEST3 TEST3\\\"", // "-DTEST3=\"TEST3 TEST3\"" - "-DTEST4=TEST4\\ TEST4", // "-DTEST4=TEST4 TEST4" - "-DTEST5='TEST5 TEST5'", // -DTEST5='TEST5 TEST5' - "-DTEST6=TEST6\\ TEST6 Test6", // "-DTEST6=TEST6 TEST6 Test6" - ] - */ - testNormalizeArgsScenario("-DTEST1=TEST1 TEST1", "\"-DTEST1=TEST1 TEST1\""); - testNormalizeArgsScenario("-DTEST2=\"TEST2 TEST2\"", "-DTEST2=\"TEST2 TEST2\""); - testNormalizeArgsScenario("-DTEST3=\\\"TEST3 TEST3\\\"", "\"-DTEST3=\\\"TEST3 TEST3\\\"\""); - if (process.platform.includes("win")) { - testNormalizeArgsScenario("-DTEST4=TEST4\\ TEST4", "\"-DTEST4=TEST4 TEST4\""); - testNormalizeArgsScenario("-DTEST5=\'TEST5 TEST5\'", "-DTEST5=\'TEST5 TEST5\'"); - } else { - testNormalizeArgsScenario("-DTEST4=TEST4\\ TEST4", "-DTEST4=TEST4\\ TEST4"); - testNormalizeArgsScenario("-DTEST5='TEST5 TEST5'", "-DTEST5='TEST5 TEST5'"); - } - testNormalizeArgsScenario("-DTEST6=TEST6\\ TEST6 Test6", "\"-DTEST6=TEST6 TEST6 Test6\""); - }); - - interface ResolveTestFlowEnvironment { - withEnvironment(additionalEnvironment: {[key: string]: string | string[]}): ResolveTestFlowAssert; - shouldLookupSymbol(key: string): void; - } - interface ResolveTestFlowAssert { - shouldResolveTo(x: string): void; - } - - function resolveVariablesWithInput(input: string): ResolveTestFlowEnvironment { - return { - withEnvironment: (additionalEnvironment: {[key: string]: string | string[]}) => inputAndEnvironment(input, additionalEnvironment), - shouldLookupSymbol: (symbol: string) => { - const environment: {[key: string]: string | string[]} = {}; - environment[symbol] = success; - return inputAndEnvironment(input, environment) - .shouldResolveTo(success); - } - }; - } - - function inputAndEnvironment(input: string, additionalEnvironment: {[key: string]: string | string[]}): ResolveTestFlowAssert { - return { - shouldResolveTo: (expected: string) => { - const actual: string = resolveVariables(input, additionalEnvironment); - const msg: string = `Expected ${expected}. Got ${actual} with input ${input} and environment ${JSON.stringify(additionalEnvironment)}.`; - assert.equal(actual, expected, msg); - } - }; - } - }); -}); diff --git a/Extension/test/unitTests/index.ts b/Extension/test/unitTests/index.ts deleted file mode 100644 index 3208127d61..0000000000 --- a/Extension/test/unitTests/index.ts +++ /dev/null @@ -1,39 +0,0 @@ -import * as glob from 'glob'; -import * as Mocha from 'mocha'; -import * as path from 'path'; -const MochaTest = (Mocha as any) as (new (options?: Mocha.MochaOptions) => Mocha); - -export function run(): Promise { - // Create the mocha test - const mocha = new MochaTest({ - ui: 'tdd', - color: true - }); - - const testsRoot = __dirname; - - return new Promise((c, e) => { - glob('**/**.test.js', { cwd: testsRoot }, (err, files) => { - if (err) { - return e(err); - } - - // Add files to the test suite - files.forEach(f => mocha.addFile(path.resolve(testsRoot, f))); - - try { - // Run the mocha test - mocha.timeout(100000); - mocha.run(failures => { - if (failures > 0) { - e(new Error(`${failures} tests failed.`)); - } else { - c(); - } - }); - } catch (err) { - e(err); - } - }); - }); -} diff --git a/Extension/test/unitTests/runTest.ts b/Extension/test/unitTests/runTest.ts deleted file mode 100644 index cba43811d7..0000000000 --- a/Extension/test/unitTests/runTest.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { downloadAndUnzipVSCode, resolveCliArgsFromVSCodeExecutablePath, runTests } from '@vscode/test-electron'; -import { createHash } from 'crypto'; -import { mkdir as md, stat } from 'fs/promises'; -import { tmpdir } from 'os'; -import { resolve } from 'path'; - -// The folder containing the Extension Manifest package.json -// Passed to `--extensionDevelopmentPath` -const extensionDevelopmentPath = resolve(__dirname, '../../../'); - -const isolated = resolve(tmpdir(), '.vscode-test', createHash('sha256').update(extensionDevelopmentPath).digest('hex').substring(0,6) ); - -const options = { - cachePath: `${isolated}/cache`, - launchArgs: ['--no-sandbox', '--disable-updates', '--skip-welcome', '--skip-release-notes', `--extensions-dir=${isolated}/extensions`, `--user-data-dir=${isolated}/user-data`] -}; -async function mkdir(filePath:string) { - filePath = resolve(filePath); - try { - const s = await stat(filePath); - if( s.isDirectory() ) { - return filePath; - } - throw new Error(`Cannot create directory '${filePath}' because thre is a file there.`); - } catch { - // no worries - } - - await md(filePath, { recursive: true }) - return filePath; -} - -async function main() { - try { - // create a folder for the isolated test environment - await mkdir(isolated); - - // download VSCode to that location - const vscodeExecutablePath = await downloadAndUnzipVSCode(options); - const [cli, ...launchArgs] = resolveCliArgsFromVSCodeExecutablePath(vscodeExecutablePath).filter(each => !each.startsWith('--extensions-dir=') && !each.startsWith('--user-data-dir=')); - - // clean up args so that it works with the isolate extensions and data directories - launchArgs.push(`--extensions-dir=${isolated}/extensions`, `--user-data-dir=${isolated}/user-data`); - - // The path to the extension test script - // Passed to --extensionTestsPath - const extensionTestsPath = resolve(__dirname, './index'); - - launchArgs.push("--disable-extensions"); - - // Download VS Code, unzip it and run the integration test - await runTests({ - ...options, - launchArgs, - extensionDevelopmentPath, - extensionTestsPath - }); - } catch (err) { - console.log(err); - console.log('Failed to run tests.'); - process.exit(1); - } -} - -main(); diff --git a/Extension/tools/.eslintrc.js b/Extension/tools/.eslintrc.js deleted file mode 100644 index d91a265864..0000000000 --- a/Extension/tools/.eslintrc.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - "parserOptions": { - "project": "test.tsconfig.json", - "sourceType": "module" - } -}; diff --git a/Extension/tools/prepublish.js b/Extension/tools/prepublish.js deleted file mode 100644 index ca1e3d578b..0000000000 --- a/Extension/tools/prepublish.js +++ /dev/null @@ -1,34 +0,0 @@ -/* -------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All Rights Reserved. - * See 'LICENSE' in the project root for license information. - * ------------------------------------------------------------------------------------------ */ -'use strict'; - -/** - * This file is used during local debugging of the extension and should not be referenced by any - * other source files. - */ - -const fs = require("fs"); -const os = require("os"); -const cp = require("child_process"); -const path = require("path"); - -let compile = function(tsPath) { - const folderName = path.dirname(tsPath); - - console.log(">> tsc " + tsPath + " --outDir out/" + folderName); - cp.execSync("tsc " + tsPath + " --outDir out/" + folderName, {stdio:[0, 1, 2]}); -}; - -console.log(">> yarn install"); -cp.execSync("yarn install", { stdio: [0, 1, 2] }); - - -const tscCompileListStr = fs.readFileSync("./tscCompileList.txt").toString(); - -tscCompileListStr.split(/\r?\n/).forEach(filePath => { - if (!filePath.startsWith("#") && /\S/.test(filePath)) { - compile(filePath); - } -}); \ No newline at end of file diff --git a/Extension/tscCompileList.txt b/Extension/tscCompileList.txt deleted file mode 100644 index 612bf6f27d..0000000000 --- a/Extension/tscCompileList.txt +++ /dev/null @@ -1,12 +0,0 @@ -# This file is consumed in tools\prepublish.js -# '#' at the start of the line is treated as a comment and is ignored. -# whitespace empty lines are also ignores. -# -# This file is to be used if you do not wish to webpack a .ts file -# If you do not want it to be webpacked: -# 1. Please make sure it is not in the src directory -# 2. Add it to the list below -# 3. If you created a new folder, please make sure it is added to the .vscodeignore - -tools/GenerateOptionsSchema.ts -ui/settings.ts \ No newline at end of file diff --git a/Extension/tsconfig.json b/Extension/tsconfig.json index d9f83474ec..42c696f390 100644 --- a/Extension/tsconfig.json +++ b/Extension/tsconfig.json @@ -2,25 +2,28 @@ "compilerOptions": { "module": "commonjs", "target": "ES2022", - "outDir": "out", + "outDir": "dist", "lib": [ "ES2022", "dom" ], - "sourceMap": true, + "inlineSourceMap": true, "rootDir": ".", "removeComments": true, "noUnusedLocals": true, "strictNullChecks": true, "strict": true, - "forceConsistentCasingInFileNames": true, + "forceConsistentCasingInFileNames": true }, "include": [ - "src/**/*.ts", + "test/**/*.ts", + "ui/**/*.ts", "./vscode*.d.ts", - "./node_modules/vscode/lib/*" + "src/types/*.d.ts", + "src/**/*.ts" ], "exclude": [ - "node_modules/@types/eslint-scope/node_modules/@types/eslint/index.d.ts" + "node_modules/@types/eslint-scope/node_modules/@types/eslint/index.d.ts", + "node_modules/**" ] } diff --git a/Extension/ui.tsconfig.json b/Extension/ui.tsconfig.json new file mode 100644 index 0000000000..5520fd0742 --- /dev/null +++ b/Extension/ui.tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "module": "commonjs", + "target": "ES2022", + "outDir": "dist", + "lib": [ + "ES2022", + "dom" + ], + "sourceMap": true, + "rootDir": ".", + "removeComments": true, + "noUnusedLocals": true, + "strictNullChecks": true, + "strict": true, + "forceConsistentCasingInFileNames": true + }, + "include": [ + "ui/**/*.ts", + "./vscode*.d.ts", + "src/types/*.d.ts" + ], + "exclude": [ + "node_modules/@types/eslint-scope/node_modules/@types/eslint/index.d.ts", + "node_modules/**" + ] +} diff --git a/Extension/ui/.eslintrc.js b/Extension/ui/.eslintrc.js deleted file mode 100644 index d91a265864..0000000000 --- a/Extension/ui/.eslintrc.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - "parserOptions": { - "project": "test.tsconfig.json", - "sourceType": "module" - } -}; diff --git a/Extension/ui/settings.ts b/Extension/ui/settings.ts index 68d61ef2f5..61725b6248 100644 --- a/Extension/ui/settings.ts +++ b/Extension/ui/settings.ts @@ -80,7 +80,7 @@ class SettingsApp { // Set view state of advanced settings and add event const oldState: any = this.vsCodeApi.getState(); - const advancedShown: boolean = (oldState && oldState.advancedShown); + const advancedShown: boolean = oldState && oldState.advancedShown; // eslint-disable-next-line @typescript-eslint/no-non-null-assertion document.getElementById(elementId.advancedSection)!.style.display = advancedShown ? "block" : "none"; document.getElementById(elementId.showAdvanced)?.classList.toggle(advancedShown ? "collapse" : "expand", true); @@ -125,7 +125,7 @@ class SettingsApp { private onShowAdvanced(): void { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const isShown: boolean = (document.getElementById(elementId.advancedSection)!.style.display === "block"); + const isShown: boolean = document.getElementById(elementId.advancedSection)!.style.display === "block"; // eslint-disable-next-line @typescript-eslint/no-non-null-assertion document.getElementById(elementId.advancedSection)!.style.display = isShown ? "none" : "block"; @@ -284,7 +284,7 @@ class SettingsApp { if (config.browse) { (document.getElementById(elementId.browsePath)).value = joinEntries(config.browse.path); (document.getElementById(elementId.limitSymbolsToIncludedHeaders)).checked = - (config.browse.limitSymbolsToIncludedHeaders && config.browse.limitSymbolsToIncludedHeaders); + config.browse.limitSymbolsToIncludedHeaders && config.browse.limitSymbolsToIncludedHeaders; (document.getElementById(elementId.databaseFilename)).value = config.browse.databaseFilename ? config.browse.databaseFilename : ""; } else { (document.getElementById(elementId.browsePath)).value = ""; @@ -386,4 +386,4 @@ class SettingsApp { } // eslint-disable-next-line @typescript-eslint/no-unused-vars -const app: SettingsApp = new SettingsApp(); +export const app: SettingsApp = new SettingsApp(); diff --git a/Extension/webpack.config.js b/Extension/webpack.config.js index 3cfd4bdd6a..032dae0098 100644 --- a/Extension/webpack.config.js +++ b/Extension/webpack.config.js @@ -15,7 +15,7 @@ const config = { entry: './src/main.ts', // the entry point of this extension, 📖 -> https://webpack.js.org/configuration/entry-context/ output: { // the bundle is stored in the 'dist' folder (check package.json), 📖 -> https://webpack.js.org/configuration/output/ - path: path.resolve(__dirname, 'dist'), + path: path.resolve(__dirname, 'dist', 'src'), filename: 'main.js', libraryTarget: "commonjs2", devtoolModuleFilenameTemplate: "../[resource-path]", @@ -41,11 +41,11 @@ const config = { loader: 'ts-loader', options: { compilerOptions: { - "sourceMap": true, + "inlineSourceMap": true, } } }] - },{ + }, { test: /.node$/, loader: 'node-loader', }] @@ -65,11 +65,10 @@ module.exports = (env) => { config.module.rules.unshift({ loader: 'vscode-nls-dev/lib/webpack-loader', options: { - base: __dirname + base: `${__dirname}/src` } }) } return config - }; - +}; diff --git a/Extension/yarn.lock b/Extension/yarn.lock index d9e62e25b2..646f4263e2 100644 --- a/Extension/yarn.lock +++ b/Extension/yarn.lock @@ -7,6 +7,13 @@ resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + "@discoveryjs/json-ext@^0.5.0": version "0.5.7" resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" @@ -21,14 +28,14 @@ esquery "^1.5.0" jsdoc-type-pratt-parser "~4.0.0" -"@eslint-community/eslint-utils@^4.2.0": +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== dependencies: eslint-visitor-keys "^3.3.0" -"@eslint-community/regexpp@^4.4.0": +"@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.5.1": version "4.5.1" resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.5.1.tgz#cdd35dce4fa1a89a4fd42b1599eb35b3af408884" integrity sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ== @@ -72,13 +79,6 @@ normalize-path "^2.0.1" through2 "^2.0.3" -"@gulpjs/to-absolute-glob@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@gulpjs/to-absolute-glob/-/to-absolute-glob-4.0.0.tgz#1fc2460d3953e1d9b9f2dfdb4bcc99da4710c021" - integrity sha512-kjotm7XJrJ6v+7knhPaRgaT6q8F8K2jiafwYdNHLzmV0uGLuZY43FK6smNSHUPrhq5kX2slCUy+RGG/xGqmIKA== - dependencies: - is-negated-glob "^1.0.0" - "@humanwhocodes/config-array@^0.11.10": version "0.11.10" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.10.tgz#5a3ffe32cc9306365fb3fd572596cd602d5e12d2" @@ -112,6 +112,11 @@ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + "@jridgewell/set-array@^1.0.1": version "1.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" @@ -135,6 +140,14 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": version "0.3.18" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" @@ -306,6 +319,26 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== +"@tsconfig/node10@^1.0.7": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + "@types/eslint-scope@^3.7.3": version "3.7.4" resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" @@ -314,7 +347,7 @@ "@types/eslint" "*" "@types/estree" "*" -"@types/eslint@*", "@types/eslint@^8.40.0": +"@types/eslint@*": version "8.44.0" resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.0.tgz#55818eabb376e2272f77fbf5c96c43137c3c1e53" integrity sha512-gsF+c/0XOguWgaOgvFs+xnnRqt9GwgTvIks36WpE6ueeI4KCEHHd8K/CKHqhOqrJKsYH8m27kRzQEvWXAwXUTw== @@ -335,7 +368,7 @@ "@types/minimatch" "*" "@types/node" "*" -"@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": +"@types/json-schema@*", "@types/json-schema@^7.0.12", "@types/json-schema@^7.0.8": version "7.0.12" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== @@ -367,7 +400,7 @@ resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.1.tgz#2f4f65bb08bc368ac39c96da7b2f09140b26851b" integrity sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q== -"@types/node@*", "@types/node@>=12": +"@types/node@*": version "20.4.1" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.1.tgz#a6033a8718653c50ac4962977e14d0f984d9527d" integrity sha512-JIzsAvJeA/5iY6Y/OxZbv1lUcc8dNSE77lb2gnBH+/PJ3lFR1Ccvgwl5JWnHAkNHcRsT0TbpVOsiMKZ1F/yyJg== @@ -385,7 +418,7 @@ "@types/node" "*" xmlbuilder ">=11.0.1" -"@types/semver@^7.1.0", "@types/semver@^7.3.12": +"@types/semver@^7.1.0", "@types/semver@^7.5.0": version "7.5.0" resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.0.tgz#591c1ce3a702c45ee15f47a42ade72c2fd78978a" integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw== @@ -412,94 +445,91 @@ dependencies: "@types/node" "*" -"@typescript-eslint/eslint-plugin@^5.59.11": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" - integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== - dependencies: - "@eslint-community/regexpp" "^4.4.0" - "@typescript-eslint/scope-manager" "5.62.0" - "@typescript-eslint/type-utils" "5.62.0" - "@typescript-eslint/utils" "5.62.0" +"@typescript-eslint/eslint-plugin@^6.1.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.1.0.tgz#96f3ca6615717659d06c9f7161a1d14ab0c49c66" + integrity sha512-qg7Bm5TyP/I7iilGyp6DRqqkt8na00lI6HbjWZObgk3FFSzH5ypRwAHXJhJkwiRtTcfn+xYQIMOR5kJgpo6upw== + dependencies: + "@eslint-community/regexpp" "^4.5.1" + "@typescript-eslint/scope-manager" "6.1.0" + "@typescript-eslint/type-utils" "6.1.0" + "@typescript-eslint/utils" "6.1.0" + "@typescript-eslint/visitor-keys" "6.1.0" debug "^4.3.4" graphemer "^1.4.0" - ignore "^5.2.0" + ignore "^5.2.4" + natural-compare "^1.4.0" natural-compare-lite "^1.4.0" - semver "^7.3.7" - tsutils "^3.21.0" + semver "^7.5.4" + ts-api-utils "^1.0.1" -"@typescript-eslint/parser@^5.59.11": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" - integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== +"@typescript-eslint/parser@^6.1.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.1.0.tgz#3135bf65dca5340d8650703eb8cb83113e156ee5" + integrity sha512-hIzCPvX4vDs4qL07SYzyomamcs2/tQYXg5DtdAfj35AyJ5PIUqhsLf4YrEIFzZcND7R2E8tpQIZKayxg8/6Wbw== dependencies: - "@typescript-eslint/scope-manager" "5.62.0" - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/typescript-estree" "5.62.0" + "@typescript-eslint/scope-manager" "6.1.0" + "@typescript-eslint/types" "6.1.0" + "@typescript-eslint/typescript-estree" "6.1.0" + "@typescript-eslint/visitor-keys" "6.1.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" - integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== +"@typescript-eslint/scope-manager@6.1.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.1.0.tgz#a6cdbe11630614f8c04867858a42dd56590796ed" + integrity sha512-AxjgxDn27hgPpe2rQe19k0tXw84YCOsjDJ2r61cIebq1t+AIxbgiXKvD4999Wk49GVaAcdJ/d49FYel+Pp3jjw== dependencies: - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/visitor-keys" "5.62.0" + "@typescript-eslint/types" "6.1.0" + "@typescript-eslint/visitor-keys" "6.1.0" -"@typescript-eslint/type-utils@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" - integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== +"@typescript-eslint/type-utils@6.1.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.1.0.tgz#21cc6c3bc1980b03f9eb4e64580d0c5be6f08215" + integrity sha512-kFXBx6QWS1ZZ5Ni89TyT1X9Ag6RXVIVhqDs0vZE/jUeWlBv/ixq2diua6G7ece6+fXw3TvNRxP77/5mOMusx2w== dependencies: - "@typescript-eslint/typescript-estree" "5.62.0" - "@typescript-eslint/utils" "5.62.0" + "@typescript-eslint/typescript-estree" "6.1.0" + "@typescript-eslint/utils" "6.1.0" debug "^4.3.4" - tsutils "^3.21.0" + ts-api-utils "^1.0.1" -"@typescript-eslint/types@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" - integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== +"@typescript-eslint/types@6.1.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.1.0.tgz#2d607c62827bb416ada5c96ebfa2ef84e45a8dfa" + integrity sha512-+Gfd5NHCpDoHDOaU/yIF3WWRI2PcBRKKpP91ZcVbL0t5tQpqYWBs3z/GGhvU+EV1D0262g9XCnyqQh19prU0JQ== -"@typescript-eslint/typescript-estree@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" - integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== +"@typescript-eslint/typescript-estree@6.1.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.1.0.tgz#ea382f6482ba698d7e993a88ce5391ea7a66c33d" + integrity sha512-nUKAPWOaP/tQjU1IQw9sOPCDavs/iU5iYLiY/6u7gxS7oKQoi4aUxXS1nrrVGTyBBaGesjkcwwHkbkiD5eBvcg== dependencies: - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/visitor-keys" "5.62.0" + "@typescript-eslint/types" "6.1.0" + "@typescript-eslint/visitor-keys" "6.1.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/utils@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" - integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@types/json-schema" "^7.0.9" - "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.62.0" - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/typescript-estree" "5.62.0" - eslint-scope "^5.1.1" - semver "^7.3.7" + semver "^7.5.4" + ts-api-utils "^1.0.1" -"@typescript-eslint/visitor-keys@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" - integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== +"@typescript-eslint/utils@6.1.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.1.0.tgz#1641843792b4e3451cc692e2c73055df8b26f453" + integrity sha512-wp652EogZlKmQoMS5hAvWqRKplXvkuOnNzZSE0PVvsKjpexd/XznRVHAtrfHFYmqaJz0DFkjlDsGYC9OXw+OhQ== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.12" + "@types/semver" "^7.5.0" + "@typescript-eslint/scope-manager" "6.1.0" + "@typescript-eslint/types" "6.1.0" + "@typescript-eslint/typescript-estree" "6.1.0" + semver "^7.5.4" + +"@typescript-eslint/visitor-keys@6.1.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.1.0.tgz#d2b84dff6b58944d3257ea03687e269a788c73be" + integrity sha512-yQeh+EXhquh119Eis4k0kYhj9vmFzNpbhM3LftWQVwqVjipCkwHBQOZutcYW+JVkjtTG9k8nrZU1UoNedPDd1A== dependencies: - "@typescript-eslint/types" "5.62.0" - eslint-visitor-keys "^3.3.0" - -"@ungap/promise-all-settled@1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" - integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== + "@typescript-eslint/types" "6.1.0" + eslint-visitor-keys "^3.4.1" "@vscode/debugadapter@^1.61.0": version "1.61.0" @@ -701,12 +731,17 @@ acorn-jsx@^5.3.2: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== +acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + acorn@5.X, acorn@^5.0.3: version "5.7.4" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== -acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: +acorn@^8.4.1, acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: version "8.10.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== @@ -774,11 +809,6 @@ ansi-regex@^2.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== -ansi-regex@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" - integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== - ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" @@ -804,7 +834,7 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" -anymatch@^3.1.3, anymatch@~3.1.2: +anymatch@~3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== @@ -829,6 +859,11 @@ are-docs-informative@^0.0.2: resolved "https://registry.yarnpkg.com/are-docs-informative/-/are-docs-informative-0.0.2.tgz#387f0e93f5d45280373d387a59d34c96db321963" integrity sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig== +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + argparse@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" @@ -1040,7 +1075,7 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-js@^1.3.1, base64-js@^1.5.1: +base64-js@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== @@ -1073,15 +1108,6 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -bl@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-5.1.0.tgz#183715f678c7188ecef9fe475d90209400624273" - integrity sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ== - dependencies: - buffer "^6.0.3" - inherits "^2.0.4" - readable-stream "^3.4.0" - brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -1145,14 +1171,6 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - builtin-modules@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" @@ -1209,7 +1227,7 @@ chalk@^4.0.0, chalk@^4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chokidar@3.5.1, chokidar@3.5.3, chokidar@^2.0.0, chokidar@^3.5.3: +chokidar@3.5.3, chokidar@^2.0.0, chokidar@^3.5.3: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== @@ -1394,11 +1412,6 @@ convert-source-map@1.X, convert-source-map@^1.5.0: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== -convert-source-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" - integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== - copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" @@ -1422,6 +1435,11 @@ core-util-is@^1.0.3, core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -1449,11 +1467,6 @@ d@1, d@^1.0.1: es5-ext "^0.10.50" type "^1.0.1" -dargs@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" - integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== - debug-fabulous@1.X: version "1.1.0" resolved "https://registry.yarnpkg.com/debug-fabulous/-/debug-fabulous-1.1.0.tgz#af8a08632465224ef4174a9f06308c3c2a1ebc8e" @@ -1477,13 +1490,6 @@ debug@4, debug@4.3.4, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: dependencies: ms "2.1.2" -debug@4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" - integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== - dependencies: - ms "2.1.2" - debug@^2.2.0, debug@^2.3.3: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -1573,6 +1579,11 @@ diff@5.0.0: resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -1609,16 +1620,6 @@ duplexify@^3.6.0: readable-stream "^2.0.0" stream-shift "^1.0.0" -duplexify@^4.1.1: - version "4.1.2" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-4.1.2.tgz#18b4f8d28289132fa0b9573c898d9f903f81c7b0" - integrity sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw== - dependencies: - end-of-stream "^1.4.1" - inherits "^2.0.3" - readable-stream "^3.1.1" - stream-shift "^1.0.0" - each-props@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/each-props/-/each-props-1.3.2.tgz#ea45a414d16dd5cfa419b1a81720d5ca06892333" @@ -1652,7 +1653,7 @@ emojis-list@^3.0.0: resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== -end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: +end-of-stream@^1.0.0, end-of-stream@^1.1.0: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== @@ -1858,10 +1859,10 @@ eslint-plugin-import@^2.27.5: semver "^6.3.0" tsconfig-paths "^3.14.1" -eslint-plugin-jsdoc@^46.2.6: - version "46.4.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-46.4.3.tgz#4a2ad3a01d7ba723acaed3940f746a0a31d1e58e" - integrity sha512-Prc7ol+vCIghPeECpwZq5+P+VZfoi87suywvbYCiCnkI1kTmVSdcOC2M8mioglWxBbd28wbb1OVjg/8OzGzatA== +eslint-plugin-jsdoc@^46.4.4: + version "46.4.4" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-46.4.4.tgz#cdcf9f59238381e3ee57110ceccefdfef388455d" + integrity sha512-D8TGPOkq3bnzmYmA7Q6jdsW+Slx7CunhJk1tlouVq6wJjlP1p6eigZPvxFn7aufud/D66xBsNVMhkDQEuqumMg== dependencies: "@es-joy/jsdoccomment" "~0.39.4" are-docs-informative "^0.0.2" @@ -1873,7 +1874,7 @@ eslint-plugin-jsdoc@^46.2.6: semver "^7.5.1" spdx-expression-parse "^3.0.1" -eslint-scope@5.1.1, eslint-scope@^5.1.1: +eslint-scope@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== @@ -1894,10 +1895,10 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz#c22c48f48942d08ca824cc526211ae400478a994" integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== -eslint@8, eslint@^8.42.0: - version "8.44.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.44.0.tgz#51246e3889b259bbcd1d7d736a0c10add4f0e500" - integrity sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A== +eslint@^8.45.0: + version "8.45.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.45.0.tgz#bab660f90d18e1364352c0a6b7c6db8edb458b78" + integrity sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.4.0" @@ -1924,7 +1925,6 @@ eslint@8, eslint@^8.42.0: globals "^13.19.0" graphemer "^1.4.0" ignore "^5.2.0" - import-fresh "^3.0.0" imurmurhash "^0.1.4" is-glob "^4.0.0" is-path-inside "^3.0.3" @@ -1936,7 +1936,6 @@ eslint@8, eslint@^8.42.0: natural-compare "^1.4.0" optionator "^0.9.3" strip-ansi "^6.0.1" - strip-json-comments "^3.1.0" text-table "^0.2.0" espree@^9.6.0: @@ -2021,21 +2020,6 @@ events@^3.2.0: resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" @@ -2107,23 +2091,11 @@ fancy-log@^1.3.2, fancy-log@^1.3.3: parse-node-version "^1.0.0" time-stamp "^1.0.0" -fancy-log@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-2.0.0.tgz#cad207b8396d69ae4796d74d17dff5f68b2f7343" - integrity sha512-9CzxZbACXMUXW13tS0tI8XsGGmxWzO2DmYrGuBJOJ8k8q2K7hwfJA5qHjuPPe8wtsco33YR9wc+Rlr5wYFvhSA== - dependencies: - color-support "^1.1.3" - fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-fifo@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.0.tgz#03e381bcbfb29932d7c3afde6e15e83e05ab4d8b" - integrity sha512-IgfweLvEpwyA4WgiQe9Nx6VV2QkML2NkvZnk1oKnIzXgXdWxuhF7zw4DvLTPZJn6PIUneiAXPF24QmoEqHTjyw== - fast-glob@^3.2.9: version "3.3.0" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.0.tgz#7c40cb491e1e2ed5664749e87bfb516dbe8727c0" @@ -2155,7 +2127,7 @@ fastest-levenshtein@^1.0.12: resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== -fastq@^1.13.0, fastq@^1.6.0: +fastq@^1.6.0: version "1.15.0" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== @@ -2296,11 +2268,6 @@ for-own@^1.0.0: dependencies: for-in "^1.0.1" -fork-stream@^0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/fork-stream/-/fork-stream-0.0.4.tgz#db849fce77f6708a5f8f386ae533a0907b54ae70" - integrity sha512-Pqq5NnT78ehvUnAk/We/Jr22vSvanRlFTpAmQ88xBY/M1TlHe+P0ILuEyXS595ysdGfaj22634LBkGMA2GTcpA== - fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" @@ -2330,14 +2297,6 @@ fs-mkdirp-stream@^1.0.0: graceful-fs "^4.1.11" through2 "^2.0.3" -fs-mkdirp-stream@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fs-mkdirp-stream/-/fs-mkdirp-stream-2.0.1.tgz#1e82575c4023929ad35cf69269f84f1a8c973aa7" - integrity sha512-UTOY+59K6IA94tec8Wjqm0FSh5OVudGNB0NL/P6fB3HiE3bYOY3VYBGijsnOHNkQSwC1FKkU77pmq7xp9CskLw== - dependencies: - graceful-fs "^4.2.8" - streamx "^2.12.0" - fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -2388,11 +2347,6 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@ has-proto "^1.0.1" has-symbols "^1.0.3" -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - get-symbol-description@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" @@ -2441,20 +2395,6 @@ glob-stream@^6.1.0: to-absolute-glob "^2.0.0" unique-stream "^2.0.2" -glob-stream@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-8.0.0.tgz#c4ed84de7fcc0b4c0f02e7f4cc0dc9c462c47236" - integrity sha512-CdIUuwOkYNv9ZadR3jJvap8CMooKziQZ/QCSPhEb7zqfsEI5YnPmvca7IvbaVE3z58ZdUYD2JsU6AUWjL8WZJA== - dependencies: - "@gulpjs/to-absolute-glob" "^4.0.0" - anymatch "^3.1.3" - fastq "^1.13.0" - glob-parent "^6.0.2" - is-glob "^4.0.3" - is-negated-glob "^1.0.0" - normalize-path "^3.0.0" - streamx "^2.12.5" - glob-to-regexp@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" @@ -2473,18 +2413,6 @@ glob-watcher@^5.0.3: normalize-path "^3.0.0" object.defaults "^1.1.0" -glob@7.1.6: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - glob@7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" @@ -2569,7 +2497,7 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -graceful-fs@4.X, graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.10, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.8, graceful-fs@^4.2.9: +graceful-fs@4.X, graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -2579,11 +2507,6 @@ graphemer@^1.4.0: resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== -growl@1.10.5: - version "1.10.5" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" - integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== - gulp-cli@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/gulp-cli/-/gulp-cli-2.3.0.tgz#ec0d380e29e52aa45e47977f0d32e18fd161122f" @@ -2616,20 +2539,6 @@ gulp-env@^0.4.0: ini "^1.3.4" through2 "^2.0.0" -gulp-eslint-new@^1.8.0: - version "1.8.2" - resolved "https://registry.yarnpkg.com/gulp-eslint-new/-/gulp-eslint-new-1.8.2.tgz#0587a7d347104047a33a90a3ffb1a6bec8be5e32" - integrity sha512-zzsVY0v9WMbPqXB83TUnqsQtXo8+91Pzw18q9i9v5F6/OPE8rqSw/AX1zHNvummPwTN9a8NBhVGgOIxpf79gwA== - dependencies: - "@types/eslint" "^8.40.0" - "@types/node" ">=12" - eslint "8" - fancy-log "^2.0.0" - plugin-error "^2.0.1" - semver "^7.5.3" - ternary-stream "^3.0.0" - vinyl-fs "^4.0.0" - gulp-filter@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/gulp-filter/-/gulp-filter-6.0.0.tgz#9d69a408f1a9f60534264fb14464841f1b1746c2" @@ -2639,18 +2548,6 @@ gulp-filter@^6.0.0: plugin-error "^1.0.1" streamfilter "^3.0.0" -gulp-mocha@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/gulp-mocha/-/gulp-mocha-8.0.0.tgz#7e02677782573a9dc844a9ee1d6de89ebccff2d6" - integrity sha512-FdbBydfzszaES/gXfwD6RFq1yJTj4Z6328R1yqsmhf+t7hW2aj9ZD9Hz8boQShjZ9J8/w6tQBM5mePb8K2pbqA== - dependencies: - dargs "^7.0.0" - execa "^5.0.0" - mocha "^8.3.0" - plugin-error "^1.0.1" - supports-color "^8.1.1" - through2 "^4.0.2" - gulp-sourcemaps@^2.6.5: version "2.6.5" resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-2.6.5.tgz#a3f002d87346d2c0f3aec36af7eb873f23de8ae6" @@ -2816,11 +2713,6 @@ https-proxy-agent@^7.0.0: agent-base "^7.0.2" debug "4" -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - iconv-lite@^0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" @@ -2828,12 +2720,7 @@ iconv-lite@^0.6.3: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" -ieee754@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore@^5.2.0: +ignore@^5.2.0, ignore@^5.2.4: version "5.2.4" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== @@ -2843,7 +2730,7 @@ immediate@~3.0.5: resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== -import-fresh@^3.0.0, import-fresh@^3.2.1: +import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -3051,11 +2938,6 @@ is-fullwidth-code-point@^1.0.0: dependencies: number-is-nan "^1.0.0" -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== - is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" @@ -3158,11 +3040,6 @@ is-shared-array-buffer@^1.0.2: dependencies: call-bind "^1.0.2" -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" @@ -3258,13 +3135,6 @@ jest-worker@^27.4.5: merge-stream "^2.0.0" supports-color "^8.0.0" -js-yaml@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.0.0.tgz#f426bc0ff4b4051926cd588c71113183409a121f" - integrity sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q== - dependencies: - argparse "^2.0.1" - js-yaml@4.1.0, js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" @@ -3384,11 +3254,6 @@ lead@^1.0.0: dependencies: flush-write-stream "^1.0.2" -lead@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/lead/-/lead-4.0.0.tgz#5317a49effb0e7ec3a0c8fb9c1b24fb716aab939" - integrity sha512-DpMa59o5uGUWWjruMp71e6knmwKU3jRBBn1kjuLWN9EeIOxNeSAwvHf03WIl8g/ZMR2oSQC9ej3yeLBwdDc/pg== - levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -3462,13 +3327,6 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -log-symbols@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" - integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== - dependencies: - chalk "^4.0.0" - log-symbols@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" @@ -3499,6 +3357,11 @@ lru-queue@^0.1.0: dependencies: es5-ext "~0.10.2" +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + make-iterator@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.1.tgz#29b33f312aa8f547c4a5e490f56afcec99133ad6" @@ -3604,18 +3467,6 @@ mime-types@^2.1.27: dependencies: mime-db "1.52.0" -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -minimatch@3.0.4, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - minimatch@5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" @@ -3623,6 +3474,13 @@ minimatch@5.0.1: dependencies: brace-expansion "^2.0.1" +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + minimatch@^5.1.0: version "5.1.6" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" @@ -3677,37 +3535,6 @@ mocha@^10.2.0: yargs-parser "20.2.4" yargs-unparser "2.0.0" -mocha@^8.3.0: - version "8.4.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.4.0.tgz#677be88bf15980a3cae03a73e10a0fc3997f0cff" - integrity sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ== - dependencies: - "@ungap/promise-all-settled" "1.1.2" - ansi-colors "4.1.1" - browser-stdout "1.3.1" - chokidar "3.5.1" - debug "4.3.1" - diff "5.0.0" - escape-string-regexp "4.0.0" - find-up "5.0.0" - glob "7.1.6" - growl "1.10.5" - he "1.2.0" - js-yaml "4.0.0" - log-symbols "4.0.0" - minimatch "3.0.4" - ms "2.1.3" - nanoid "3.1.20" - serialize-javascript "5.0.1" - strip-json-comments "3.1.1" - supports-color "8.1.1" - which "2.0.2" - wide-align "1.1.3" - workerpool "6.1.0" - yargs "16.2.0" - yargs-parser "20.2.4" - yargs-unparser "2.0.0" - ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -3739,16 +3566,16 @@ mute-stdout@^1.0.0: resolved "https://registry.yarnpkg.com/mute-stdout/-/mute-stdout-1.0.1.tgz#acb0300eb4de23a7ddeec014e3e96044b3472331" integrity sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg== -nanoid@3.1.20, nanoid@^3.1.20: - version "3.3.6" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" - integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== - nanoid@3.3.3: version "3.3.3" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== +nanoid@^3.1.20: + version "3.3.6" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" + integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== + nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" @@ -3820,11 +3647,6 @@ normalize-package-data@^2.3.2: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@3.0.0, normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - normalize-path@^2.0.1, normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" @@ -3832,6 +3654,11 @@ normalize-path@^2.0.1, normalize-path@^2.1.1: dependencies: remove-trailing-separator "^1.0.1" +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + now-and-later@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/now-and-later/-/now-and-later-2.0.1.tgz#8e579c8685764a7cc02cb680380e94f43ccb1f7c" @@ -3839,20 +3666,6 @@ now-and-later@^2.0.0: dependencies: once "^1.3.2" -now-and-later@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/now-and-later/-/now-and-later-3.0.0.tgz#cdc045dc5b894b35793cf276cc3206077bb7302d" - integrity sha512-pGO4pzSdaxhWTGkfSfHx3hVzJVslFPwBp2Myq9MYN/ChfJZF87ochMAXnvz6/58RJSf5ik2q9tXprBBrk2cpcg== - dependencies: - once "^1.4.0" - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" @@ -3948,13 +3761,6 @@ once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.4.0: dependencies: wrappy "1" -onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - optionator@^0.9.3: version "0.9.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" @@ -4092,7 +3898,7 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== -path-key@^3.0.0, path-key@^3.1.0: +path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== @@ -4188,13 +3994,6 @@ plugin-error@^1.0.1: arr-union "^3.1.0" extend-shallow "^3.0.2" -plugin-error@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-2.0.1.tgz#f2ac92bac8c85e3e23492d76d0c3ca12f30eb00b" - integrity sha512-zMakqvIDyY40xHOvzXka0kUvf40nYIuwRE8dWhti2WtjQZ31xAgBZBhxsK7vK3QbRXS1Xms/LO7B5cuAsfB2Gg== - dependencies: - ansi-colors "^1.0.1" - posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" @@ -4265,11 +4064,6 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -queue-tick@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/queue-tick/-/queue-tick-1.0.1.tgz#f6f07ac82c1fd60f82e098b417a80e52f1f4c142" - integrity sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag== - randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -4294,7 +4088,7 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" -"readable-stream@2 || 3", readable-stream@3, readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0: +"readable-stream@2 || 3", readable-stream@^3.0.6: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -4396,11 +4190,6 @@ replace-ext@^1.0.0: resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.1.tgz#2d6d996d04a15855d967443631dd5f77825b016a" integrity sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw== -replace-ext@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-2.0.0.tgz#9471c213d22e1bcc26717cd6e50881d88f812b06" - integrity sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug== - replace-homedir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/replace-homedir/-/replace-homedir-1.0.0.tgz#e87f6d513b928dde808260c12be7fec6ff6e798c" @@ -4452,13 +4241,6 @@ resolve-options@^1.1.0: dependencies: value-or-function "^3.0.0" -resolve-options@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-options/-/resolve-options-2.0.0.tgz#a1a57a9949db549dd075de3f5550675f02f1e4c5" - integrity sha512-/FopbmmFOQCfsCx77BRFdKOniglTiHumLgwvd6IDPihy1GKkadZbgQJBcTb2lMzSR1pndzd96b1nZrreZ7+9/A== - dependencies: - value-or-function "^4.0.0" - resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" @@ -4559,20 +4341,13 @@ semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.4, semver@^7.3.7, semver@^7.3.8, semver@^7.5.1, semver@^7.5.3: +semver@^7.3.4, semver@^7.3.7, semver@^7.3.8, semver@^7.5.1, semver@^7.5.4: version "7.5.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== dependencies: lru-cache "^6.0.0" -serialize-javascript@5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" - integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== - dependencies: - randombytes "^2.1.0" - serialize-javascript@6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" @@ -4645,11 +4420,6 @@ sigmund@^1.0.1: resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" integrity sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g== -signal-exit@^3.0.3: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" @@ -4800,13 +4570,6 @@ stream-combiner@^0.2.2: duplexer "~0.1.1" through "~2.3.4" -stream-composer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/stream-composer/-/stream-composer-1.0.2.tgz#7ee61ca1587bf5f31b2e29aa2093cbf11442d152" - integrity sha512-bnBselmwfX5K10AH6L4c8+S5lgZMWI7ZYrz2rvYjCPB2DIMC4Ig8OpxGpNJSxRZ58oti7y1IcNvjBAz9vW5m4w== - dependencies: - streamx "^2.13.2" - stream-exhaust@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/stream-exhaust/-/stream-exhaust-1.0.2.tgz#acdac8da59ef2bc1e17a2c0ccf6c320d120e555d" @@ -4824,14 +4587,6 @@ streamfilter@^3.0.0: dependencies: readable-stream "^3.0.6" -streamx@^2.12.0, streamx@^2.12.5, streamx@^2.13.2, streamx@^2.14.0: - version "2.15.0" - resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.15.0.tgz#f58c92e6f726b5390dcabd6dd9094d29a854d698" - integrity sha512-HcxY6ncGjjklGs1xsP1aR71INYcsXFJet5CU1CHqihQ2J5nOsbd4OjgjHO42w/4QNv9gZb3BueV+Vxok5pLEXg== - dependencies: - fast-fifo "^1.1.0" - queue-tick "^1.0.1" - string-width@^1.0.1, string-width@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -4841,14 +4596,6 @@ string-width@^1.0.1, string-width@^1.0.2: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2": - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" @@ -4906,13 +4653,6 @@ strip-ansi@^3.0.0, strip-ansi@^3.0.1: dependencies: ansi-regex "^2.0.0" -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== - dependencies: - ansi-regex "^3.0.0" - strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -4937,17 +4677,12 @@ strip-bom@^3.0.0: resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: +strip-json-comments@3.1.1, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -supports-color@8.1.1, supports-color@^8.0.0, supports-color@^8.1.1: +supports-color@8.1.1, supports-color@^8.0.0: version "8.1.1" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== @@ -4991,23 +4726,6 @@ tas-client@0.1.58: dependencies: axios "^0.26.1" -teex@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/teex/-/teex-1.0.1.tgz#b8fa7245ef8e8effa8078281946c85ab780a0b12" - integrity sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg== - dependencies: - streamx "^2.12.5" - -ternary-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ternary-stream/-/ternary-stream-3.0.0.tgz#7951930ea9e823924d956f03d516151a2d516253" - integrity sha512-oIzdi+UL/JdktkT+7KU5tSIQjj8pbShj3OASuvDEhm0NT5lppsm7aXWAmAq4/QMaBIyfuEcNLbAQA+HpaISobQ== - dependencies: - duplexify "^4.1.1" - fork-stream "^0.0.4" - merge-stream "^2.0.0" - through2 "^3.0.1" - terser-webpack-plugin@^5.3.7: version "5.3.9" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz#832536999c51b46d468067f9e37662a3b96adfe1" @@ -5050,7 +4768,7 @@ through2@2.X, through2@^2.0.0, through2@^2.0.3, through2@~2.0.0: readable-stream "~2.3.6" xtend "~4.0.1" -through2@^3.0.0, through2@^3.0.1: +through2@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.2.tgz#99f88931cfc761ec7678b41d5d7336b5b6a07bf4" integrity sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ== @@ -5058,13 +4776,6 @@ through2@^3.0.0, through2@^3.0.1: inherits "^2.0.4" readable-stream "2 || 3" -through2@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" - integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw== - dependencies: - readable-stream "3" - through@2, through@^2.3.8, through@~2.3, through@~2.3.4: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -5137,18 +4848,16 @@ to-through@^2.0.0: dependencies: through2 "^2.0.3" -to-through@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/to-through/-/to-through-3.0.0.tgz#bf4956eaca5a0476474850a53672bed6906ace54" - integrity sha512-y8MN937s/HVhEoBU1SxfHC+wxCHkV1a9gW8eAdTadYh/bGyesZIVcbjI+mSpFbSVwQici/XjBjuUyri1dnXwBw== - dependencies: - streamx "^2.12.5" - tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== +ts-api-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.1.tgz#8144e811d44c749cd65b2da305a032510774452d" + integrity sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A== + ts-loader@^8.1.0: version "8.4.0" resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-8.4.0.tgz#e845ea0f38d140bdc3d7d60293ca18d12ff2720f" @@ -5160,6 +4869,25 @@ ts-loader@^8.1.0: micromatch "^4.0.0" semver "^7.3.4" +ts-node@10.9.1: + version "10.9.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" + integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + tsconfig-paths@^3.14.1: version "3.14.2" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" @@ -5170,18 +4898,6 @@ tsconfig-paths@^3.14.1: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^1.8.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tsutils@^3.21.0: - version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -5330,6 +5046,11 @@ util-deprecate@^1.0.1, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + v8flags@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.2.0.tgz#b243e3b4dfd731fa774e7492128109a0fe66d656" @@ -5350,19 +5071,6 @@ value-or-function@^3.0.0: resolved "https://registry.yarnpkg.com/value-or-function/-/value-or-function-3.0.0.tgz#1c243a50b595c1be54a754bfece8563b9ff8d813" integrity sha512-jdBB2FrWvQC/pnPtIqcLsMaQgjhdb6B7tk1MMyTKapox+tQZbdRP4uLxu/JY0t7fbfDCUMnuelzEYv5GsxHhdg== -value-or-function@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/value-or-function/-/value-or-function-4.0.0.tgz#70836b6a876a010dc3a2b884e7902e9db064378d" - integrity sha512-aeVK81SIuT6aMJfNo9Vte8Dw0/FZINGBV8BfCraGtqVxIeLAEhJyoWs8SmvRVmXfGss2PmmOwZCuBPbZR+IYWg== - -vinyl-contents@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/vinyl-contents/-/vinyl-contents-2.0.0.tgz#cc2ba4db3a36658d069249e9e36d9e2b41935d89" - integrity sha512-cHq6NnGyi2pZ7xwdHSW1v4Jfnho4TEGtxZHw01cmnc8+i7jgR6bRnED/LbrKan/Q7CvVLbnvA5OepnhbpjBZ5Q== - dependencies: - bl "^5.0.0" - vinyl "^3.0.0" - vinyl-fs@^3.0.0, vinyl-fs@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-3.0.3.tgz#c85849405f67428feabbbd5c5dbdd64f47d31bc7" @@ -5386,26 +5094,6 @@ vinyl-fs@^3.0.0, vinyl-fs@^3.0.3: vinyl "^2.0.0" vinyl-sourcemap "^1.1.0" -vinyl-fs@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-4.0.0.tgz#06cb36efc911c6e128452f230b96584a9133c3a1" - integrity sha512-7GbgBnYfaquMk3Qu9g22x000vbYkOex32930rBnc3qByw6HfMEAoELjCjoJv4HuEQxHAurT+nvMHm6MnJllFLw== - dependencies: - fs-mkdirp-stream "^2.0.1" - glob-stream "^8.0.0" - graceful-fs "^4.2.11" - iconv-lite "^0.6.3" - is-valid-glob "^1.0.0" - lead "^4.0.0" - normalize-path "3.0.0" - resolve-options "^2.0.0" - stream-composer "^1.0.2" - streamx "^2.14.0" - to-through "^3.0.0" - value-or-function "^4.0.0" - vinyl "^3.0.0" - vinyl-sourcemap "^2.0.0" - vinyl-sourcemap@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz#92a800593a38703a8cdb11d8b300ad4be63b3e16" @@ -5419,18 +5107,6 @@ vinyl-sourcemap@^1.1.0: remove-bom-buffer "^3.0.0" vinyl "^2.0.0" -vinyl-sourcemap@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/vinyl-sourcemap/-/vinyl-sourcemap-2.0.0.tgz#422f410a0ea97cb54cebd698d56a06d7a22e0277" - integrity sha512-BAEvWxbBUXvlNoFQVFVHpybBbjW1r03WhohJzJDSfgrrK5xVYIDTan6xN14DlyImShgDRv2gl9qhM6irVMsV0Q== - dependencies: - convert-source-map "^2.0.0" - graceful-fs "^4.2.10" - now-and-later "^3.0.0" - streamx "^2.12.5" - vinyl "^3.0.0" - vinyl-contents "^2.0.0" - vinyl@^2.0.0, vinyl@^2.1.0, vinyl@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.1.tgz#23cfb8bbab5ece3803aa2c0a1eb28af7cbba1974" @@ -5443,17 +5119,6 @@ vinyl@^2.0.0, vinyl@^2.1.0, vinyl@^2.2.1: remove-trailing-separator "^1.0.1" replace-ext "^1.0.0" -vinyl@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-3.0.0.tgz#11e14732bf56e2faa98ffde5157fe6c13259ff30" - integrity sha512-rC2VRfAVVCGEgjnxHUnpIVh3AGuk62rP3tqVrn+yab0YH7UULisC085+NYH+mnqf3Wx4SpSi1RQMwudL89N03g== - dependencies: - clone "^2.1.2" - clone-stats "^1.0.0" - remove-trailing-separator "^1.1.0" - replace-ext "^2.0.0" - teex "^1.0.1" - vscode-cpptools@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/vscode-cpptools/-/vscode-cpptools-6.1.0.tgz#d89bb225f91da45dbee6acbf45f6940aa3926df1" @@ -5627,13 +5292,6 @@ which-typed-array@^1.1.9: has-tostringtag "^1.0.0" is-typed-array "^1.1.10" -which@2.0.2, which@^2.0.1, which@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - which@^1.2.14: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" @@ -5641,23 +5299,18 @@ which@^1.2.14: dependencies: isexe "^2.0.0" -wide-align@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== +which@^2.0.1, which@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: - string-width "^1.0.2 || 2" + isexe "^2.0.0" wildcard@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== -workerpool@6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.0.tgz#a8e038b4c94569596852de7a8ea4228eefdeb37b" - integrity sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg== - workerpool@6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" @@ -5806,6 +5459,11 @@ yargs@^7.1.0: y18n "^3.2.1" yargs-parser "^5.0.1" +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" From f3e0f0bb056e873497fde95ec0479dcac8dfe7b9 Mon Sep 17 00:00:00 2001 From: Marcin Strzyz <37447884+mastrzyz@users.noreply.github.com> Date: Tue, 29 Aug 2023 16:54:14 -0700 Subject: [PATCH 06/15] Added enforcement. (#11381) --- Extension/package.json | 2 +- Extension/src/LanguageServer/settings.ts | 2 -- Extension/src/SSH/commandInteractors.ts | 1 - Extension/src/Utility/Async/constructor.ts | 1 - Extension/src/Utility/Async/factory.ts | 2 -- Extension/src/Utility/Async/iterators.ts | 2 +- Extension/src/Utility/Eventing/dispatcher.ts | 1 - Extension/src/Utility/Eventing/interfaces.ts | 2 -- Extension/src/Utility/Process/program.ts | 1 - Extension/src/Utility/Process/streams.ts | 2 +- Extension/src/Utility/System/finalize.ts | 1 - Extension/src/Utility/System/guards.ts | 1 - Extension/src/Utility/System/info.ts | 2 +- Extension/src/Utility/Text/characterCodes.ts | 1 - Extension/src/Utility/Text/scanner.ts | 1 - Extension/test/common/selectTests.ts | 2 -- .../scenarios/MultirootDeadlockTest/tests/inlayhints.test.ts | 2 +- .../SimpleCppProject/tests/languageServer.integration.test.ts | 2 +- Extension/test/unit/async.test.ts | 1 - Extension/test/unit/commandLineParsing.test.ts | 2 -- Extension/test/unit/eventing.test.ts | 4 +--- Extension/test/unit/examples/someclass.ts | 1 - Extension/ui/settings.ts | 1 - 23 files changed, 7 insertions(+), 30 deletions(-) diff --git a/Extension/package.json b/Extension/package.json index 14ee2d89a6..6eebe50a84 100644 --- a/Extension/package.json +++ b/Extension/package.json @@ -6125,7 +6125,7 @@ "code": "ts-node -T .scripts/code.ts", "verify": "ts-node -T .scripts/verify.ts", "prep": "yarn copy-walkthrough-media && yarn generate-native-strings && yarn translations-generate", - "lint": "eslint -c .eslintrc.js src test ui .scripts", + "lint": "eslint -c .eslintrc.js --report-unused-disable-directives src test ui .scripts", "compile": "(yarn verify prep || yarn prep) && tsc --build tsconfig.json", "watch": "(yarn verify prep || yarn prep )&& tsc --build tsconfig.json --watch", "rebuild": "yarn clean && yarn prep && yarn compile", diff --git a/Extension/src/LanguageServer/settings.ts b/Extension/src/LanguageServer/settings.ts index 0504d20ea6..1d2152875c 100644 --- a/Extension/src/LanguageServer/settings.ts +++ b/Extension/src/LanguageServer/settings.ts @@ -4,8 +4,6 @@ * ------------------------------------------------------------------------------------------ */ 'use strict'; -/* eslint-disable @typescript-eslint/no-unnecessary-boolean-literal-compare */ - import { execSync } from 'child_process'; import * as editorConfig from 'editorconfig'; import * as fs from 'fs'; diff --git a/Extension/src/SSH/commandInteractors.ts b/Extension/src/SSH/commandInteractors.ts index be2c1a5822..8c549f2b95 100644 --- a/Extension/src/SSH/commandInteractors.ts +++ b/Extension/src/SSH/commandInteractors.ts @@ -322,7 +322,6 @@ export class ContinueOnInteractor implements IInteractor { return ContinueOnInteractor.ID; } - // eslint-disable-next-line @typescript-eslint/no-unused-vars async onData(data: string, _cancelToken?: vscode.CancellationToken): Promise { const result: IInteraction = { postAction: 'keep' }; const pattern: string = escapeStringForRegex(this.continueOn); diff --git a/Extension/src/Utility/Async/constructor.ts b/Extension/src/Utility/Async/constructor.ts index 027533c9a8..e73737effc 100644 --- a/Extension/src/Utility/Async/constructor.ts +++ b/Extension/src/Utility/Async/constructor.ts @@ -6,7 +6,6 @@ import { is } from '../System/guards'; import { ConstructorReturn, Reject, Resolve, AsyncConstructor } from '../System/types'; -// eslint-disable-next-line @typescript-eslint/naming-convention export function Async) => ConstructorReturn>(ctor: TClass) { class AsyncConstructed extends Promise { static class: TClass = ctor; diff --git a/Extension/src/Utility/Async/factory.ts b/Extension/src/Utility/Async/factory.ts index 8223f0c32c..2693a816dd 100644 --- a/Extension/src/Utility/Async/factory.ts +++ b/Extension/src/Utility/Async/factory.ts @@ -3,8 +3,6 @@ * See 'LICENSE' in the project root for license information. * ------------------------------------------------------------------------------------------ */ -/* eslint-disable @typescript-eslint/naming-convention */ - import { is } from '../System/guards'; import { Reject, Resolve } from '../System/types'; diff --git a/Extension/src/Utility/Async/iterators.ts b/Extension/src/Utility/Async/iterators.ts index 29a32f991c..298a7cbef5 100644 --- a/Extension/src/Utility/Async/iterators.ts +++ b/Extension/src/Utility/Async/iterators.ts @@ -125,7 +125,7 @@ export function accumulator(...iterables: Some[]): AsynchIterable { } } - // eslint-disable-next-line no-unmodified-loop-condition + } while (!completeWhenEmpty); signal.dispose(false); diff --git a/Extension/src/Utility/Eventing/dispatcher.ts b/Extension/src/Utility/Eventing/dispatcher.ts index a739b57571..b233d49fb3 100644 --- a/Extension/src/Utility/Eventing/dispatcher.ts +++ b/Extension/src/Utility/Eventing/dispatcher.ts @@ -41,7 +41,6 @@ const asyncHandlers = new Map(); const queue = new Array>(); const current = new Set(); -// eslint-disable-next-line @typescript-eslint/naming-convention export const DispatcherBusy = new ManualSignal(); /** starts the processing of the event queue. */ diff --git a/Extension/src/Utility/Eventing/interfaces.ts b/Extension/src/Utility/Eventing/interfaces.ts index 0165fcef12..4734aa21f6 100644 --- a/Extension/src/Utility/Eventing/interfaces.ts +++ b/Extension/src/Utility/Eventing/interfaces.ts @@ -3,8 +3,6 @@ * See 'LICENSE' in the project root for license information. * ------------------------------------------------------------------------------------------ */ -/* eslint-disable @typescript-eslint/naming-convention */ - export interface EventData { readonly name: string; completed?: Promise; diff --git a/Extension/src/Utility/Process/program.ts b/Extension/src/Utility/Process/program.ts index df6b042d0b..074d3ff1dc 100644 --- a/Extension/src/Utility/Process/program.ts +++ b/Extension/src/Utility/Process/program.ts @@ -3,7 +3,6 @@ * See 'LICENSE' in the project root for license information. * ------------------------------------------------------------------------------------------ */ -/* eslint-disable @typescript-eslint/naming-convention */ import { fail } from 'assert'; import { Factory } from '../Async/factory'; import { lazy } from '../Async/lazy'; diff --git a/Extension/src/Utility/Process/streams.ts b/Extension/src/Utility/Process/streams.ts index 6deb2a844c..2ce90013f4 100644 --- a/Extension/src/Utility/Process/streams.ts +++ b/Extension/src/Utility/Process/streams.ts @@ -180,7 +180,7 @@ export class LineIterator implements AsyncIterable, AsyncIterator> { do { // is the current line (regardless of whether it's full or not) a match diff --git a/Extension/src/Utility/System/finalize.ts b/Extension/src/Utility/System/finalize.ts index 28e3ad5ec0..b62434eeb5 100644 --- a/Extension/src/Utility/System/finalize.ts +++ b/Extension/src/Utility/System/finalize.ts @@ -18,7 +18,6 @@ export function ignore(fn: () => T | undefined) { } const finalized = new WeakSet(); -// eslint-disable-next-line @typescript-eslint/naming-convention export let ActiveFinalizers = Promise.resolve(); /** This closes/ends/stops/destroys/disposes of an object or a Promise diff --git a/Extension/src/Utility/System/guards.ts b/Extension/src/Utility/System/guards.ts index 0ada045c91..06e9130ad4 100644 --- a/Extension/src/Utility/System/guards.ts +++ b/Extension/src/Utility/System/guards.ts @@ -41,7 +41,6 @@ export class is { return !is.nullish(instance) && !!instance[Symbol.asyncIterator]; } - // eslint-disable-next-line @typescript-eslint/naming-convention static Constructor(instance: any): instance is Constructor { return typeof instance === 'function' && !!instance.prototype && !Object.getOwnPropertyNames(instance).includes('arguments') && instance.toString().match(/^function.*\{ \[native code\] \}|^class/g); } diff --git a/Extension/src/Utility/System/info.ts b/Extension/src/Utility/System/info.ts index b25a525194..ebbd532199 100644 --- a/Extension/src/Utility/System/info.ts +++ b/Extension/src/Utility/System/info.ts @@ -74,7 +74,7 @@ interface FunctionInfo { isAsync: boolean; /** a bound callable function for the member (saves us from having to do it later anyway) */ - // eslint-disable-next-line @typescript-eslint/ban-types + fn: Function; } diff --git a/Extension/src/Utility/Text/characterCodes.ts b/Extension/src/Utility/Text/characterCodes.ts index 8d661df58a..2077abcd33 100644 --- a/Extension/src/Utility/Text/characterCodes.ts +++ b/Extension/src/Utility/Text/characterCodes.ts @@ -3,7 +3,6 @@ * See 'LICENSE' in the project root for license information. * ------------------------------------------------------------------------------------------ */ -/* eslint-disable @typescript-eslint/naming-convention */ export const enum CharacterCodes { nullCharacter = 0, maxAsciiCharacter = 0x7F, diff --git a/Extension/src/Utility/Text/scanner.ts b/Extension/src/Utility/Text/scanner.ts index ff911e4099..6f90bfd826 100644 --- a/Extension/src/Utility/Text/scanner.ts +++ b/Extension/src/Utility/Text/scanner.ts @@ -971,7 +971,6 @@ export class Scanner implements Token { positionFromOffset(offset: number): Position { let position = { line: 0, column: 0, offset: 0 }; - // eslint-disable-next-line keyword-spacing if (offset < 0 || offset > this.#length) { return { line: position.line, column: position.column }; } diff --git a/Extension/test/common/selectTests.ts b/Extension/test/common/selectTests.ts index fc564b4f7f..1ad470056a 100644 --- a/Extension/test/common/selectTests.ts +++ b/Extension/test/common/selectTests.ts @@ -2,8 +2,6 @@ * Copyright (c) Microsoft Corporation. All Rights Reserved. * See 'LICENSE' in the project root for license information. * ------------------------------------------------------------------------------------------ */ -/* eslint-disable no-cond-assign */ -/* eslint-disable @typescript-eslint/no-unused-vars */ import { readdir } from 'fs/promises'; import { IOptions, glob as globSync } from 'glob'; diff --git a/Extension/test/scenarios/MultirootDeadlockTest/tests/inlayhints.test.ts b/Extension/test/scenarios/MultirootDeadlockTest/tests/inlayhints.test.ts index 56f4912f10..16cb6d2d1e 100644 --- a/Extension/test/scenarios/MultirootDeadlockTest/tests/inlayhints.test.ts +++ b/Extension/test/scenarios/MultirootDeadlockTest/tests/inlayhints.test.ts @@ -3,7 +3,7 @@ * See 'LICENSE' in the project root for license information. * ------------------------------------------------------------------------------------------ */ /* eslint-disable @typescript-eslint/no-non-null-assertion */ -/* eslint-disable @typescript-eslint/no-unused-vars */ + /* eslint-disable @typescript-eslint/triple-slash-reference */ /// diff --git a/Extension/test/scenarios/SimpleCppProject/tests/languageServer.integration.test.ts b/Extension/test/scenarios/SimpleCppProject/tests/languageServer.integration.test.ts index 20d591cf6c..aba365a28c 100644 --- a/Extension/test/scenarios/SimpleCppProject/tests/languageServer.integration.test.ts +++ b/Extension/test/scenarios/SimpleCppProject/tests/languageServer.integration.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All Rights Reserved. * See 'LICENSE' in the project root for license information. * ------------------------------------------------------------------------------------------ */ -/* eslint-disable @typescript-eslint/no-unused-vars */ + /* eslint-disable @typescript-eslint/triple-slash-reference */ /// diff --git a/Extension/test/unit/async.test.ts b/Extension/test/unit/async.test.ts index 85a633d593..12cddb5628 100644 --- a/Extension/test/unit/async.test.ts +++ b/Extension/test/unit/async.test.ts @@ -70,7 +70,6 @@ describe('AsyncFactory', () => { value.value = 200; }; - // eslint-disable-next-line @typescript-eslint/ban-types return value as () => number; }); const fn = await new f(); diff --git a/Extension/test/unit/commandLineParsing.test.ts b/Extension/test/unit/commandLineParsing.test.ts index 746d7811f6..a1882576e8 100644 --- a/Extension/test/unit/commandLineParsing.test.ts +++ b/Extension/test/unit/commandLineParsing.test.ts @@ -3,8 +3,6 @@ * See 'LICENSE' in the project root for license information. * ------------------------------------------------------------------------------------------ */ -/* eslint-disable @typescript-eslint/no-unused-vars */ - import { deepEqual, throws } from 'assert'; import { describe } from 'mocha'; import { extractArgs } from '../../src/Utility/Process/commandLine'; diff --git a/Extension/test/unit/eventing.test.ts b/Extension/test/unit/eventing.test.ts index a3502bb714..537cf94ab5 100644 --- a/Extension/test/unit/eventing.test.ts +++ b/Extension/test/unit/eventing.test.ts @@ -3,8 +3,6 @@ * See 'LICENSE' in the project root for license information. * ------------------------------------------------------------------------------------------ */ -/* eslint-disable @typescript-eslint/no-unused-vars */ - import { ok, strictEqual } from 'assert'; import { beforeEach, describe, it } from 'mocha'; import { Async } from '../../src/Utility/Async/constructor'; @@ -55,7 +53,7 @@ class Something extends SomeBase { } // make an async constructor for the Something class -// eslint-disable-next-line @typescript-eslint/naming-convention + const AsyncSomething = Async(Something); describe('Event Emitters', () => { diff --git a/Extension/test/unit/examples/someclass.ts b/Extension/test/unit/examples/someclass.ts index 69ef091a9f..cf1af67aad 100644 --- a/Extension/test/unit/examples/someclass.ts +++ b/Extension/test/unit/examples/someclass.ts @@ -6,7 +6,6 @@ import { Async } from '../../../src/Utility/Async/constructor'; import { sleep } from '../../../src/Utility/Async/sleep'; -/* eslint-disable @typescript-eslint/naming-convention */ export const Something = Async(class Something { hasBeenInitialized: boolean = false; constructor(public num: number) { diff --git a/Extension/ui/settings.ts b/Extension/ui/settings.ts index 61725b6248..2f4a222ad7 100644 --- a/Extension/ui/settings.ts +++ b/Extension/ui/settings.ts @@ -385,5 +385,4 @@ class SettingsApp { } } -// eslint-disable-next-line @typescript-eslint/no-unused-vars export const app: SettingsApp = new SettingsApp(); From 76fce67276a325d4c01fcfbb105539c8635fdade Mon Sep 17 00:00:00 2001 From: Marcin Strzyz <37447884+mastrzyz@users.noreply.github.com> Date: Tue, 29 Aug 2023 18:05:33 -0700 Subject: [PATCH 07/15] Added typing guards. (#11382) --- Extension/ui/settings.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Extension/ui/settings.ts b/Extension/ui/settings.ts index 2f4a222ad7..a1cb555448 100644 --- a/Extension/ui/settings.ts +++ b/Extension/ui/settings.ts @@ -81,8 +81,12 @@ class SettingsApp { // Set view state of advanced settings and add event const oldState: any = this.vsCodeApi.getState(); const advancedShown: boolean = oldState && oldState.advancedShown; - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - document.getElementById(elementId.advancedSection)!.style.display = advancedShown ? "block" : "none"; + + const advancedSection: HTMLElement | null = document.getElementById(elementId.advancedSection); + if (advancedSection) { + advancedSection.style.display = advancedShown ? "block" : "none"; + } + document.getElementById(elementId.showAdvanced)?.classList.toggle(advancedShown ? "collapse" : "expand", true); document.getElementById(elementId.showAdvanced)?.addEventListener("click", this.onShowAdvanced.bind(this)); this.vsCodeApi.postMessage({ From 0cd369c60318b5c9e734a578ab1536fe4e02ee39 Mon Sep 17 00:00:00 2001 From: Marcin Strzyz <37447884+mastrzyz@users.noreply.github.com> Date: Wed, 30 Aug 2023 13:04:01 -0700 Subject: [PATCH 08/15] Incremental. (#11383) --- Extension/.eslintrc.js | 1 + Extension/src/Debugger/debugAdapterDescriptorFactory.ts | 6 ------ Extension/src/LanguageServer/cppBuildTaskProvider.ts | 2 -- Extension/src/SSH/commandInteractors.ts | 2 -- Extension/test/unit/examples/someclass.ts | 3 --- 5 files changed, 1 insertion(+), 13 deletions(-) diff --git a/Extension/.eslintrc.js b/Extension/.eslintrc.js index 3e74a06850..0e1052f310 100644 --- a/Extension/.eslintrc.js +++ b/Extension/.eslintrc.js @@ -66,6 +66,7 @@ module.exports = { "arrow-spacing": ["error", { "before": true, "after": true }], "semi-spacing": ["error", { "before": false, "after": true }], "no-extra-parens": ["error", "all", { "nestedBinaryExpressions": false, "ternaryOperandBinaryExpressions": false }], + "@typescript-eslint/no-useless-constructor": "error", "@typescript-eslint/no-for-in-array": "error", "@typescript-eslint/no-misused-new": "error", "@typescript-eslint/no-misused-promises": "error", diff --git a/Extension/src/Debugger/debugAdapterDescriptorFactory.ts b/Extension/src/Debugger/debugAdapterDescriptorFactory.ts index 735bc4a27f..cf41e2d21c 100644 --- a/Extension/src/Debugger/debugAdapterDescriptorFactory.ts +++ b/Extension/src/Debugger/debugAdapterDescriptorFactory.ts @@ -26,9 +26,6 @@ abstract class AbstractDebugAdapterDescriptorFactory implements vscode.DebugAdap } export class CppdbgDebugAdapterDescriptorFactory extends AbstractDebugAdapterDescriptorFactory { - constructor(context: vscode.ExtensionContext) { - super(context); - } async createDebugAdapterDescriptor(_session: vscode.DebugSession, _executable?: vscode.DebugAdapterExecutable): Promise { const adapter: string = "./debugAdapters/bin/OpenDebugAD7" + (os.platform() === 'win32' ? ".exe" : ""); @@ -40,9 +37,6 @@ export class CppdbgDebugAdapterDescriptorFactory extends AbstractDebugAdapterDes } export class CppvsdbgDebugAdapterDescriptorFactory extends AbstractDebugAdapterDescriptorFactory { - constructor(context: vscode.ExtensionContext) { - super(context); - } async createDebugAdapterDescriptor(_session: vscode.DebugSession, _executable?: vscode.DebugAdapterExecutable): Promise { if (os.platform() !== 'win32') { diff --git a/Extension/src/LanguageServer/cppBuildTaskProvider.ts b/Extension/src/LanguageServer/cppBuildTaskProvider.ts index edc1ceab3e..3c2352fec3 100644 --- a/Extension/src/LanguageServer/cppBuildTaskProvider.ts +++ b/Extension/src/LanguageServer/cppBuildTaskProvider.ts @@ -39,8 +39,6 @@ interface BuildOptions { export class CppBuildTaskProvider implements TaskProvider { static CppBuildScriptType: string = 'cppbuild'; - constructor() { } - public async provideTasks(): Promise { return this.getTasks(false); } diff --git a/Extension/src/SSH/commandInteractors.ts b/Extension/src/SSH/commandInteractors.ts index 8c549f2b95..01f4808d16 100644 --- a/Extension/src/SSH/commandInteractors.ts +++ b/Extension/src/SSH/commandInteractors.ts @@ -46,8 +46,6 @@ export interface IInteractor { export class MitmInteractor implements IInteractor { static ID = 'mitm'; - constructor() { } - get id(): string { return MitmInteractor.ID; } diff --git a/Extension/test/unit/examples/someclass.ts b/Extension/test/unit/examples/someclass.ts index cf1af67aad..1831aa1c23 100644 --- a/Extension/test/unit/examples/someclass.ts +++ b/Extension/test/unit/examples/someclass.ts @@ -48,9 +48,6 @@ export const AnotherTwo = Async(class AnotherTwo { this.works = true; } works = false; - constructor() { - - } }); export const AnotherThree = Async(class AnotherThree extends AnotherTwo.class { From 44e2a0ec4c11f9d313b7bee0f95371601c30cc68 Mon Sep 17 00:00:00 2001 From: Marcin Strzyz <37447884+mastrzyz@users.noreply.github.com> Date: Wed, 30 Aug 2023 13:12:41 -0700 Subject: [PATCH 09/15] added enforcement of no array constructor. (#11385) --- Extension/.eslintrc.js | 1 + Extension/src/Debugger/configurationProvider.ts | 2 +- Extension/src/LanguageServer/cppBuildTaskProvider.ts | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Extension/.eslintrc.js b/Extension/.eslintrc.js index 0e1052f310..d7d8b9c950 100644 --- a/Extension/.eslintrc.js +++ b/Extension/.eslintrc.js @@ -66,6 +66,7 @@ module.exports = { "arrow-spacing": ["error", { "before": true, "after": true }], "semi-spacing": ["error", { "before": false, "after": true }], "no-extra-parens": ["error", "all", { "nestedBinaryExpressions": false, "ternaryOperandBinaryExpressions": false }], + "@typescript-eslint/no-array-constructor": "error", "@typescript-eslint/no-useless-constructor": "error", "@typescript-eslint/no-for-in-array": "error", "@typescript-eslint/no-misused-new": "error", diff --git a/Extension/src/Debugger/configurationProvider.ts b/Extension/src/Debugger/configurationProvider.ts index 575414f6bd..316c877377 100644 --- a/Extension/src/Debugger/configurationProvider.ts +++ b/Extension/src/Debugger/configurationProvider.ts @@ -839,7 +839,7 @@ export class DebugConfigurationProvider implements vscode.DebugConfigurationProv } const rawLaunchJson: any = await this.getRawLaunchJson(); if (!rawLaunchJson.configurations) { - rawLaunchJson.configurations = new Array(); + rawLaunchJson.configurations = []; } if (!rawLaunchJson.version) { rawLaunchJson.version = "2.0.0"; diff --git a/Extension/src/LanguageServer/cppBuildTaskProvider.ts b/Extension/src/LanguageServer/cppBuildTaskProvider.ts index 3c2352fec3..596160a996 100644 --- a/Extension/src/LanguageServer/cppBuildTaskProvider.ts +++ b/Extension/src/LanguageServer/cppBuildTaskProvider.ts @@ -220,7 +220,7 @@ export class CppBuildTaskProvider implements TaskProvider { public async getJsonTasks(): Promise { const rawJson: any = await this.getRawTasksJson(); - const rawTasksJson: any = !rawJson.tasks ? new Array() : rawJson.tasks; + const rawTasksJson: any = !rawJson.tasks ? [] : rawJson.tasks; const buildTasksJson: CppBuildTask[] = rawTasksJson.map((task: any) => { if (!task.label || !task.type || task.type !== CppBuildTaskProvider.CppBuildScriptType) { return null; @@ -259,7 +259,7 @@ export class CppBuildTaskProvider implements TaskProvider { public async writeBuildTask(taskLabel: string, workspaceFolder?: WorkspaceFolder, setAsDefault: boolean = false): Promise { const rawTasksJson: any = await this.getRawTasksJson(workspaceFolder); if (!rawTasksJson.tasks) { - rawTasksJson.tasks = new Array(); + rawTasksJson.tasks = []; } // Check if the task exists in the user's task.json. if (rawTasksJson.tasks.find((task: any) => task.label && task.label === taskLabel)) { From d949d9392415405f59ee21c788767a4f4974adfe Mon Sep 17 00:00:00 2001 From: Garrett Serack Date: Thu, 31 Aug 2023 09:26:55 -0700 Subject: [PATCH 10/15] Apply strict eslint rule (#11389) --- Extension/.eslintrc.js | 6 ++++-- Extension/.scripts/common.ts | 2 +- Extension/.scripts/generateOptionsSchema.ts | 4 ++-- Extension/src/Debugger/configurationProvider.ts | 1 + Extension/src/LanguageServer/client.ts | 9 +++------ Extension/src/LanguageServer/configurations.ts | 14 +++++++------- .../src/LanguageServer/cppBuildTaskProvider.ts | 2 +- Extension/src/LanguageServer/settingsTracker.ts | 2 +- Extension/src/SSH/sshCommandToConfig.ts | 2 +- Extension/src/Utility/Eventing/emitter.ts | 2 +- Extension/src/Utility/Eventing/interfaces.ts | 2 +- Extension/src/Utility/Process/process.ts | 1 + Extension/src/Utility/Sandbox/sandbox.ts | 1 + Extension/src/Utility/System/guards.ts | 1 + Extension/src/Utility/System/info.ts | 1 + Extension/src/Utility/Text/scanner.ts | 2 ++ Extension/src/types/posix-getopt.d.ts | 2 +- .../SingleRootProject/tests/common.test.ts | 1 + Extension/test/unit/commandLineParsing.test.ts | 6 +++--- Extension/ui/settings.ts | 6 +++--- 20 files changed, 37 insertions(+), 30 deletions(-) diff --git a/Extension/.eslintrc.js b/Extension/.eslintrc.js index d7d8b9c950..3c6da613d2 100644 --- a/Extension/.eslintrc.js +++ b/Extension/.eslintrc.js @@ -1,8 +1,8 @@ module.exports = { "extends": [ "eslint:recommended", - "plugin:@typescript-eslint/eslint-recommended" - //"plugin:@typescript-eslint/strict", // I want to enable this. Lots of little changes will happen. + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/strict", ], "env": { "browser": true, @@ -59,6 +59,8 @@ module.exports = { } } ], + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-extraneous-class": "off", "no-case-declarations": "off", "no-useless-escape": "off", "no-floating-decimal": "error", diff --git a/Extension/.scripts/common.ts b/Extension/.scripts/common.ts index c3be3b6d69..a15fba4809 100644 --- a/Extension/.scripts/common.ts +++ b/Extension/.scripts/common.ts @@ -152,7 +152,7 @@ export async function read(filename: string) { return content.toString(); } -export async function readJson(filename: string, fallback?: {}): Promise { +export async function readJson(filename: string, fallback = {}): Promise { try { return parse(await read(filename)); } catch { diff --git a/Extension/.scripts/generateOptionsSchema.ts b/Extension/.scripts/generateOptionsSchema.ts index 8200761b27..b6c9a2029b 100644 --- a/Extension/.scripts/generateOptionsSchema.ts +++ b/Extension/.scripts/generateOptionsSchema.ts @@ -56,7 +56,7 @@ function updateDefaults(object: any, defaults: any): any { function refReplace(definitions: any, ref: any): any { // $ref is formatted as "#/definitions/ObjectName" - const referenceStringArray: string[] = ref['$ref'].split('/'); + const referenceStringArray: string[] = ref.$ref.split('/'); // Getting "ObjectName" const referenceName: string = referenceStringArray[referenceStringArray.length - 1]; @@ -71,7 +71,7 @@ function refReplace(definitions: any, ref: any): any { ref = appendFieldsToObject(reference, ref); // Remove $ref field - delete ref['$ref']; + delete ref.$ref; return ref; } diff --git a/Extension/src/Debugger/configurationProvider.ts b/Extension/src/Debugger/configurationProvider.ts index 316c877377..ab329b60cb 100644 --- a/Extension/src/Debugger/configurationProvider.ts +++ b/Extension/src/Debugger/configurationProvider.ts @@ -661,6 +661,7 @@ export class DebugConfigurationProvider implements vscode.DebugConfigurationProv const newSourceFileMapSource: string = util.resolveVariables(sourceFileMapSource, undefined); if (sourceFileMapSource !== newSourceFileMapSource) { message = "\t" + localize("replacing.sourcepath", "Replacing {0} '{1}' with '{2}'.", "sourcePath", sourceFileMapSource, newSourceFileMapSource); + // eslint-disable-next-line @typescript-eslint/no-dynamic-delete delete config.sourceFileMap[sourceFileMapSource]; source = newSourceFileMapSource; } diff --git a/Extension/src/LanguageServer/client.ts b/Extension/src/LanguageServer/client.ts index 2422d9e779..a943c14f5b 100644 --- a/Extension/src/LanguageServer/client.ts +++ b/Extension/src/LanguageServer/client.ts @@ -461,12 +461,9 @@ enum SemanticTokenTypes { enum SemanticTokenModifiers { // These are camelCase as the enum names are used directly as strings in our legend. - // eslint-disable-next-line no-bitwise - static = (1 << 0), - // eslint-disable-next-line no-bitwise - global = (1 << 1), - // eslint-disable-next-line no-bitwise - local = (1 << 2) + static = 0b001, + global = 0b010, + local = 0b100 } interface IntelliSenseSetup { diff --git a/Extension/src/LanguageServer/configurations.ts b/Extension/src/LanguageServer/configurations.ts index 0c240df5ca..54c05e4184 100644 --- a/Extension/src/LanguageServer/configurations.ts +++ b/Extension/src/LanguageServer/configurations.ts @@ -494,7 +494,7 @@ export class CppProperties { for (const [dep, execCmd] of nodeAddonMap) { if (dep in packageJson.dependencies) { try { - let stdout: string | void = await util.execChildProcess(execCmd, rootPath); + let stdout: string = await util.execChildProcess(execCmd, rootPath); if (!stdout) { continue; } @@ -1413,12 +1413,12 @@ export class CppProperties { // Remove disallowed variable overrides if (this.configurationJson.env) { - delete this.configurationJson.env['workspaceRoot']; - delete this.configurationJson.env['workspaceFolder']; - delete this.configurationJson.env['workspaceFolderBasename']; - delete this.configurationJson.env['execPath']; - delete this.configurationJson.env['pathSeparator']; - delete this.configurationJson.env['default']; + delete this.configurationJson.env.workspaceRoot; + delete this.configurationJson.env.workspaceFolder; + delete this.configurationJson.env.workspaceFolderBasename; + delete this.configurationJson.env.execPath; + delete this.configurationJson.env.pathSeparator; + delete this.configurationJson.env.default; } // Warning: There is a chance that this is incorrect in the event that the c_cpp_properties.json file was created before diff --git a/Extension/src/LanguageServer/cppBuildTaskProvider.ts b/Extension/src/LanguageServer/cppBuildTaskProvider.ts index 596160a996..0192f6465b 100644 --- a/Extension/src/LanguageServer/cppBuildTaskProvider.ts +++ b/Extension/src/LanguageServer/cppBuildTaskProvider.ts @@ -138,7 +138,7 @@ export class CppBuildTaskProvider implements TaskProvider { (path.basename(info.path) === "cl.exe") && compiler_condition(info)); knownCompilers = knownCompilers.filter(info => (info === cl_to_add) || (path.basename(info.path) !== "cl.exe" && compiler_condition(info))); - knownCompilers.map(info => { + knownCompilers.forEach(info => { knownCompilerPathsSet.add(info.path); }); } diff --git a/Extension/src/LanguageServer/settingsTracker.ts b/Extension/src/LanguageServer/settingsTracker.ts index 78cd92ec6e..f9c04f2569 100644 --- a/Extension/src/LanguageServer/settingsTracker.ts +++ b/Extension/src/LanguageServer/settingsTracker.ts @@ -49,7 +49,7 @@ export class SettingsTracker { } // Iterate through dotted "sub" settings. - const collectSettingsRecursive = (key: string, val: Object, depth: number) => { + const collectSettingsRecursive = (key: string, val: Record, depth: number) => { if (depth > 4) { // Limit settings recursion to 4 dots (not counting the first one in: `C_Cpp.`) return; diff --git a/Extension/src/SSH/sshCommandToConfig.ts b/Extension/src/SSH/sshCommandToConfig.ts index b23ecf50e4..0a610dcf4e 100644 --- a/Extension/src/SSH/sshCommandToConfig.ts +++ b/Extension/src/SSH/sshCommandToConfig.ts @@ -177,7 +177,7 @@ function parseFlags(input: string[], entries: { [key: string]: string }): number // eslint-disable-next-line no-constant-condition while (true) { - const next: void | IParsedOption = parser.getopt(); + const next: IParsedOption | undefined = parser.getopt(); if (!next) { break; } diff --git a/Extension/src/Utility/Eventing/emitter.ts b/Extension/src/Utility/Eventing/emitter.ts index 1892513cb8..36324c94a1 100644 --- a/Extension/src/Utility/Eventing/emitter.ts +++ b/Extension/src/Utility/Eventing/emitter.ts @@ -84,7 +84,7 @@ export abstract class Emitter { * @param eventName - the string name of the event * @param options - options for the event trigger */ - protected newEvent(eventName: string, options?: EventOptions): () => Promise; + protected newEvent(eventName: string, options?: EventOptions): () => Promise; /** * Creates a named event function for triggering events in an {@link Emitter} diff --git a/Extension/src/Utility/Eventing/interfaces.ts b/Extension/src/Utility/Eventing/interfaces.ts index 4734aa21f6..c7fdac8dca 100644 --- a/Extension/src/Utility/Eventing/interfaces.ts +++ b/Extension/src/Utility/Eventing/interfaces.ts @@ -18,7 +18,7 @@ export interface Descriptor { export type Unsubscribe = () => void; -export type Callback = (event: EventData, ...args: any[]) => Promise | Promise | Promise | TOutput | EventStatus | undefined | void | Promise; +export type Callback = (event: EventData, ...args: any[]) => Promise | Promise | Promise | TOutput | EventStatus | undefined | Promise; export type PickByType = { [P in keyof T as T[P] extends TKeepType ? P : never]: T[P] diff --git a/Extension/src/Utility/Process/process.ts b/Extension/src/Utility/Process/process.ts index eb09026e6f..248311b12d 100644 --- a/Extension/src/Utility/Process/process.ts +++ b/Extension/src/Utility/Process/process.ts @@ -5,6 +5,7 @@ /* eslint-disable @typescript-eslint/naming-convention */ /* eslint-disable @typescript-eslint/unified-signatures */ +/* eslint-disable @typescript-eslint/no-unsafe-declaration-merging */ import { ChildProcess, spawn } from 'child_process'; import { basename, resolve } from 'path'; diff --git a/Extension/src/Utility/Sandbox/sandbox.ts b/Extension/src/Utility/Sandbox/sandbox.ts index 6c588b20da..6e8d16ca60 100644 --- a/Extension/src/Utility/Sandbox/sandbox.ts +++ b/Extension/src/Utility/Sandbox/sandbox.ts @@ -23,6 +23,7 @@ export function createSandbox(): (code: string, context?: any) => T { sandbox ); for (const key of Object.keys(context)) { + // eslint-disable-next-line @typescript-eslint/no-dynamic-delete delete sandbox[key]; } } else { diff --git a/Extension/src/Utility/System/guards.ts b/Extension/src/Utility/System/guards.ts index 06e9130ad4..4dbec77d83 100644 --- a/Extension/src/Utility/System/guards.ts +++ b/Extension/src/Utility/System/guards.ts @@ -61,6 +61,7 @@ export class is { return instance instanceof Socket; } + // eslint-disable-next-line @typescript-eslint/ban-types static function(instance: any): instance is Function { return typeof instance === 'function'; } diff --git a/Extension/src/Utility/System/info.ts b/Extension/src/Utility/System/info.ts index ebbd532199..3f3690dc24 100644 --- a/Extension/src/Utility/System/info.ts +++ b/Extension/src/Utility/System/info.ts @@ -75,6 +75,7 @@ interface FunctionInfo { /** a bound callable function for the member (saves us from having to do it later anyway) */ + // eslint-disable-next-line @typescript-eslint/ban-types fn: Function; } diff --git a/Extension/src/Utility/Text/scanner.ts b/Extension/src/Utility/Text/scanner.ts index 6f90bfd826..aaa683d0cf 100644 --- a/Extension/src/Utility/Text/scanner.ts +++ b/Extension/src/Utility/Text/scanner.ts @@ -117,9 +117,11 @@ export enum Kind { Comma, QuestionDot, LessThan, + // eslint-disable-next-line @typescript-eslint/prefer-literal-enum-member OpenAngle = LessThan, LessThanSlash, GreaterThan, + // eslint-disable-next-line @typescript-eslint/prefer-literal-enum-member CloseAngle = GreaterThan, LessThanEquals, GreaterThanEquals, diff --git a/Extension/src/types/posix-getopt.d.ts b/Extension/src/types/posix-getopt.d.ts index 2d4fbbd2c8..a6215de959 100644 --- a/Extension/src/types/posix-getopt.d.ts +++ b/Extension/src/types/posix-getopt.d.ts @@ -13,7 +13,7 @@ declare module 'posix-getopt' { export class BasicParser { constructor(template: string, arguments: readonly string[], skipArgs?: number); - getopt(): IParsedOption | void; + getopt(): IParsedOption | undefined; optind(): number; } } diff --git a/Extension/test/scenarios/SingleRootProject/tests/common.test.ts b/Extension/test/scenarios/SingleRootProject/tests/common.test.ts index 10032e7d8b..67dedc425f 100644 --- a/Extension/test/scenarios/SingleRootProject/tests/common.test.ts +++ b/Extension/test/scenarios/SingleRootProject/tests/common.test.ts @@ -62,6 +62,7 @@ suite("resolveVariables", () => { process.env[processKey] = "bar"; actual = resolveVariables(input, {}); } finally { + // eslint-disable-next-line @typescript-eslint/no-dynamic-delete delete process.env[processKey]; } assert.equal(actual, "foobar"); diff --git a/Extension/test/unit/commandLineParsing.test.ts b/Extension/test/unit/commandLineParsing.test.ts index a1882576e8..71315d68f4 100644 --- a/Extension/test/unit/commandLineParsing.test.ts +++ b/Extension/test/unit/commandLineParsing.test.ts @@ -179,9 +179,9 @@ describe('Command Lines', () => { } if (variable !== undefined) { - process.env['var'] = variable; + process.env.var = variable; } else { - delete process.env['var']; + delete process.env.var; } stop = true; @@ -203,7 +203,7 @@ describe('Command Lines', () => { if (variable !== undefined) { process.env['var'] = variable; } else { - delete process.env['var']; + delete process.env.var; } stop = true; diff --git a/Extension/ui/settings.ts b/Extension/ui/settings.ts index a1cb555448..c139ba75ac 100644 --- a/Extension/ui/settings.ts +++ b/Extension/ui/settings.ts @@ -56,9 +56,9 @@ const elementId: { [key: string]: string } = { }; interface VsCodeApi { - postMessage(msg: {}): void; - setState(state: {}): void; - getState(): {}; + postMessage(msg: Record): void; + setState(state: Record): void; + getState(): any; } declare function acquireVsCodeApi(): VsCodeApi; From 4199155228665225d31964f15ff3cb8989e0bd3d Mon Sep 17 00:00:00 2001 From: Sean McManus Date: Thu, 31 Aug 2023 12:56:15 -0700 Subject: [PATCH 11/15] Update TPN. (#11393) --- Extension/ThirdPartyNotices.txt | 94 +++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) diff --git a/Extension/ThirdPartyNotices.txt b/Extension/ThirdPartyNotices.txt index ab39917709..075add9379 100644 --- a/Extension/ThirdPartyNotices.txt +++ b/Extension/ThirdPartyNotices.txt @@ -2010,6 +2010,37 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +--------------------------------------------------------- + +--------------------------------------------------------- + +nanoid 3.3.6 - MIT +https://github.com/ai/nanoid#readme + +Copyright 2017 Andrey Sitnik + +The MIT License (MIT) + +Copyright 2017 Andrey Sitnik + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + --------------------------------------------------------- --------------------------------------------------------- @@ -2047,6 +2078,11 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. node-stream-zip 1.15.0 - MIT https://github.com/antelle/node-stream-zip +Copyright (c) 2021 Antelle https://github.com/antelle +(c) 2020 Antelle https://github.com/antelle/node-stream-zip/blob/master/LICENSE +Copyright (c) 2012 Another-D-Mention Software and other contributors, http://www.another-d-mention.ro +Portions copyright https://github.com/cthackers/adm-zip https://raw.githubusercontent.com/cthackers/adm-zip/master/LICENSE + Copyright (c) 2021 Antelle https://github.com/antelle Permission is hereby granted, free of charge, to any person obtaining @@ -2068,6 +2104,29 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +== dependency license: adm-zip == + +Copyright (c) 2012 Another-D-Mention Software and other contributors, +http://www.another-d-mention.ro/ + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------- @@ -2168,6 +2227,41 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +--------------------------------------------------------- + +--------------------------------------------------------- + +plist 3.1.0 - MIT +https://github.com/TooTallNate/node-plist#readme + +Copyright (c) 2010-2017 Nathan Rajlich + +(The MIT License) + +Copyright (c) 2010-2017 Nathan Rajlich + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + + --------------------------------------------------------- --------------------------------------------------------- From efa5c2244bc643c5ef80b363596fcdb4610d75d4 Mon Sep 17 00:00:00 2001 From: browntarik <111317156+browntarik@users.noreply.github.com> Date: Tue, 5 Sep 2023 13:35:11 -0700 Subject: [PATCH 12/15] Rework Database Storage Path Logic (#11309) * Fix typo (#11275) * rework database logic * resolve PR * fix lint issues * resolve PR * resolve PR * resolve PR * resolve PR * update names * resolve PR * resolve PR * fix lint error * resolve PR * resolve PR --- Extension/src/LanguageServer/client.ts | 40 +++++++++++++++----------- Extension/src/common.ts | 24 ++++++++++++++++ 2 files changed, 47 insertions(+), 17 deletions(-) diff --git a/Extension/src/LanguageServer/client.ts b/Extension/src/LanguageServer/client.ts index a943c14f5b..0ad18deaf4 100644 --- a/Extension/src/LanguageServer/client.ts +++ b/Extension/src/LanguageServer/client.ts @@ -42,7 +42,8 @@ import { localizedStringCount, lookupString } from '../nativeStrings'; import * as telemetry from '../telemetry'; import { TestHook, getTestHook } from '../testHook'; import { - CodeAnalysisDiagnosticIdentifiersAndUri, RegisterCodeAnalysisNotifications, + CodeAnalysisDiagnosticIdentifiersAndUri, + RegisterCodeAnalysisNotifications, RemoveCodeAnalysisProblemsParams, removeAllCodeAnalysisProblems, removeCodeAnalysisProblems @@ -97,6 +98,7 @@ interface ConfigStateReceived { let displayedSelectCompiler: boolean = false; let secondPromptCounter: number = 0; let scanForCompilersDone: boolean = false; +let workspaceHash: string = ""; let workspaceDisposables: vscode.Disposable[] = []; export let workspaceReferences: refs.ReferencesManager; @@ -539,7 +541,9 @@ export interface TextDocumentWillSaveParams { interface InitializationOptions { packageVersion: string; extensionPath: string; - storagePath: string; + cacheStoragePath: string; + workspaceStoragePath: string; + databaseStoragePath: string; freeMemory: number; vcpkgRoot: string; intelliSenseCacheDisabled: boolean; @@ -821,7 +825,7 @@ export class DefaultClient implements Client { private rootPathFileWatcher?: vscode.FileSystemWatcher; private rootFolder?: vscode.WorkspaceFolder; private rootRealPath: string; - private storagePath: string; + private workspaceStoragePath: string; private trackedDocuments = new Set(); private isSupported: boolean = true; private inactiveRegionsDecorations = new Map(); @@ -916,7 +920,7 @@ export class DefaultClient implements Client { public get AdditionalEnvironment(): { [key: string]: string | string[] } { return { workspaceFolderBasename: this.Name, - workspaceStorage: this.storagePath, + workspaceStorage: this.workspaceStoragePath, execPath: process.execPath, pathSeparator: (os.platform() === 'win32') ? "\\" : "/" }; @@ -1285,21 +1289,17 @@ export class DefaultClient implements Client { this.rootFolder = workspaceFolder; this.rootRealPath = this.RootPath ? fs.existsSync(this.RootPath) ? fs.realpathSync(this.RootPath) : this.RootPath : ""; - let storagePath: string | undefined; - if (util.extensionContext) { - const path: string | undefined = util.extensionContext.storageUri?.fsPath; - if (path) { - storagePath = path; - } + this.workspaceStoragePath = util.extensionContext?.storageUri?.fsPath ?? ""; + if (this.workspaceStoragePath.length > 0) { + workspaceHash = path.basename(path.dirname(this.workspaceStoragePath)); + } else { + this.workspaceStoragePath = this.RootPath ? path.join(this.RootPath, ".vscode") : ""; } - if (!storagePath) { - storagePath = this.RootPath ? path.join(this.RootPath, "/.vscode") : ""; - } if (workspaceFolder && vscode.workspace.workspaceFolders && vscode.workspace.workspaceFolders.length > 1) { - storagePath = path.join(storagePath, util.getUniqueWorkspaceStorageName(workspaceFolder)); + this.workspaceStoragePath = path.join(this.workspaceStoragePath, util.getUniqueWorkspaceStorageName(workspaceFolder)); } - this.storagePath = storagePath; + const rootUri: vscode.Uri | undefined = this.RootUri; this.settingsTracker = new SettingsTracker(rootUri); @@ -1622,10 +1622,16 @@ export class DefaultClient implements Client { currentCaseSensitiveFileSupport.Value = workspaceSettings.caseSensitiveFileSupport; } + const cacheStoragePath: string = util.getCacheStoragePath(); + const databaseStoragePath: string = (cacheStoragePath.length > 0) && (workspaceHash.length > 0) ? + path.join(cacheStoragePath, workspaceHash) : ""; + const initializationOptions: InitializationOptions = { packageVersion: util.packageJson.version, extensionPath: util.extensionPath, - storagePath: this.storagePath, + databaseStoragePath: databaseStoragePath, + workspaceStoragePath: this.workspaceStoragePath, + cacheStoragePath: cacheStoragePath, freeMemory: Math.floor(os.freemem() / 1048576), vcpkgRoot: util.getVcpkgRoot(), intelliSenseCacheDisabled: intelliSenseCacheDisabled, @@ -2029,7 +2035,7 @@ export class DefaultClient implements Client { const response: QueryTranslationUnitSourceResult = await this.languageClient.sendRequest(QueryTranslationUnitSourceRequest, params); if (!response.candidates || response.candidates.length === 0) { - // If we didn't receive any candidates, no configuration is needed. + // If we didn't receive any candidates, no configuration is needed. onFinished(); DefaultClient.isStarted.resolve(); return; diff --git a/Extension/src/common.ts b/Extension/src/common.ts index b7ff8d3e04..e6fabeb63c 100644 --- a/Extension/src/common.ts +++ b/Extension/src/common.ts @@ -1303,6 +1303,30 @@ export function isValidIdentifier(candidate: string): boolean { return true; } +export function getCacheStoragePath(): string { + let defaultCachePath: string = ""; + let pathEnvironmentVariable: string | undefined; + switch (os.platform()) { + case 'win32': + defaultCachePath = "Microsoft\\vscode-cpptools\\"; + pathEnvironmentVariable = process.env["LOCALAPPDATA"]; + break; + case 'darwin': + defaultCachePath = "Library/Caches/vscode-cpptools/"; + pathEnvironmentVariable = os.homedir(); + break; + default: // Linux + defaultCachePath = "vscode-cpptools/"; + pathEnvironmentVariable = process.env["XDG_CACHE_HOME"]; + if (!pathEnvironmentVariable) { + pathEnvironmentVariable = os.homedir(); + } + break; + } + + return pathEnvironmentVariable ? path.join(pathEnvironmentVariable, defaultCachePath) : ""; +} + function getUniqueWorkspaceNameHelper(workspaceFolder: vscode.WorkspaceFolder, addSubfolder: boolean): string { const workspaceFolderName: string = workspaceFolder ? workspaceFolder.name : "untitled"; if (!workspaceFolder || workspaceFolder.index < 1) { From b4a70dfc0a7d87ff1355b759f1d5db282b9de097 Mon Sep 17 00:00:00 2001 From: Garrett Serack Date: Wed, 6 Sep 2023 07:47:36 -0700 Subject: [PATCH 13/15] Make `yarn` tasks imply `yarn install` where appropriate (#11394) * made sure that yarn install gets called before compile * Add some nice messages * better detection * cleaned up more * more tweaks * remove old checks * let unit tests run without binaries * turn off scenario tests until binaries can be installed * add another rule --- .github/workflows/ci_linux.yml | 13 +-- .github/workflows/ci_mac.yml | 13 +-- .github/workflows/ci_windows.yml | 9 +- Extension/.eslintrc.js | 1 + Extension/.scripts/code.ts | 4 +- Extension/.scripts/common.ts | 85 +++++++++++++++---- Extension/.scripts/test.ts | 14 ++- Extension/.scripts/verify.ts | 45 +++++++++- Extension/package.json | 19 +++-- .../test/unit/commandLineParsing.test.ts | 2 +- 10 files changed, 156 insertions(+), 49 deletions(-) diff --git a/.github/workflows/ci_linux.yml b/.github/workflows/ci_linux.yml index f6efb06813..9a0ff489f8 100644 --- a/.github/workflows/ci_linux.yml +++ b/.github/workflows/ci_linux.yml @@ -34,11 +34,14 @@ jobs: run: yarn test working-directory: Extension - - name: Run simple vscode unit tests - uses: GabrielBB/xvfb-action@v1.6 - with: - run: yarn test --scenario=SingleRootProject - working-directory: Extension +# # NOTE : We can't run the test that require the native binary files +# # yet -- there will be an update soon that allows the tester to +# # acquire them on-the-fly +# - name: Run simple vscode unit tests +# uses: GabrielBB/xvfb-action@v1.6 +# with: +# run: yarn test --scenario=SingleRootProject +# working-directory: Extension # - name: Run languageServer integration tests # uses: GabrielBB/xvfb-action@v1.6 diff --git a/.github/workflows/ci_mac.yml b/.github/workflows/ci_mac.yml index 268ad872a8..ce221d3bb0 100644 --- a/.github/workflows/ci_mac.yml +++ b/.github/workflows/ci_mac.yml @@ -34,11 +34,14 @@ jobs: run: yarn test working-directory: Extension - - name: Run simple vscode unit tests - uses: GabrielBB/xvfb-action@v1.6 - with: - run: yarn test --scenario=SingleRootProject - working-directory: Extension +# # NOTE : We can't run the test that require the native binary files +# # yet -- there will be an update soon that allows the tester to +# # acquire them on-the-fly +# - name: Run simple vscode unit tests +# uses: GabrielBB/xvfb-action@v1.6 +# with: +# run: yarn test --scenario=SingleRootProject +# working-directory: Extension # - name: Run languageServer integration tests # uses: GabrielBB/xvfb-action@v1.6 diff --git a/.github/workflows/ci_windows.yml b/.github/workflows/ci_windows.yml index 7bc07e4ccf..519b469e27 100644 --- a/.github/workflows/ci_windows.yml +++ b/.github/workflows/ci_windows.yml @@ -34,9 +34,12 @@ jobs: run: yarn test working-directory: Extension - - name: Run simple vscode unit tests - run: yarn test --scenario=SingleRootProject - working-directory: Extension +# # NOTE : We can't run the test that require the native binary files +# # yet -- there will be an update soon that allows the tester to +# # acquire them on-the-fly +# - name: Run simple vscode unit tests +# run: yarn test --scenario=SingleRootProject +# working-directory: Extension # - name: Run languageServer integration tests # run: yarn run integrationTests diff --git a/Extension/.eslintrc.js b/Extension/.eslintrc.js index 3c6da613d2..43ce2e76c7 100644 --- a/Extension/.eslintrc.js +++ b/Extension/.eslintrc.js @@ -129,6 +129,7 @@ module.exports = { "no-unsafe-finally": "error", "no-unused-expressions": "error", "no-unused-labels": "error", + "space-before-blocks": "error", "no-var": "error", "one-var": [ "error", diff --git a/Extension/.scripts/code.ts b/Extension/.scripts/code.ts index 6d222b64a5..6f460e2ad9 100644 --- a/Extension/.scripts/code.ts +++ b/Extension/.scripts/code.ts @@ -5,7 +5,7 @@ import { spawnSync } from 'child_process'; import { verbose } from '../src/Utility/Text/streams'; -import { $args, $root, $scenario, brightGreen, checkFile, gray, green, pwd } from './common'; +import { $args, $root, $scenario, assertAnyFile, brightGreen, gray, green, pwd } from './common'; import { resolve } from 'path'; import { getTestInfo } from '../test/common/selectTests'; @@ -25,7 +25,7 @@ export async function main() { // we found it $args.unshift(ti.workspace); } - await checkFile('dist/src/main.js', `The extension entry point '${$root}/dist/src/main.js is missing. You should run ${brightGreen("yarn compile")}\n\n`); + await assertAnyFile('dist/src/main.js', `The extension entry point '${$root}/dist/src/main.js is missing. You should run ${brightGreen("yarn compile")}\n\n`); const { cli, args } = await install(); diff --git a/Extension/.scripts/common.ts b/Extension/.scripts/common.ts index a15fba4809..2892204166 100644 --- a/Extension/.scripts/common.ts +++ b/Extension/.scripts/common.ts @@ -22,7 +22,9 @@ export let $cmd = 'main'; export let $scenario = ''; // loop through the args and pick out --scenario=... and remove it from the $args and set $scenario -export const $args = process.argv.slice(2).filter(each => !(each.startsWith('--scenario=') && ($scenario = each.substring('--scenario='.length)))); +process.argv.slice(2).filter(each => !(each.startsWith('--scenario=') && ($scenario = each.substring('--scenario='.length)))); +export const $args = process.argv.slice(2).filter(each => !each.startsWith('--')); +export const $switches = process.argv.slice(2).filter(each => each.startsWith('--')); /** enqueue the call to the callback function to happen on the next available tick, and return a promise to the result */ export function then(callback: () => Promise | T): Promise { @@ -166,10 +168,12 @@ export async function writeJson(filename: string, object: CommentJSONValue) { export function error(text: string) { console.error(`\n${red('ERROR')}: ${text}`); + return true; } export function warn(text: string) { console.error(`\n${yellow('WARNING')}: ${text}`); + return true; } export function note(text: string) { @@ -254,37 +258,86 @@ export function position(text: string) { return gray(`${text}`); } -export async function checkFolder(folder: string | string[], errMsg: string){ - for (const each of is.array(folder) ? folder : [folder]) { +export async function assertAnyFolder(oneOrMoreFolders: string | string[], errorMessage?: string): Promise { + oneOrMoreFolders = is.array(oneOrMoreFolders) ? oneOrMoreFolders : [oneOrMoreFolders]; + for (const each of oneOrMoreFolders) { const result = await filepath.isFolder(each, $root); if (result) { + verbose(`Folder ${brightGreen(each)} exists.`); return result; } } - error(errMsg); - process.exit(1); + if (errorMessage) { + if (!$switches.includes('--quiet')) { + error(errorMessage); + } + process.exit(1); + } } -export async function checkFile(file: string | string[], errMsg: string){ - for (const each of is.array(file) ? file : [file]) { +export async function assertAnyFile(oneOrMoreFiles: string | string[], errorMessage?: string): Promise { + oneOrMoreFiles = is.array(oneOrMoreFiles) ? oneOrMoreFiles : [oneOrMoreFiles]; + for (const each of oneOrMoreFiles) { const result = await filepath.isFile(each, $root); if (result) { + verbose(`Folder ${brightGreen(each)} exists.`); return result; } } - error(errMsg); - process.exit(1); + if (errorMessage) { + if (!$switches.includes('--quiet')) { + error(errorMessage); + } + process.exit(1); + } } +const quiet = process.argv.includes('--quiet'); + export async function checkPrep() { - await checkFolder('dist/walkthrough', `The walkthrough files are not in place. You should run ${brightGreen("yarn prep")}\n\n`); - await checkFolder('dist/html', `The html files are not in place. You should run ${brightGreen("yarn prep")}\n\n`); - await checkFolder('dist/schema', `The html files are not in place. You should run ${brightGreen("yarn prep")}\n\n`); - await checkFile('dist/nls.metadata.json', `The extension translation file '${$root}/dist/nls.metadata.json is missing. You should run ${brightGreen("yarn prep")}\n\n`); - verbose('Prep files appear to be in place.'); + let failing = false; + + failing = !await assertAnyFolder('dist/test') && (quiet || warn(`The compiled test files are not in place.`)) || failing; + failing = !await assertAnyFolder('dist/walkthrough') && (quiet || warn(`The walkthrough files are not in place.`)) || failing; + failing = !await assertAnyFolder('dist/html') && (quiet || warn(`The html files are not in place.`)) || failing; + failing = !await assertAnyFolder('dist/schema') && (quiet || warn(`The schema files are not in place.`)) || failing; + failing = !await assertAnyFile('dist/nls.metadata.json') && (quiet || warn(`The extension translation file '${$root}/dist/nls.metadata.json is missing.`)) || failing; + failing = await checkDTS() || failing; + + if (!failing) { + verbose('Prep files appear to be in place.'); + } + return failing; } export async function checkCompiled() { - await checkFile('dist/src/main.js', `The extension entry point '${$root}/dist/src/main.js is missing. You should run ${brightGreen("yarn compile")}\n\n`); - verbose('Compiled files appear to be in place.'); + let failing = false; + failing = await checkDTS() || failing; + failing = !await assertAnyFile('dist/src/main.js') && (quiet || warn(`The extension entry point '${$root}/dist/src/main.js is missing.`)) || failing; + + if (!failing) { + verbose('Compiled files appear to be in place.'); + } + return failing; +} + +export async function checkDTS() { + let failing = false; + failing = !await assertAnyFile('vscode.d.ts') && (quiet || warn(`The VSCode import file '${$root}/dist/src/vscode.d.ts is missing.`)) || failing; + failing = !await assertAnyFile('vscode.proposed.terminalDataWriteEvent.d.ts') && (quiet || warn(`The VSCode import file '${$root}/dist/src/vscode.proposed.terminalDataWriteEvent.d.ts is missing.`)) || failing; + + if (!failing) { + verbose('VSCode d.ts files appear to be in place.'); + } + return failing; +} + +export async function checkBinaries() { + let failing = false; + failing = !await assertAnyFile(['bin/cpptools.exe', 'bin/cpptools']) && (quiet || warn(`The native binary files are not present. You should either build or install the native binaries\n\n.`)) || failing; + + if (!failing) { + verbose('Native binary files appear to be in place.'); + } + return failing; } diff --git a/Extension/.scripts/test.ts b/Extension/.scripts/test.ts index c9851b280b..d7aaa523db 100644 --- a/Extension/.scripts/test.ts +++ b/Extension/.scripts/test.ts @@ -14,7 +14,7 @@ import { filepath } from '../src/Utility/Filesystem/filepath'; import { is } from '../src/Utility/System/guards'; import { verbose } from '../src/Utility/Text/streams'; import { getTestInfo } from '../test/common/selectTests'; -import { $args, $root, $scenario, brightGreen, checkFile, checkFolder, cmdSwitch, cyan, error, gray, green, readJson, red, writeJson } from './common'; +import { $args, $root, $scenario, assertAnyFile, assertAnyFolder, brightGreen, checkBinaries, cmdSwitch, cyan, error, gray, green, readJson, red, writeJson } from './common'; import { install, isolated, options } from './vscode'; export { install, reset } from './vscode'; @@ -73,14 +73,17 @@ function filterStdio() { filterStdio(); async function unitTests() { - await checkFolder('dist/test/unit', `The folder '${$root}/dist/test/unit is missing. You should run ${brightGreen("yarn compile")}\n\n`); - const mocha = await checkFile(["node_modules/.bin/mocha.cmd", "node_modules/.bin/mocha"], `Can't find the mocha testrunner. You might need to run ${brightGreen("yarn install")}\n\n`); + await assertAnyFolder('dist/test/unit', `The folder '${$root}/dist/test/unit is missing. You should run ${brightGreen("yarn compile")}\n\n`); + const mocha = await assertAnyFile(["node_modules/.bin/mocha.cmd", "node_modules/.bin/mocha"], `Can't find the mocha testrunner. You might need to run ${brightGreen("yarn install")}\n\n`); const result = spawnSync(mocha, [`${$root}/dist/test/unit/**/*.test.js`, '--timeout', '30000'], { stdio:'inherit'}); verbose(`\n${green("NOTE:")} If you want to run a scenario test (end-to-end) use ${cmdSwitch('scenario=')} \n\n`); return result.status; } async function scenarioTests(assets: string, name: string, workspace: string) { + if (await checkBinaries()) { + process.exit(1); + } return runTests({ ...options, extensionDevelopmentPath: $root, @@ -93,7 +96,7 @@ async function scenarioTests(assets: string, name: string, workspace: string) { } export async function main() { - await checkFolder('dist/test/', `The folder '${$root}/dist/test is missing. You should run ${brightGreen("yarn compile")}\n\n`); + await assertAnyFolder('dist/test/', `The folder '${$root}/dist/test is missing. You should run ${brightGreen("yarn compile")}\n\n`); const arg = $args.find(each => !each.startsWith("--")); const specifiedScenario = $scenario || env.SCENARIO || await getScenarioFolder(arg); const testInfo = await getTestInfo(specifiedScenario); @@ -114,6 +117,9 @@ export async function main() { } export async function all() { + if (await checkBinaries()) { + process.exit(1); + } const finished: string[] = []; if (await unitTests() !== 0) { diff --git a/Extension/.scripts/verify.ts b/Extension/.scripts/verify.ts index a309b149f0..d6ed9896d3 100644 --- a/Extension/.scripts/verify.ts +++ b/Extension/.scripts/verify.ts @@ -3,13 +3,50 @@ * See 'LICENSE' in the project root for license information. * ------------------------------------------------------------------------------------------ */ -import { checkCompiled, checkPrep } from './common'; +import { checkBinaries, checkCompiled, checkDTS, checkPrep, error, green } from './common'; +const quiet = process.argv.includes('--quiet'); export async function main() { - await checkPrep(); - await checkCompiled(); + let failing = await checkPrep() && (quiet || error(`Files are not up to date. Run ${green('yarn prep')} to fix it.`)); + failing = (await checkCompiled() && (quiet || error(`Compiled files are not present. Run ${green('yarn compile')} to fix it.`))) || failing; + failing = (await checkBinaries() && (quiet || error(`The native binary files are not present. You should either build or install the native binaries\n\n.`))) || failing; + if (failing) { + process.exit(1); + } +} + +export async function compiled() { + let failing = false; + failing = (await checkCompiled() && (quiet || error(`Compiled files are not present. Run ${green('yarn compile')} to fix it.`))) || failing; + + if (failing) { + process.exit(1); + } +} + +export async function binaries() { + let failing = false; + failing = (await checkBinaries() && (quiet || error(`The native binary files are not present. You should either build or install the native binaries\n\n.`))) || failing; + + if (failing) { + process.exit(1); + } } export async function prep() { - await checkPrep(); + let failing = false; + failing = (await checkPrep() && (quiet || error(`Files are not up to date. Run ${green('yarn prep')} to fix it.`))) || failing; + + if (failing) { + process.exit(1); + } +} + +export async function dts() { + let failing = false; + failing = (await checkDTS() && (quiet || error(`VSCode import files are not present. Run ${green('yarn prep')} to fix it.`))) || failing; + + if (failing) { + process.exit(1); + } } diff --git a/Extension/package.json b/Extension/package.json index 6eebe50a84..e74936e952 100644 --- a/Extension/package.json +++ b/Extension/package.json @@ -6121,16 +6121,16 @@ "scripts": "ts-node -T .scripts/scripts.ts", "show": "ts-node -T .scripts/clean.ts show", "clean": "ts-node -T .scripts/clean.ts", - "test": "ts-node -T .scripts/test.ts", - "code": "ts-node -T .scripts/code.ts", + "test": "yarn install && (yarn verify prep --quiet || yarn prep) && (yarn verify compiled --quiet || yarn build) && ts-node -T .scripts/test.ts", + "code": "yarn install && (yarn verify compiled --quiet || yarn build) && yarn verify binaries && ts-node -T .scripts/code.ts", "verify": "ts-node -T .scripts/verify.ts", - "prep": "yarn copy-walkthrough-media && yarn generate-native-strings && yarn translations-generate", - "lint": "eslint -c .eslintrc.js --report-unused-disable-directives src test ui .scripts", - "compile": "(yarn verify prep || yarn prep) && tsc --build tsconfig.json", - "watch": "(yarn verify prep || yarn prep )&& tsc --build tsconfig.json --watch", - "rebuild": "yarn clean && yarn prep && yarn compile", + "prep": "yarn prep:dts && yarn copy-walkthrough-media && yarn generate-native-strings && yarn translations-generate", + "lint": "yarn install && eslint -c .eslintrc.js --report-unused-disable-directives src test ui .scripts", + "compile": "yarn install && (yarn verify prep --quiet || yarn prep) && yarn build", + "watch": "yarn install && (yarn verify prep --quiet || yarn prep) && tsc --build tsconfig.json --watch", + "rebuild": "yarn install && yarn clean && yarn prep && yarn build", "vscode:prepublish": "yarn clean && yarn webpack", - "webpack": "yarn prep && tsc --build ui.tsconfig.json && webpack --mode production --env vscode_nls", + "webpack": "yarn install && (yarn verify prep --quiet || yarn prep) && tsc --build ui.tsconfig.json && webpack --mode production --env vscode_nls", "generate-native-strings": "ts-node -T ./.scripts/generateNativeStrings.ts", "generate-options-schema": "ts-node -T ./.scripts/generateOptionsSchema.ts", "copy-walkthrough-media": "ts-node -T ./.scripts/copyWalkthruMedia.ts", @@ -6138,7 +6138,8 @@ "translations-generate": "set NODE_OPTIONS=--no-experimental-fetch && gulp translations-generate", "translations-import": "gulp translations-import", "import-edge-strings": "ts-node -T ./.scripts/import_edge_strings.ts", - "postinstall": "npx vscode-dts dev && npx vscode-dts main && yarn prep" + "prep:dts": "yarn verify dts --quiet || (npx vscode-dts dev && npx vscode-dts main)", + "build": "yarn prep:dts && echo [Building TypeScript code] && tsc --build tsconfig.json" }, "devDependencies": { "@octokit/rest": "^18.12.0", diff --git a/Extension/test/unit/commandLineParsing.test.ts b/Extension/test/unit/commandLineParsing.test.ts index 71315d68f4..cb20b4efdf 100644 --- a/Extension/test/unit/commandLineParsing.test.ts +++ b/Extension/test/unit/commandLineParsing.test.ts @@ -17,7 +17,7 @@ function marker() { try { throw new Error('Test Marker'); } catch (E) { - if (is.error(E)){ + if (is.error(E)) { return E.stack?.split('\n').filter(each => each.includes('.ts') && each.includes('')).join('\n'); } } From 6a54986b3f35feab32d22c517b05a02937b488d2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 7 Sep 2023 09:52:11 -0700 Subject: [PATCH 14/15] Bump mongodb from 4.8.1 to 4.17.0 in /.github/actions (#11413) Bumps [mongodb](https://github.com/mongodb/node-mongodb-native) from 4.8.1 to 4.17.0. - [Release notes](https://github.com/mongodb/node-mongodb-native/releases) - [Changelog](https://github.com/mongodb/node-mongodb-native/blob/v4.17.0/HISTORY.md) - [Commits](https://github.com/mongodb/node-mongodb-native/compare/v4.8.1...v4.17.0) --- updated-dependencies: - dependency-name: mongodb dependency-type: direct:development ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/actions/package-lock.json | 9814 +++++++++++++++++++---------- .github/actions/package.json | 2 +- 2 files changed, 6489 insertions(+), 3327 deletions(-) diff --git a/.github/actions/package-lock.json b/.github/actions/package-lock.json index 14e9ee99cb..4c52539921 100644 --- a/.github/actions/package-lock.json +++ b/.github/actions/package-lock.json @@ -30,7 +30,7 @@ "eslint-plugin-prettier": "^4.2.1", "husky": "^8.0.1", "mocha": "^10.0.0", - "mongodb": "^4.8.1", + "mongodb": "^4.17.0", "nock": "^13.2.9", "prettier": "2.7.1", "ts-node": "^10.9.1", @@ -121,3554 +121,3919 @@ "tunnel": "^0.0.6" } }, - "node_modules/@azure/abort-controller": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.0.1.tgz", - "integrity": "sha512-wP2Jw6uPp8DEDy0n4KNidvwzDjyVV2xnycEIq7nPzj1rHyb/r+t3OPeNT1INZePP2wy5ZqlwyuyOMTi0ePyY1A==", + "node_modules/@aws-crypto/crc32": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", + "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", + "dev": true, + "optional": true, "dependencies": { - "tslib": "^1.9.3" + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" } }, - "node_modules/@azure/core-asynciterator-polyfill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@azure/core-asynciterator-polyfill/-/core-asynciterator-polyfill-1.0.0.tgz", - "integrity": "sha512-kmv8CGrPfN9SwMwrkiBK9VTQYxdFQEGe0BmQk+M8io56P9KNzpAxcWE/1fxJj7uouwN4kXF0BHW8DNlgx+wtCg==", - "dev": true - }, - "node_modules/@azure/core-auth": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.4.0.tgz", - "integrity": "sha512-HFrcTgmuSuukRf/EdPmqBrc5l6Q5Uu+2TbuhaKbgaCpP2TfAeiNaQPAadxO+CYBRHGUzIDteMAjFspFLDLnKVQ==", + "node_modules/@aws-crypto/ie11-detection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", + "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", + "dev": true, + "optional": true, "dependencies": { - "@azure/abort-controller": "^1.0.0", - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=12.0.0" + "tslib": "^1.11.1" } }, - "node_modules/@azure/core-auth/node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" - }, - "node_modules/@azure/core-http": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@azure/core-http/-/core-http-3.0.1.tgz", - "integrity": "sha512-A3x+um3cAPgQe42Lu7Iv/x8/fNjhL/nIoEfqFxfn30EyxK6zC13n+OUxzZBRC0IzQqssqIbt4INf5YG7lYYFtw==", + "node_modules/@aws-crypto/sha256-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", + "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", "dev": true, + "optional": true, "dependencies": { - "@azure/abort-controller": "^1.0.0", - "@azure/core-auth": "^1.3.0", - "@azure/core-tracing": "1.0.0-preview.13", - "@azure/core-util": "^1.1.1", - "@azure/logger": "^1.0.0", - "@types/node-fetch": "^2.5.0", - "@types/tunnel": "^0.0.3", - "form-data": "^4.0.0", - "node-fetch": "^2.6.7", - "process": "^0.11.10", - "tslib": "^2.2.0", - "tunnel": "^0.0.6", - "uuid": "^8.3.0", - "xml2js": "^0.5.0" - }, - "engines": { - "node": ">=14.0.0" + "@aws-crypto/ie11-detection": "^3.0.0", + "@aws-crypto/sha256-js": "^3.0.0", + "@aws-crypto/supports-web-crypto": "^3.0.0", + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" } }, - "node_modules/@azure/core-http/node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - }, - "node_modules/@azure/core-lro": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-2.2.4.tgz", - "integrity": "sha512-e1I2v2CZM0mQo8+RSix0x091Av493e4bnT22ds2fcQGslTHzM2oTbswkB65nP4iEpCxBrFxOSDPKExmTmjCVtQ==", + "node_modules/@aws-crypto/sha256-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", + "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", "dev": true, + "optional": true, "dependencies": { - "@azure/abort-controller": "^1.0.0", - "@azure/core-tracing": "1.0.0-preview.13", - "@azure/logger": "^1.0.0", - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=12.0.0" + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" } }, - "node_modules/@azure/core-lro/node_modules/tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", - "dev": true + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", + "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", + "dev": true, + "optional": true, + "dependencies": { + "tslib": "^1.11.1" + } }, - "node_modules/@azure/core-paging": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.1.1.tgz", - "integrity": "sha512-hqEJBEGKan4YdOaL9ZG/GRG6PXaFd/Wb3SSjQW4LWotZzgl6xqG00h6wmkrpd2NNkbBkD1erLHBO3lPHApv+iQ==", + "node_modules/@aws-crypto/util": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", + "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", "dev": true, + "optional": true, "dependencies": { - "@azure/core-asynciterator-polyfill": "^1.0.0" + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" } }, - "node_modules/@azure/core-rest-pipeline": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.10.3.tgz", - "integrity": "sha512-AMQb0ttiGJ0MIV/r+4TVra6U4+90mPeOveehFnrqKlo7dknPJYdJ61wOzYJXJjDxF8LcCtSogfRelkq+fCGFTw==", + "node_modules/@aws-sdk/client-cognito-identity": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.405.0.tgz", + "integrity": "sha512-kvmNAREFQbhaZoEMQzBOYTaN7cFIOLgk2DZYYlHh2ErUYXSbvbVOBUriMRW9hRDtKLooe3ZFBLO3sWKvQE/AfA==", + "dev": true, + "optional": true, "dependencies": { - "@azure/abort-controller": "^1.0.0", - "@azure/core-auth": "^1.4.0", - "@azure/core-tracing": "^1.0.1", - "@azure/core-util": "^1.3.0", - "@azure/logger": "^1.0.0", - "form-data": "^4.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "tslib": "^2.2.0" + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.405.0", + "@aws-sdk/credential-provider-node": "3.405.0", + "@aws-sdk/middleware-host-header": "3.398.0", + "@aws-sdk/middleware-logger": "3.398.0", + "@aws-sdk/middleware-recursion-detection": "3.398.0", + "@aws-sdk/middleware-signing": "3.398.0", + "@aws-sdk/middleware-user-agent": "3.398.0", + "@aws-sdk/types": "3.398.0", + "@aws-sdk/util-endpoints": "3.398.0", + "@aws-sdk/util-user-agent-browser": "3.398.0", + "@aws-sdk/util-user-agent-node": "3.405.0", + "@smithy/config-resolver": "^2.0.5", + "@smithy/fetch-http-handler": "^2.0.5", + "@smithy/hash-node": "^2.0.5", + "@smithy/invalid-dependency": "^2.0.5", + "@smithy/middleware-content-length": "^2.0.5", + "@smithy/middleware-endpoint": "^2.0.5", + "@smithy/middleware-retry": "^2.0.5", + "@smithy/middleware-serde": "^2.0.5", + "@smithy/middleware-stack": "^2.0.0", + "@smithy/node-config-provider": "^2.0.6", + "@smithy/node-http-handler": "^2.0.5", + "@smithy/protocol-http": "^2.0.5", + "@smithy/smithy-client": "^2.0.5", + "@smithy/types": "^2.2.2", + "@smithy/url-parser": "^2.0.5", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.6", + "@smithy/util-defaults-mode-node": "^2.0.6", + "@smithy/util-retry": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@azure/core-rest-pipeline/node_modules/@azure/core-tracing": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.1.tgz", - "integrity": "sha512-I5CGMoLtX+pI17ZdiFJZgxMJApsK6jjfm85hpgp3oazCdq5Wxgh4wMr7ge/TTWW1B5WBuvIOI1fMU/FrOAMKrw==", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.405.0.tgz", + "integrity": "sha512-z1ssydU07bDhe0tNXQwVO+rWh/iSfK48JI8s8vgpBNwH+NejMzIJ9r3AkjCiJ+LSAwlBZItUsNWwR0veIfgBiw==", + "dev": true, + "optional": true, "dependencies": { - "tslib": "^2.2.0" + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/middleware-host-header": "3.398.0", + "@aws-sdk/middleware-logger": "3.398.0", + "@aws-sdk/middleware-recursion-detection": "3.398.0", + "@aws-sdk/middleware-user-agent": "3.398.0", + "@aws-sdk/types": "3.398.0", + "@aws-sdk/util-endpoints": "3.398.0", + "@aws-sdk/util-user-agent-browser": "3.398.0", + "@aws-sdk/util-user-agent-node": "3.405.0", + "@smithy/config-resolver": "^2.0.5", + "@smithy/fetch-http-handler": "^2.0.5", + "@smithy/hash-node": "^2.0.5", + "@smithy/invalid-dependency": "^2.0.5", + "@smithy/middleware-content-length": "^2.0.5", + "@smithy/middleware-endpoint": "^2.0.5", + "@smithy/middleware-retry": "^2.0.5", + "@smithy/middleware-serde": "^2.0.5", + "@smithy/middleware-stack": "^2.0.0", + "@smithy/node-config-provider": "^2.0.6", + "@smithy/node-http-handler": "^2.0.5", + "@smithy/protocol-http": "^2.0.5", + "@smithy/smithy-client": "^2.0.5", + "@smithy/types": "^2.2.2", + "@smithy/url-parser": "^2.0.5", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.6", + "@smithy/util-defaults-mode-node": "^2.0.6", + "@smithy/util-retry": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" } }, - "node_modules/@azure/core-rest-pipeline/node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + "node_modules/@aws-sdk/client-sso/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true }, - "node_modules/@azure/core-tracing": { - "version": "1.0.0-preview.13", - "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.0-preview.13.tgz", - "integrity": "sha512-KxDlhXyMlh2Jhj2ykX6vNEU0Vou4nHr025KoSEiz7cS3BNiHNaZcdECk/DmLkEB0as5T7b/TpRcehJ5yV6NeXQ==", + "node_modules/@aws-sdk/client-sts": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.405.0.tgz", + "integrity": "sha512-asVEpda3zu5QUO5ZNNjbLBS0718IhxxyUDVrNmVTKZoOhK1pMNouGZf+l49v0Lb5cOPbUds8cxsNaInj2MvIKw==", "dev": true, + "optional": true, "dependencies": { - "@opentelemetry/api": "^1.0.1", - "tslib": "^2.2.0" + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/credential-provider-node": "3.405.0", + "@aws-sdk/middleware-host-header": "3.398.0", + "@aws-sdk/middleware-logger": "3.398.0", + "@aws-sdk/middleware-recursion-detection": "3.398.0", + "@aws-sdk/middleware-sdk-sts": "3.398.0", + "@aws-sdk/middleware-signing": "3.398.0", + "@aws-sdk/middleware-user-agent": "3.398.0", + "@aws-sdk/types": "3.398.0", + "@aws-sdk/util-endpoints": "3.398.0", + "@aws-sdk/util-user-agent-browser": "3.398.0", + "@aws-sdk/util-user-agent-node": "3.405.0", + "@smithy/config-resolver": "^2.0.5", + "@smithy/fetch-http-handler": "^2.0.5", + "@smithy/hash-node": "^2.0.5", + "@smithy/invalid-dependency": "^2.0.5", + "@smithy/middleware-content-length": "^2.0.5", + "@smithy/middleware-endpoint": "^2.0.5", + "@smithy/middleware-retry": "^2.0.5", + "@smithy/middleware-serde": "^2.0.5", + "@smithy/middleware-stack": "^2.0.0", + "@smithy/node-config-provider": "^2.0.6", + "@smithy/node-http-handler": "^2.0.5", + "@smithy/protocol-http": "^2.0.5", + "@smithy/smithy-client": "^2.0.5", + "@smithy/types": "^2.2.2", + "@smithy/url-parser": "^2.0.5", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.6", + "@smithy/util-defaults-mode-node": "^2.0.6", + "@smithy/util-retry": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "fast-xml-parser": "4.2.5", + "tslib": "^2.5.0" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" } }, - "node_modules/@azure/core-tracing/node_modules/tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", - "dev": true + "node_modules/@aws-sdk/client-sts/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true }, - "node_modules/@azure/core-util": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.3.0.tgz", - "integrity": "sha512-ANP0Er7R2KHHHjwmKzPF9wbd0gXvOX7yRRHeYL1eNd/OaNrMLyfZH/FQasHRVAf6rMXX+EAUpvYwLMFDHDI5Gw==", + "node_modules/@aws-sdk/credential-provider-cognito-identity": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.405.0.tgz", + "integrity": "sha512-tmu8r0kB3qHHIitQAwiziWzxoaGCv/vCh00EcabuW3x3UsKQUF71ZLuNcMOv5wqTsQw0Fmv3dKy2tzVmRm3Z5g==", + "dev": true, + "optional": true, "dependencies": { - "@azure/abort-controller": "^1.0.0", - "tslib": "^2.2.0" + "@aws-sdk/client-cognito-identity": "3.405.0", + "@aws-sdk/types": "3.398.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@azure/core-util/node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true }, - "node_modules/@azure/logger": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.0.0.tgz", - "integrity": "sha512-g2qLDgvmhyIxR3JVS8N67CyIOeFRKQlX/llxYJQr1OSGQqM3HTpVP8MjmjcEKbL/OIt2N9C9UFaNQuKOw1laOA==", + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.398.0.tgz", + "integrity": "sha512-Z8Yj5z7FroAsR6UVML+XUdlpoqEe9Dnle8c2h8/xWwIC2feTfIBhjLhRVxfbpbM1pLgBSNEcZ7U8fwq5l7ESVQ==", + "dev": true, + "optional": true, "dependencies": { - "tslib": "^1.9.3" + "@aws-sdk/types": "3.398.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@azure/opentelemetry-instrumentation-azure-sdk": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/@azure/opentelemetry-instrumentation-azure-sdk/-/opentelemetry-instrumentation-azure-sdk-1.0.0-beta.2.tgz", - "integrity": "sha512-WZ2u3J7LmwwVbyXGguiEGNYHyDoUjNb+VZ9S76xecsYOkoKSzFdWJtv/vYBknW9fLuoWCoyVVg8+lU2ouaZbJQ==", + "node_modules/@aws-sdk/credential-provider-env/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.405.0.tgz", + "integrity": "sha512-b4TqVsM4WQM96GDVs+TYOhU2/0SnUWzz6NH55qY1y2xyF8/pZEhc0XXdpvZtQQBLGdROhXCbxhBVye8GmTpgcg==", + "dev": true, + "optional": true, "dependencies": { - "@azure/core-tracing": "^1.0.0", - "@azure/logger": "^1.0.0", - "@opentelemetry/api": "^1.2.0", - "@opentelemetry/core": "^1.7.0", - "@opentelemetry/instrumentation": "^0.33.0", - "tslib": "^2.2.0" + "@aws-sdk/credential-provider-env": "3.398.0", + "@aws-sdk/credential-provider-process": "3.405.0", + "@aws-sdk/credential-provider-sso": "3.405.0", + "@aws-sdk/credential-provider-web-identity": "3.398.0", + "@aws-sdk/types": "3.398.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@azure/opentelemetry-instrumentation-azure-sdk/node_modules/@azure/core-tracing": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.1.tgz", - "integrity": "sha512-I5CGMoLtX+pI17ZdiFJZgxMJApsK6jjfm85hpgp3oazCdq5Wxgh4wMr7ge/TTWW1B5WBuvIOI1fMU/FrOAMKrw==", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.405.0.tgz", + "integrity": "sha512-AMmRP09nwYsft0MXDlHIxMQe7IloWW8As0lbZmPrG7Y7mK5RDmCIwD2yMDz77Zqlv09FsYt+9+cOK2fTNhim+Q==", + "dev": true, + "optional": true, "dependencies": { - "tslib": "^2.2.0" + "@aws-sdk/credential-provider-env": "3.398.0", + "@aws-sdk/credential-provider-ini": "3.405.0", + "@aws-sdk/credential-provider-process": "3.405.0", + "@aws-sdk/credential-provider-sso": "3.405.0", + "@aws-sdk/credential-provider-web-identity": "3.398.0", + "@aws-sdk/types": "3.398.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" } }, - "node_modules/@azure/opentelemetry-instrumentation-azure-sdk/node_modules/@opentelemetry/api": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.4.1.tgz", - "integrity": "sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA==", + "node_modules/@aws-sdk/credential-provider-node/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.405.0.tgz", + "integrity": "sha512-EqAMcUVeZAICYHHL8x5Fi5CYPgCo9UCE7ScWmU5Sa2wAFY4XLyQ1mMxX3lKGYx9lBxWk3dqnhmvlcqdzN7AjyQ==", + "dev": true, + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, "engines": { - "node": ">=8.0.0" + "node": ">=14.0.0" } }, - "node_modules/@azure/opentelemetry-instrumentation-azure-sdk/node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + "node_modules/@aws-sdk/credential-provider-process/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true }, - "node_modules/@azure/storage-blob": { - "version": "12.13.0", - "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.13.0.tgz", - "integrity": "sha512-t3Q2lvBMJucgTjQcP5+hvEJMAsJSk0qmAnjDLie2td017IiduZbbC9BOcFfmwzR6y6cJdZOuewLCNFmEx9IrXA==", + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.405.0.tgz", + "integrity": "sha512-fXqSgQHz7qcmIWMVguwSMSjqFkVfN2+XiNgiskcmeYiCS7mIGAgUnKABZc9Ds2+YW9ATYiY0BOD5aWxc8TX5fA==", "dev": true, + "optional": true, "dependencies": { - "@azure/abort-controller": "^1.0.0", - "@azure/core-http": "^3.0.0", - "@azure/core-lro": "^2.2.0", - "@azure/core-paging": "^1.1.1", - "@azure/core-tracing": "1.0.0-preview.13", - "@azure/logger": "^1.0.0", - "events": "^3.0.0", - "tslib": "^2.2.0" + "@aws-sdk/client-sso": "3.405.0", + "@aws-sdk/token-providers": "3.405.0", + "@aws-sdk/types": "3.398.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@azure/storage-blob/node_modules/tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", - "dev": true + "node_modules/@aws-sdk/credential-provider-sso/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.398.0.tgz", + "integrity": "sha512-iG3905Alv9pINbQ8/MIsshgqYMbWx+NDQWpxbIW3W0MkSH3iAqdVpSCteYidYX9G/jv2Um1nW3y360ib20bvNg==", "dev": true, + "optional": true, "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" + "@aws-sdk/types": "3.398.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" }, "engines": { - "node": ">=12" + "node": ">=14.0.0" } }, - "node_modules/@eslint/eslintrc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", - "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", + "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + }, + "node_modules/@aws-sdk/credential-providers": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.405.0.tgz", + "integrity": "sha512-332QZ2Wrr5gfFUGPLwITcjhxnBD4y94fxKg7qerSBq7fjjIkl/OjnchZf5ReePrjpglxs6hgLdGrPYIYPC4Hhw==", "dev": true, + "optional": true, "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.3.2", - "globals": "^13.15.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" + "@aws-sdk/client-cognito-identity": "3.405.0", + "@aws-sdk/client-sso": "3.405.0", + "@aws-sdk/client-sts": "3.405.0", + "@aws-sdk/credential-provider-cognito-identity": "3.405.0", + "@aws-sdk/credential-provider-env": "3.398.0", + "@aws-sdk/credential-provider-ini": "3.405.0", + "@aws-sdk/credential-provider-node": "3.405.0", + "@aws-sdk/credential-provider-process": "3.405.0", + "@aws-sdk/credential-provider-sso": "3.405.0", + "@aws-sdk/credential-provider-web-identity": "3.398.0", + "@aws-sdk/types": "3.398.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=14.0.0" } }, - "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==", + "node_modules/@aws-sdk/credential-providers/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.398.0.tgz", + "integrity": "sha512-m+5laWdBaxIZK2ko0OwcCHJZJ5V1MgEIt8QVQ3k4/kOkN9ICjevOYmba751pHoTnbOYB7zQd6D2OT3EYEEsUcA==", "dev": true, + "optional": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" + "@aws-sdk/types": "3.398.0", + "@smithy/protocol-http": "^2.0.5", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" }, "engines": { - "node": ">=10.10.0" + "node": ">=14.0.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/@aws-sdk/middleware-host-header/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true + "optional": true }, - "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==", + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.398.0.tgz", + "integrity": "sha512-CiJjW+FL12elS6Pn7/UVjVK8HWHhXMfvHZvOwx/Qkpy340sIhkuzOO6fZEruECDTZhl2Wqn81XdJ1ZQ4pRKpCg==", "dev": true, + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, "engines": { - "node": ">=6.0.0" + "node": ">=14.0.0" } }, - "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==", - "dev": true + "node_modules/@aws-sdk/middleware-logger/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.398.0.tgz", + "integrity": "sha512-7QpOqPQAZNXDXv6vsRex4R8dLniL0E/80OPK4PPFsrCh9btEyhN9Begh4i1T+5lL28hmYkztLOkTQ2N5J3hgRQ==", "dev": true, + "optional": true, "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@aws-sdk/types": "3.398.0", + "@smithy/protocol-http": "^2.0.5", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@microsoft/applicationinsights-web-snippet": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-web-snippet/-/applicationinsights-web-snippet-1.0.1.tgz", - "integrity": "sha512-2IHAOaLauc8qaAitvWS+U931T+ze+7MNWrDHY47IENP5y2UA0vqJDu67kWZDdpCN1fFC77sfgfB+HV7SrKshnQ==" + "node_modules/@aws-sdk/middleware-recursion-detection/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/@aws-sdk/middleware-sdk-sts": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.398.0.tgz", + "integrity": "sha512-+JH76XHEgfVihkY+GurohOQ5Z83zVN1nYcQzwCFnCDTh4dG4KwhnZKG+WPw6XJECocY0R+H0ivofeALHvVWJtQ==", "dev": true, + "optional": true, "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@aws-sdk/middleware-signing": "3.398.0", + "@aws-sdk/types": "3.398.0", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" }, "engines": { - "node": ">= 8" + "node": ">=14.0.0" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "node_modules/@aws-sdk/middleware-sdk-sts/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true, - "engines": { - "node": ">= 8" - } + "optional": true }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/@aws-sdk/middleware-signing": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.398.0.tgz", + "integrity": "sha512-O0KqXAix1TcvZBFt1qoFkHMUNJOSgjJTYS7lFTRKSwgsD27bdW2TM2r9R8DAccWFt5Amjkdt+eOwQMIXPGTm8w==", "dev": true, + "optional": true, "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "@aws-sdk/types": "3.398.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/protocol-http": "^2.0.5", + "@smithy/signature-v4": "^2.0.0", + "@smithy/types": "^2.2.2", + "@smithy/util-middleware": "^2.0.0", + "tslib": "^2.5.0" }, "engines": { - "node": ">= 8" + "node": ">=14.0.0" } }, - "node_modules/@octokit/auth-token": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.0.tgz", - "integrity": "sha512-MDNFUBcJIptB9At7HiV7VCvU3NcL4GnfCQaP8C5lrxWrRPMJBnemYtehaKSOlaM7AYxeRyj9etenu8LVpSpVaQ==", + "node_modules/@aws-sdk/middleware-signing/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.398.0.tgz", + "integrity": "sha512-nF1jg0L+18b5HvTcYzwyFgfZQQMELJINFqI0mi4yRKaX7T5a3aGp5RVLGGju/6tAGTuFbfBoEhkhU3kkxexPYQ==", + "dev": true, + "optional": true, "dependencies": { - "@octokit/types": "^6.0.3" + "@aws-sdk/types": "3.398.0", + "@aws-sdk/util-endpoints": "3.398.0", + "@smithy/protocol-http": "^2.0.5", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" }, "engines": { - "node": ">= 14" + "node": ">=14.0.0" } }, - "node_modules/@octokit/core": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.0.4.tgz", - "integrity": "sha512-sUpR/hc4Gc7K34o60bWC7WUH6Q7T6ftZ2dUmepSyJr9PRF76/qqkWjE2SOEzCqLA5W83SaISymwKtxks+96hPQ==", + "node_modules/@aws-sdk/middleware-user-agent/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.405.0.tgz", + "integrity": "sha512-rVzC7ptf7TlV84M9w+Ds9isio1EY7bs1MRFv/6lmYstsyTri+DaZG10TwXSGfzIMwB0yVh11niCxO9wSjQ36zg==", + "dev": true, + "optional": true, "dependencies": { - "@octokit/auth-token": "^3.0.0", - "@octokit/graphql": "^5.0.0", - "@octokit/request": "^6.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^6.0.3", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/middleware-host-header": "3.398.0", + "@aws-sdk/middleware-logger": "3.398.0", + "@aws-sdk/middleware-recursion-detection": "3.398.0", + "@aws-sdk/middleware-user-agent": "3.398.0", + "@aws-sdk/types": "3.398.0", + "@aws-sdk/util-endpoints": "3.398.0", + "@aws-sdk/util-user-agent-browser": "3.398.0", + "@aws-sdk/util-user-agent-node": "3.405.0", + "@smithy/config-resolver": "^2.0.5", + "@smithy/fetch-http-handler": "^2.0.5", + "@smithy/hash-node": "^2.0.5", + "@smithy/invalid-dependency": "^2.0.5", + "@smithy/middleware-content-length": "^2.0.5", + "@smithy/middleware-endpoint": "^2.0.5", + "@smithy/middleware-retry": "^2.0.5", + "@smithy/middleware-serde": "^2.0.5", + "@smithy/middleware-stack": "^2.0.0", + "@smithy/node-config-provider": "^2.0.6", + "@smithy/node-http-handler": "^2.0.5", + "@smithy/property-provider": "^2.0.0", + "@smithy/protocol-http": "^2.0.5", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/smithy-client": "^2.0.5", + "@smithy/types": "^2.2.2", + "@smithy/url-parser": "^2.0.5", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.6", + "@smithy/util-defaults-mode-node": "^2.0.6", + "@smithy/util-retry": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" }, "engines": { - "node": ">= 14" + "node": ">=14.0.0" } }, - "node_modules/@octokit/core/node_modules/@octokit/request": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.0.tgz", - "integrity": "sha512-7IAmHnaezZrgUqtRShMlByJK33MT9ZDnMRgZjnRrRV9a/jzzFwKGz0vxhFU6i7VMLraYcQ1qmcAOin37Kryq+Q==", + "node_modules/@aws-sdk/token-providers/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + }, + "node_modules/@aws-sdk/types": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.398.0.tgz", + "integrity": "sha512-r44fkS+vsEgKCuEuTV+TIk0t0m5ZlXHNjSDYEUvzLStbbfUFiNus/YG4UCa0wOk9R7VuQI67badsvvPeVPCGDQ==", + "dev": true, + "optional": true, "dependencies": { - "@octokit/endpoint": "^7.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^6.16.1", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" }, "engines": { - "node": ">= 14" + "node": ">=14.0.0" } }, - "node_modules/@octokit/core/node_modules/@octokit/request-error": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.0.tgz", - "integrity": "sha512-WBtpzm9lR8z4IHIMtOqr6XwfkGvMOOILNLxsWvDwtzm/n7f5AWuqJTXQXdDtOvPfTDrH4TPhEvW2qMlR4JFA2w==", + "node_modules/@aws-sdk/types/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + }, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.398.0.tgz", + "integrity": "sha512-Fy0gLYAei/Rd6BrXG4baspCnWTUSd0NdokU1pZh4KlfEAEN1i8SPPgfiO5hLk7+2inqtCmqxVJlfqbMVe9k4bw==", + "dev": true, + "optional": true, "dependencies": { - "@octokit/types": "^6.0.3", - "deprecation": "^2.0.0", - "once": "^1.4.0" + "@aws-sdk/types": "3.398.0", + "tslib": "^2.5.0" }, "engines": { - "node": ">= 14" + "node": ">=14.0.0" } }, - "node_modules/@octokit/endpoint": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.0.tgz", - "integrity": "sha512-Kz/mIkOTjs9rV50hf/JK9pIDl4aGwAtT8pry6Rpy+hVXkAPhXanNQRxMoq6AeRgDCZR6t/A1zKniY2V1YhrzlQ==", + "node_modules/@aws-sdk/util-endpoints/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.310.0.tgz", + "integrity": "sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==", + "dev": true, + "optional": true, "dependencies": { - "@octokit/types": "^6.0.3", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" + "tslib": "^2.5.0" }, "engines": { - "node": ">= 14" + "node": ">=14.0.0" } }, - "node_modules/@octokit/graphql": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.0.tgz", - "integrity": "sha512-1ZZ8tX4lUEcLPvHagfIVu5S2xpHYXAmgN0+95eAOPoaVPzCfUXJtA5vASafcpWcO86ze0Pzn30TAx72aB2aguQ==", + "node_modules/@aws-sdk/util-locate-window/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + }, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.398.0.tgz", + "integrity": "sha512-A3Tzx1tkDHlBT+IgxmsMCHbV8LM7SwwCozq2ZjJRx0nqw3MCrrcxQFXldHeX/gdUMO+0Oocb7HGSnVODTq+0EA==", + "dev": true, + "optional": true, "dependencies": { - "@octokit/request": "^6.0.0", - "@octokit/types": "^6.0.3", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" + "@aws-sdk/types": "3.398.0", + "@smithy/types": "^2.2.2", + "bowser": "^2.11.0", + "tslib": "^2.5.0" } }, - "node_modules/@octokit/graphql/node_modules/@octokit/openapi-types": { - "version": "13.13.1", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-13.13.1.tgz", - "integrity": "sha512-4EuKSk3N95UBWFau3Bz9b3pheQ8jQYbKmBL5+GSuY8YDPDwu03J4BjI+66yNi8aaX/3h1qDpb0mbBkLdr+cfGQ==" + "node_modules/@aws-sdk/util-user-agent-browser/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true }, - "node_modules/@octokit/graphql/node_modules/@octokit/request": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.1.tgz", - "integrity": "sha512-gYKRCia3cpajRzDSU+3pt1q2OcuC6PK8PmFIyxZDWCzRXRSIBH8jXjFJ8ZceoygBIm0KsEUg4x1+XcYBz7dHPQ==", + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.405.0.tgz", + "integrity": "sha512-6Ssld7aalKCnW6lSGfiiWpqwo2L+AmYq2oV3P9yYAo9ZL+Q78dXquabwj3uq3plJ4l2xE4Gfcf2FJ/1PZpqDvQ==", + "dev": true, + "optional": true, "dependencies": { - "@octokit/endpoint": "^7.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^7.0.0", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" + "@aws-sdk/types": "3.398.0", + "@smithy/node-config-provider": "^2.0.6", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" }, "engines": { - "node": ">= 14" + "node": ">=14.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } } }, - "node_modules/@octokit/graphql/node_modules/@octokit/request-error": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.1.tgz", - "integrity": "sha512-ym4Bp0HTP7F3VFssV88WD1ZyCIRoE8H35pXSKwLeMizcdZAYc/t6N9X9Yr9n6t3aG9IH75XDnZ6UeZph0vHMWQ==", + "node_modules/@aws-sdk/util-user-agent-node/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + }, + "node_modules/@aws-sdk/util-utf8-browser": { + "version": "3.259.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", + "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", + "dev": true, + "optional": true, "dependencies": { - "@octokit/types": "^7.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" - }, - "engines": { - "node": ">= 14" + "tslib": "^2.3.1" } }, - "node_modules/@octokit/graphql/node_modules/@octokit/request-error/node_modules/@octokit/types": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-7.5.1.tgz", - "integrity": "sha512-Zk4OUMLCSpXNI8KZZn47lVLJSsgMyCimsWWQI5hyjZg7hdYm0kjotaIkbG0Pp8SfU2CofMBzonboTqvzn3FrJA==", + "node_modules/@aws-sdk/util-utf8-browser/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + }, + "node_modules/@azure/abort-controller": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.0.1.tgz", + "integrity": "sha512-wP2Jw6uPp8DEDy0n4KNidvwzDjyVV2xnycEIq7nPzj1rHyb/r+t3OPeNT1INZePP2wy5ZqlwyuyOMTi0ePyY1A==", "dependencies": { - "@octokit/openapi-types": "^13.11.0" + "tslib": "^1.9.3" } }, - "node_modules/@octokit/graphql/node_modules/@octokit/request/node_modules/@octokit/types": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-7.5.1.tgz", - "integrity": "sha512-Zk4OUMLCSpXNI8KZZn47lVLJSsgMyCimsWWQI5hyjZg7hdYm0kjotaIkbG0Pp8SfU2CofMBzonboTqvzn3FrJA==", + "node_modules/@azure/core-asynciterator-polyfill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@azure/core-asynciterator-polyfill/-/core-asynciterator-polyfill-1.0.0.tgz", + "integrity": "sha512-kmv8CGrPfN9SwMwrkiBK9VTQYxdFQEGe0BmQk+M8io56P9KNzpAxcWE/1fxJj7uouwN4kXF0BHW8DNlgx+wtCg==", + "dev": true + }, + "node_modules/@azure/core-auth": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.4.0.tgz", + "integrity": "sha512-HFrcTgmuSuukRf/EdPmqBrc5l6Q5Uu+2TbuhaKbgaCpP2TfAeiNaQPAadxO+CYBRHGUzIDteMAjFspFLDLnKVQ==", "dependencies": { - "@octokit/openapi-types": "^13.11.0" + "@azure/abort-controller": "^1.0.0", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=12.0.0" } }, - "node_modules/@octokit/openapi-types": { - "version": "12.11.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz", - "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==" + "node_modules/@azure/core-auth/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-3.1.0.tgz", - "integrity": "sha512-+cfc40pMzWcLkoDcLb1KXqjX0jTGYXjKuQdFQDc6UAknISJHnZTiBqld6HDwRJvD4DsouDKrWXNbNV0lE/3AXA==", + "node_modules/@azure/core-http": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@azure/core-http/-/core-http-3.0.1.tgz", + "integrity": "sha512-A3x+um3cAPgQe42Lu7Iv/x8/fNjhL/nIoEfqFxfn30EyxK6zC13n+OUxzZBRC0IzQqssqIbt4INf5YG7lYYFtw==", + "dev": true, "dependencies": { - "@octokit/types": "^6.41.0" + "@azure/abort-controller": "^1.0.0", + "@azure/core-auth": "^1.3.0", + "@azure/core-tracing": "1.0.0-preview.13", + "@azure/core-util": "^1.1.1", + "@azure/logger": "^1.0.0", + "@types/node-fetch": "^2.5.0", + "@types/tunnel": "^0.0.3", + "form-data": "^4.0.0", + "node-fetch": "^2.6.7", + "process": "^0.11.10", + "tslib": "^2.2.0", + "tunnel": "^0.0.6", + "uuid": "^8.3.0", + "xml2js": "^0.5.0" }, "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "@octokit/core": ">=4" + "node": ">=14.0.0" } }, - "node_modules/@octokit/plugin-request-log": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", - "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", - "peerDependencies": { - "@octokit/core": ">=3" - } + "node_modules/@azure/core-http/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true }, - "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-6.2.0.tgz", - "integrity": "sha512-PZ+yfkbZAuRUtqu6Y191/V3eM0KBPx+Yq7nh+ONPdpm3EX4pd5UnK2y2XgO/0AtNum5a4aJCDjqsDuUZ2hWRXw==", + "node_modules/@azure/core-lro": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-2.2.4.tgz", + "integrity": "sha512-e1I2v2CZM0mQo8+RSix0x091Av493e4bnT22ds2fcQGslTHzM2oTbswkB65nP4iEpCxBrFxOSDPKExmTmjCVtQ==", + "dev": true, "dependencies": { - "@octokit/types": "^6.41.0", - "deprecation": "^2.3.1" + "@azure/abort-controller": "^1.0.0", + "@azure/core-tracing": "1.0.0-preview.13", + "@azure/logger": "^1.0.0", + "tslib": "^2.2.0" }, "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "@octokit/core": ">=3" + "node": ">=12.0.0" } }, - "node_modules/@octokit/request": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz", - "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==", + "node_modules/@azure/core-lro/node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "dev": true + }, + "node_modules/@azure/core-paging": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.1.1.tgz", + "integrity": "sha512-hqEJBEGKan4YdOaL9ZG/GRG6PXaFd/Wb3SSjQW4LWotZzgl6xqG00h6wmkrpd2NNkbBkD1erLHBO3lPHApv+iQ==", + "dev": true, "dependencies": { - "@octokit/endpoint": "^6.0.1", - "@octokit/request-error": "^2.1.0", - "@octokit/types": "^6.16.1", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" + "@azure/core-asynciterator-polyfill": "^1.0.0" } }, - "node_modules/@octokit/request-error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz", - "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", + "node_modules/@azure/core-rest-pipeline": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.10.3.tgz", + "integrity": "sha512-AMQb0ttiGJ0MIV/r+4TVra6U4+90mPeOveehFnrqKlo7dknPJYdJ61wOzYJXJjDxF8LcCtSogfRelkq+fCGFTw==", "dependencies": { - "@octokit/types": "^6.0.3", - "deprecation": "^2.0.0", - "once": "^1.4.0" + "@azure/abort-controller": "^1.0.0", + "@azure/core-auth": "^1.4.0", + "@azure/core-tracing": "^1.0.1", + "@azure/core-util": "^1.3.0", + "@azure/logger": "^1.0.0", + "form-data": "^4.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@octokit/request/node_modules/@octokit/endpoint": { - "version": "6.0.12", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz", - "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==", + "node_modules/@azure/core-rest-pipeline/node_modules/@azure/core-tracing": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.1.tgz", + "integrity": "sha512-I5CGMoLtX+pI17ZdiFJZgxMJApsK6jjfm85hpgp3oazCdq5Wxgh4wMr7ge/TTWW1B5WBuvIOI1fMU/FrOAMKrw==", "dependencies": { - "@octokit/types": "^6.0.3", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=12.0.0" } }, - "node_modules/@octokit/rest": { - "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.3.tgz", - "integrity": "sha512-5arkTsnnRT7/sbI4fqgSJ35KiFaN7zQm0uQiQtivNQLI8RQx8EHwJCajcTUwmaCMNDg7tdCvqAnc7uvHHPxrtQ==", + "node_modules/@azure/core-rest-pipeline/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + }, + "node_modules/@azure/core-tracing": { + "version": "1.0.0-preview.13", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.0-preview.13.tgz", + "integrity": "sha512-KxDlhXyMlh2Jhj2ykX6vNEU0Vou4nHr025KoSEiz7cS3BNiHNaZcdECk/DmLkEB0as5T7b/TpRcehJ5yV6NeXQ==", + "dev": true, "dependencies": { - "@octokit/core": "^4.0.0", - "@octokit/plugin-paginate-rest": "^3.0.0", - "@octokit/plugin-request-log": "^1.0.4", - "@octokit/plugin-rest-endpoint-methods": "^6.0.0" + "@opentelemetry/api": "^1.0.1", + "tslib": "^2.2.0" }, "engines": { - "node": ">= 14" + "node": ">=12.0.0" } }, - "node_modules/@octokit/types": { - "version": "6.41.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", - "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", + "node_modules/@azure/core-tracing/node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "dev": true + }, + "node_modules/@azure/core-util": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.3.0.tgz", + "integrity": "sha512-ANP0Er7R2KHHHjwmKzPF9wbd0gXvOX7yRRHeYL1eNd/OaNrMLyfZH/FQasHRVAf6rMXX+EAUpvYwLMFDHDI5Gw==", "dependencies": { - "@octokit/openapi-types": "^12.11.0" + "@azure/abort-controller": "^1.0.0", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@opentelemetry/api": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.0.4.tgz", - "integrity": "sha512-BuJuXRSJNQ3QoKA6GWWDyuLpOUck+9hAXNMCnrloc1aWVoy6Xq6t9PUV08aBZ4Lutqq2LEHM486bpZqoViScog==", - "engines": { - "node": ">=8.0.0" + "node_modules/@azure/core-util/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + }, + "node_modules/@azure/logger": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.0.0.tgz", + "integrity": "sha512-g2qLDgvmhyIxR3JVS8N67CyIOeFRKQlX/llxYJQr1OSGQqM3HTpVP8MjmjcEKbL/OIt2N9C9UFaNQuKOw1laOA==", + "dependencies": { + "tslib": "^1.9.3" } }, - "node_modules/@opentelemetry/api-metrics": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-metrics/-/api-metrics-0.33.0.tgz", - "integrity": "sha512-78evfPRRRnJA6uZ3xuBuS3VZlXTO/LRs+Ff1iv3O/7DgibCtq9k27T6Zlj8yRdJDFmcjcbQrvC0/CpDpWHaZYA==", - "deprecated": "Please use @opentelemetry/api >= 1.3.0", + "node_modules/@azure/opentelemetry-instrumentation-azure-sdk": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/@azure/opentelemetry-instrumentation-azure-sdk/-/opentelemetry-instrumentation-azure-sdk-1.0.0-beta.2.tgz", + "integrity": "sha512-WZ2u3J7LmwwVbyXGguiEGNYHyDoUjNb+VZ9S76xecsYOkoKSzFdWJtv/vYBknW9fLuoWCoyVVg8+lU2ouaZbJQ==", "dependencies": { - "@opentelemetry/api": "^1.0.0" + "@azure/core-tracing": "^1.0.0", + "@azure/logger": "^1.0.0", + "@opentelemetry/api": "^1.2.0", + "@opentelemetry/core": "^1.7.0", + "@opentelemetry/instrumentation": "^0.33.0", + "tslib": "^2.2.0" }, "engines": { - "node": ">=14" + "node": ">=14.0.0" } }, - "node_modules/@opentelemetry/core": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.11.0.tgz", - "integrity": "sha512-aP1wHSb+YfU0pM63UAkizYPuS4lZxzavHHw5KJfFNN2oWQ79HSm6JR3CzwFKHwKhSzHN8RE9fgP1IdVJ8zmo1w==", + "node_modules/@azure/opentelemetry-instrumentation-azure-sdk/node_modules/@azure/core-tracing": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.1.tgz", + "integrity": "sha512-I5CGMoLtX+pI17ZdiFJZgxMJApsK6jjfm85hpgp3oazCdq5Wxgh4wMr7ge/TTWW1B5WBuvIOI1fMU/FrOAMKrw==", "dependencies": { - "@opentelemetry/semantic-conventions": "1.11.0" + "tslib": "^2.2.0" }, "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.5.0" + "node": ">=12.0.0" } }, - "node_modules/@opentelemetry/core/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.11.0.tgz", - "integrity": "sha512-fG4D0AktoHyHwGhFGv+PzKrZjxbKJfckJauTJdq2A+ej5cTazmNYjJVAODXXkYyrsI10muMl+B1iO2q1R6Lp+w==", + "node_modules/@azure/opentelemetry-instrumentation-azure-sdk/node_modules/@opentelemetry/api": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.4.1.tgz", + "integrity": "sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA==", "engines": { - "node": ">=14" + "node": ">=8.0.0" } }, - "node_modules/@opentelemetry/instrumentation": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.33.0.tgz", - "integrity": "sha512-8joPjKJ6TznNt04JbnzZG+m1j/4wm1OIrX7DEw/V5lyZ9/2fahIqG72jeZ26VKOZnLOpVzUUnU/dweURqBzT3Q==", - "dependencies": { - "@opentelemetry/api-metrics": "0.33.0", - "require-in-the-middle": "^5.0.3", - "semver": "^7.3.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - } + "node_modules/@azure/opentelemetry-instrumentation-azure-sdk/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" }, - "node_modules/@opentelemetry/instrumentation/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "node_modules/@azure/storage-blob": { + "version": "12.13.0", + "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.13.0.tgz", + "integrity": "sha512-t3Q2lvBMJucgTjQcP5+hvEJMAsJSk0qmAnjDLie2td017IiduZbbC9BOcFfmwzR6y6cJdZOuewLCNFmEx9IrXA==", + "dev": true, "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "@azure/abort-controller": "^1.0.0", + "@azure/core-http": "^3.0.0", + "@azure/core-lro": "^2.2.0", + "@azure/core-paging": "^1.1.1", + "@azure/core-tracing": "1.0.0-preview.13", + "@azure/logger": "^1.0.0", + "events": "^3.0.0", + "tslib": "^2.2.0" }, "engines": { - "node": ">=10" + "node": ">=14.0.0" } }, - "node_modules/@opentelemetry/semantic-conventions": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.0.1.tgz", - "integrity": "sha512-7XU1sfQ8uCVcXLxtAHA8r3qaLJ2oq7sKtEwzZhzuEXqYmjW+n+J4yM3kNo0HQo3Xp1eUe47UM6Wy6yuAvIyllg==", - "engines": { - "node": ">=8.0.0" - } + "node_modules/@azure/storage-blob/node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "dev": true }, - "node_modules/@slack/logger": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@slack/logger/-/logger-3.0.0.tgz", - "integrity": "sha512-DTuBFbqu4gGfajREEMrkq5jBhcnskinhr4+AnfJEk48zhVeEv3XnUKGIX98B74kxhYsIMfApGGySTn7V3b5yBA==", + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, "dependencies": { - "@types/node": ">=12.0.0" + "@jridgewell/trace-mapping": "0.3.9" }, "engines": { - "node": ">= 12.13.0", - "npm": ">= 6.12.0" - } - }, - "node_modules/@slack/types": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@slack/types/-/types-2.7.0.tgz", - "integrity": "sha512-QUrHBilZeWyXAuHfEbSnzBwvFm4u/75LHKRKu8xRUnGNt35Amz8y9YQwb6voU1S5FmTYxMNAL+ZbAPTor4aRdw==", - "engines": { - "node": ">= 12.13.0", - "npm": ">= 6.12.0" + "node": ">=12" } }, - "node_modules/@slack/web-api": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@slack/web-api/-/web-api-6.7.2.tgz", - "integrity": "sha512-qgWMxdy1A2uNvhETfRl349UjTEvnUzHl947Ly5c+lqOrXJIwsG12szL4tD3WrRlTuxCijDemF3FjtUNz18YAxg==", + "node_modules/@eslint/eslintrc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", + "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", + "dev": true, "dependencies": { - "@slack/logger": "^3.0.0", - "@slack/types": "^2.0.0", - "@types/is-stream": "^1.1.0", - "@types/node": ">=12.0.0", - "axios": "^0.27.2", - "eventemitter3": "^3.1.0", - "form-data": "^2.5.0", - "is-electron": "2.2.0", - "is-stream": "^1.1.0", - "p-queue": "^6.6.1", - "p-retry": "^4.0.0" + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.3.2", + "globals": "^13.15.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" }, "engines": { - "node": ">= 12.13.0", - "npm": ">= 6.12.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@slack/web-api/node_modules/form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "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==", + "dev": true, "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" }, "engines": { - "node": ">= 0.12" + "node": ">=10.10.0" } }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "engines": { - "node": ">= 10" + "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, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "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==", - "dev": true + "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==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } }, - "node_modules/@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "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==", "dev": true }, - "node_modules/@types/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@types/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-jkZatu4QVbR60mpIzjINmtS1ZF4a/FqdTUTBeQDVOQ2PYyidtwFKr0B5G6ERukKwliq+7mIXvxyppwzG5EgRYg==", + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, "dependencies": { - "@types/node": "*" + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "node_modules/@types/mocha": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", - "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", - "dev": true - }, - "node_modules/@types/node": { - "version": "14.14.22", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.22.tgz", - "integrity": "sha512-g+f/qj/cNcqKkc3tFqlXOYjrmZA+jNBiDzbP3kH+B+otKFqAdPgVTGP1IeKRdMml/aE69as5S4FqtxAbl+LaMw==" + "node_modules/@microsoft/applicationinsights-web-snippet": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-web-snippet/-/applicationinsights-web-snippet-1.0.1.tgz", + "integrity": "sha512-2IHAOaLauc8qaAitvWS+U931T+ze+7MNWrDHY47IENP5y2UA0vqJDu67kWZDdpCN1fFC77sfgfB+HV7SrKshnQ==" }, - "node_modules/@types/node-fetch": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.3.tgz", - "integrity": "sha512-ETTL1mOEdq/sxUtgtOhKjyB2Irra4cjxksvcMUR5Zr4n+PxVhsCD9WS46oPbHL3et9Zde7CNRr+WUNlcHvsX+w==", + "node_modules/@mongodb-js/saslprep": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.0.tgz", + "integrity": "sha512-Xfijy7HvfzzqiOAhAepF4SGN5e9leLkMvg/OPOF97XemjfVCYN/oWa75wnkc6mltMSTwY+XlbhWgUOJmkFspSw==", "dev": true, + "optional": true, "dependencies": { - "@types/node": "*", - "form-data": "^3.0.0" + "sparse-bitfield": "^3.0.3" } }, - "node_modules/@types/node-fetch/node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, "engines": { - "node": ">= 6" + "node": ">= 8" } }, - "node_modules/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" - }, - "node_modules/@types/tunnel": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@types/tunnel/-/tunnel-0.0.3.tgz", - "integrity": "sha512-sOUTGn6h1SfQ+gbgqC364jLFBw2lnFqkgF3q0WovEHRLMrVD1sd5aufqi/aJObLekJO+Aq5z646U4Oxy6shXMA==", + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, - "dependencies": { - "@types/node": "*" + "engines": { + "node": ">= 8" } }, - "node_modules/@types/uuid": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", - "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", - "dev": true - }, - "node_modules/@types/webidl-conversions": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-6.1.1.tgz", - "integrity": "sha512-XAahCdThVuCFDQLT7R7Pk/vqeObFNL3YqRyFZg+AqAP/W1/w3xHaIxuW7WszQqTbIBOPRcItYJIou3i/mppu3Q==", - "dev": true - }, - "node_modules/@types/whatwg-url": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.1.tgz", - "integrity": "sha512-2YubE1sjj5ifxievI5Ge1sckb9k/Er66HyR2c+3+I6VDUUg1TLPdYYTEbQ+DjRkS4nTxMJhgWfSfMRD2sl2EYQ==", + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "dependencies": { - "@types/node": "*", - "@types/webidl-conversions": "*" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/@types/yargs": { - "version": "17.0.11", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.11.tgz", - "integrity": "sha512-aB4y9UDUXTSMxmM4MH+YnuR0g5Cph3FLQBoWoMB21DSvFVAxRVEHEMx3TLh+zUZYMCQtKiqazz0Q4Rre31f/OA==", - "dev": true, + "node_modules/@octokit/auth-token": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.0.tgz", + "integrity": "sha512-MDNFUBcJIptB9At7HiV7VCvU3NcL4GnfCQaP8C5lrxWrRPMJBnemYtehaKSOlaM7AYxeRyj9etenu8LVpSpVaQ==", "dependencies": { - "@types/yargs-parser": "*" + "@octokit/types": "^6.0.3" + }, + "engines": { + "node": ">= 14" } }, - "node_modules/@types/yargs-parser": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", - "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", - "dev": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.33.0.tgz", - "integrity": "sha512-jHvZNSW2WZ31OPJ3enhLrEKvAZNyAFWZ6rx9tUwaessTc4sx9KmgMNhVcqVAl1ETnT5rU5fpXTLmY9YvC1DCNg==", - "dev": true, + "node_modules/@octokit/core": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.0.4.tgz", + "integrity": "sha512-sUpR/hc4Gc7K34o60bWC7WUH6Q7T6ftZ2dUmepSyJr9PRF76/qqkWjE2SOEzCqLA5W83SaISymwKtxks+96hPQ==", "dependencies": { - "@typescript-eslint/scope-manager": "5.33.0", - "@typescript-eslint/type-utils": "5.33.0", - "@typescript-eslint/utils": "5.33.0", - "debug": "^4.3.4", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.2.0", - "regexpp": "^3.2.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "@octokit/auth-token": "^3.0.0", + "@octokit/graphql": "^5.0.0", + "@octokit/request": "^6.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^6.0.3", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">= 14" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, + "node_modules/@octokit/core/node_modules/@octokit/request": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.0.tgz", + "integrity": "sha512-7IAmHnaezZrgUqtRShMlByJK33MT9ZDnMRgZjnRrRV9a/jzzFwKGz0vxhFU6i7VMLraYcQ1qmcAOin37Kryq+Q==", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "@octokit/endpoint": "^7.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^6.16.1", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.7", + "universal-user-agent": "^6.0.0" }, "engines": { - "node": ">=10" + "node": ">= 14" } }, - "node_modules/@typescript-eslint/parser": { - "version": "5.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.33.0.tgz", - "integrity": "sha512-cgM5cJrWmrDV2KpvlcSkelTBASAs1mgqq+IUGKJvFxWrapHpaRy5EXPQz9YaKF3nZ8KY18ILTiVpUtbIac86/w==", - "dev": true, + "node_modules/@octokit/core/node_modules/@octokit/request-error": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.0.tgz", + "integrity": "sha512-WBtpzm9lR8z4IHIMtOqr6XwfkGvMOOILNLxsWvDwtzm/n7f5AWuqJTXQXdDtOvPfTDrH4TPhEvW2qMlR4JFA2w==", "dependencies": { - "@typescript-eslint/scope-manager": "5.33.0", - "@typescript-eslint/types": "5.33.0", - "@typescript-eslint/typescript-estree": "5.33.0", - "debug": "^4.3.4" + "@octokit/types": "^6.0.3", + "deprecation": "^2.0.0", + "once": "^1.4.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">= 14" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.33.0.tgz", - "integrity": "sha512-/Jta8yMNpXYpRDl8EwF/M8It2A9sFJTubDo0ATZefGXmOqlaBffEw0ZbkbQ7TNDK6q55NPHFshGBPAZvZkE8Pw==", - "dev": true, + "node_modules/@octokit/endpoint": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.0.tgz", + "integrity": "sha512-Kz/mIkOTjs9rV50hf/JK9pIDl4aGwAtT8pry6Rpy+hVXkAPhXanNQRxMoq6AeRgDCZR6t/A1zKniY2V1YhrzlQ==", "dependencies": { - "@typescript-eslint/types": "5.33.0", - "@typescript-eslint/visitor-keys": "5.33.0" + "@octokit/types": "^6.0.3", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">= 14" } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.33.0.tgz", - "integrity": "sha512-2zB8uEn7hEH2pBeyk3NpzX1p3lF9dKrEbnXq1F7YkpZ6hlyqb2yZujqgRGqXgRBTHWIUG3NGx/WeZk224UKlIA==", - "dev": true, + "node_modules/@octokit/graphql": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.0.tgz", + "integrity": "sha512-1ZZ8tX4lUEcLPvHagfIVu5S2xpHYXAmgN0+95eAOPoaVPzCfUXJtA5vASafcpWcO86ze0Pzn30TAx72aB2aguQ==", "dependencies": { - "@typescript-eslint/utils": "5.33.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" + "@octokit/request": "^6.0.0", + "@octokit/types": "^6.0.3", + "universal-user-agent": "^6.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">= 14" } }, - "node_modules/@typescript-eslint/types": { - "version": "5.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.33.0.tgz", - "integrity": "sha512-nIMt96JngB4MYFYXpZ/3ZNU4GWPNdBbcB5w2rDOCpXOVUkhtNlG2mmm8uXhubhidRZdwMaMBap7Uk8SZMU/ppw==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } + "node_modules/@octokit/graphql/node_modules/@octokit/openapi-types": { + "version": "13.13.1", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-13.13.1.tgz", + "integrity": "sha512-4EuKSk3N95UBWFau3Bz9b3pheQ8jQYbKmBL5+GSuY8YDPDwu03J4BjI+66yNi8aaX/3h1qDpb0mbBkLdr+cfGQ==" }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.33.0.tgz", - "integrity": "sha512-tqq3MRLlggkJKJUrzM6wltk8NckKyyorCSGMq4eVkyL5sDYzJJcMgZATqmF8fLdsWrW7OjjIZ1m9v81vKcaqwQ==", - "dev": true, + "node_modules/@octokit/graphql/node_modules/@octokit/request": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.1.tgz", + "integrity": "sha512-gYKRCia3cpajRzDSU+3pt1q2OcuC6PK8PmFIyxZDWCzRXRSIBH8jXjFJ8ZceoygBIm0KsEUg4x1+XcYBz7dHPQ==", "dependencies": { - "@typescript-eslint/types": "5.33.0", - "@typescript-eslint/visitor-keys": "5.33.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "@octokit/endpoint": "^7.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^7.0.0", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.7", + "universal-user-agent": "^6.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">= 14" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, + "node_modules/@octokit/graphql/node_modules/@octokit/request-error": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.1.tgz", + "integrity": "sha512-ym4Bp0HTP7F3VFssV88WD1ZyCIRoE8H35pXSKwLeMizcdZAYc/t6N9X9Yr9n6t3aG9IH75XDnZ6UeZph0vHMWQ==", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "@octokit/types": "^7.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" }, "engines": { - "node": ">=10" + "node": ">= 14" } }, - "node_modules/@typescript-eslint/utils": { - "version": "5.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.33.0.tgz", - "integrity": "sha512-JxOAnXt9oZjXLIiXb5ZIcZXiwVHCkqZgof0O8KPgz7C7y0HS42gi75PdPlqh1Tf109M0fyUw45Ao6JLo7S5AHw==", - "dev": true, + "node_modules/@octokit/graphql/node_modules/@octokit/request-error/node_modules/@octokit/types": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-7.5.1.tgz", + "integrity": "sha512-Zk4OUMLCSpXNI8KZZn47lVLJSsgMyCimsWWQI5hyjZg7hdYm0kjotaIkbG0Pp8SfU2CofMBzonboTqvzn3FrJA==", "dependencies": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.33.0", - "@typescript-eslint/types": "5.33.0", - "@typescript-eslint/typescript-estree": "5.33.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@octokit/openapi-types": "^13.11.0" } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.33.0.tgz", - "integrity": "sha512-/XsqCzD4t+Y9p5wd9HZiptuGKBlaZO5showwqODii5C0nZawxWLF+Q6k5wYHBrQv96h6GYKyqqMHCSTqta8Kiw==", - "dev": true, + "node_modules/@octokit/graphql/node_modules/@octokit/request/node_modules/@octokit/types": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-7.5.1.tgz", + "integrity": "sha512-Zk4OUMLCSpXNI8KZZn47lVLJSsgMyCimsWWQI5hyjZg7hdYm0kjotaIkbG0Pp8SfU2CofMBzonboTqvzn3FrJA==", "dependencies": { - "@typescript-eslint/types": "5.33.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "@octokit/openapi-types": "^13.11.0" } }, - "node_modules/@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "dev": true + "node_modules/@octokit/openapi-types": { + "version": "12.11.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz", + "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==" }, - "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==", - "dev": true, - "bin": { - "acorn": "bin/acorn" + "node_modules/@octokit/plugin-paginate-rest": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-3.1.0.tgz", + "integrity": "sha512-+cfc40pMzWcLkoDcLb1KXqjX0jTGYXjKuQdFQDc6UAknISJHnZTiBqld6HDwRJvD4DsouDKrWXNbNV0lE/3AXA==", + "dependencies": { + "@octokit/types": "^6.41.0" }, "engines": { - "node": ">=0.4.0" + "node": ">= 14" + }, + "peerDependencies": { + "@octokit/core": ">=4" } }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, + "node_modules/@octokit/plugin-request-log": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", + "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@octokit/core": ">=3" } }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, + "node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-6.2.0.tgz", + "integrity": "sha512-PZ+yfkbZAuRUtqu6Y191/V3eM0KBPx+Yq7nh+ONPdpm3EX4pd5UnK2y2XgO/0AtNum5a4aJCDjqsDuUZ2hWRXw==", + "dependencies": { + "@octokit/types": "^6.41.0", + "deprecation": "^2.3.1" + }, "engines": { - "node": ">=0.4.0" + "node": ">= 14" + }, + "peerDependencies": { + "@octokit/core": ">=3" } }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "node_modules/@octokit/request": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz", + "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==", "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" + "@octokit/endpoint": "^6.0.1", + "@octokit/request-error": "^2.1.0", + "@octokit/types": "^6.16.1", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.7", + "universal-user-agent": "^6.0.0" } }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, + "node_modules/@octokit/request-error": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz", + "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "@octokit/types": "^6.0.3", + "deprecation": "^2.0.0", + "once": "^1.4.0" } }, - "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true, - "engines": { - "node": ">=6" + "node_modules/@octokit/request/node_modules/@octokit/endpoint": { + "version": "6.0.12", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz", + "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==", + "dependencies": { + "@octokit/types": "^6.0.3", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" } }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, + "node_modules/@octokit/rest": { + "version": "19.0.3", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.3.tgz", + "integrity": "sha512-5arkTsnnRT7/sbI4fqgSJ35KiFaN7zQm0uQiQtivNQLI8RQx8EHwJCajcTUwmaCMNDg7tdCvqAnc7uvHHPxrtQ==", + "dependencies": { + "@octokit/core": "^4.0.0", + "@octokit/plugin-paginate-rest": "^3.0.0", + "@octokit/plugin-request-log": "^1.0.4", + "@octokit/plugin-rest-endpoint-methods": "^6.0.0" + }, "engines": { - "node": ">=8" + "node": ">= 14" } }, - "node_modules/ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, + "node_modules/@octokit/types": { + "version": "6.41.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", + "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", "dependencies": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - }, + "@octokit/openapi-types": "^12.11.0" + } + }, + "node_modules/@opentelemetry/api": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.0.4.tgz", + "integrity": "sha512-BuJuXRSJNQ3QoKA6GWWDyuLpOUck+9hAXNMCnrloc1aWVoy6Xq6t9PUV08aBZ4Lutqq2LEHM486bpZqoViScog==", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=8.0.0" } }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, + "node_modules/@opentelemetry/api-metrics": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-metrics/-/api-metrics-0.33.0.tgz", + "integrity": "sha512-78evfPRRRnJA6uZ3xuBuS3VZlXTO/LRs+Ff1iv3O/7DgibCtq9k27T6Zlj8yRdJDFmcjcbQrvC0/CpDpWHaZYA==", + "deprecated": "Please use @opentelemetry/api >= 1.3.0", "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "@opentelemetry/api": "^1.0.0" }, "engines": { - "node": ">= 8" + "node": ">=14" } }, - "node_modules/applicationinsights": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/applicationinsights/-/applicationinsights-2.5.1.tgz", - "integrity": "sha512-FkkvevcsaPnfifZvVTSxZy6njnNKpTaOFZQ55cGlbvVX9Y15vuRFpZUdLTLLyS0vqOeNUa+xk30jzwLjJBTXbQ==", + "node_modules/@opentelemetry/core": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.11.0.tgz", + "integrity": "sha512-aP1wHSb+YfU0pM63UAkizYPuS4lZxzavHHw5KJfFNN2oWQ79HSm6JR3CzwFKHwKhSzHN8RE9fgP1IdVJ8zmo1w==", "dependencies": { - "@azure/core-auth": "^1.4.0", - "@azure/core-rest-pipeline": "^1.10.0", - "@azure/opentelemetry-instrumentation-azure-sdk": "^1.0.0-beta.2", - "@microsoft/applicationinsights-web-snippet": "^1.0.1", - "@opentelemetry/api": "^1.0.4", - "@opentelemetry/core": "^1.0.1", - "@opentelemetry/sdk-trace-base": "^1.0.1", - "@opentelemetry/semantic-conventions": "^1.0.1", - "cls-hooked": "^4.2.2", - "continuation-local-storage": "^3.2.1", - "diagnostic-channel": "1.1.0", - "diagnostic-channel-publishers": "1.0.5" + "@opentelemetry/semantic-conventions": "1.11.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=14" }, "peerDependencies": { - "applicationinsights-native-metrics": "*" - }, - "peerDependenciesMeta": { - "applicationinsights-native-metrics": { - "optional": true - } + "@opentelemetry/api": ">=1.0.0 <1.5.0" } }, - "node_modules/applicationinsights/node_modules/@opentelemetry/core": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", - "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", + "node_modules/@opentelemetry/core/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.11.0.tgz", + "integrity": "sha512-fG4D0AktoHyHwGhFGv+PzKrZjxbKJfckJauTJdq2A+ej5cTazmNYjJVAODXXkYyrsI10muMl+B1iO2q1R6Lp+w==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.33.0.tgz", + "integrity": "sha512-8joPjKJ6TznNt04JbnzZG+m1j/4wm1OIrX7DEw/V5lyZ9/2fahIqG72jeZ26VKOZnLOpVzUUnU/dweURqBzT3Q==", "dependencies": { - "@opentelemetry/semantic-conventions": "1.0.1" + "@opentelemetry/api-metrics": "0.33.0", + "require-in-the-middle": "^5.0.3", + "semver": "^7.3.2", + "shimmer": "^1.2.1" }, "engines": { - "node": ">=8.5.0" + "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.1.0" + "@opentelemetry/api": "^1.0.0" } }, - "node_modules/applicationinsights/node_modules/@opentelemetry/resources": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.0.1.tgz", - "integrity": "sha512-p8DevOaAEepPucUtImR4cZKHOE2L1jgQAtkdZporV+XnxPA/HqCHPEESyUVuo4f5M0NUlL6k5Pba75KwNJlTRg==", + "node_modules/@opentelemetry/instrumentation/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dependencies": { - "@opentelemetry/core": "1.0.1", - "@opentelemetry/semantic-conventions": "1.0.1" + "lru-cache": "^6.0.0" }, - "engines": { - "node": ">=8.0.0" + "bin": { + "semver": "bin/semver.js" }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.1.0" + "engines": { + "node": ">=10" } }, - "node_modules/applicationinsights/node_modules/@opentelemetry/sdk-trace-base": { + "node_modules/@opentelemetry/semantic-conventions": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.0.1.tgz", - "integrity": "sha512-JVSAepTpW7dnqfV7XFN0zHj1jXGNd5OcvIGQl76buogqffdgJdgJWQNrOuUJaus56zrOtlzqFH+YtMA9RGEg8w==", - "dependencies": { - "@opentelemetry/core": "1.0.1", - "@opentelemetry/resources": "1.0.1", - "@opentelemetry/semantic-conventions": "1.0.1" - }, + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.0.1.tgz", + "integrity": "sha512-7XU1sfQ8uCVcXLxtAHA8r3qaLJ2oq7sKtEwzZhzuEXqYmjW+n+J4yM3kNo0HQo3Xp1eUe47UM6Wy6yuAvIyllg==", "engines": { "node": ">=8.0.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.1.0" } }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, + "node_modules/@slack/logger": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@slack/logger/-/logger-3.0.0.tgz", + "integrity": "sha512-DTuBFbqu4gGfajREEMrkq5jBhcnskinhr4+AnfJEk48zhVeEv3XnUKGIX98B74kxhYsIMfApGGySTn7V3b5yBA==", + "dependencies": { + "@types/node": ">=12.0.0" + }, "engines": { - "node": ">=8" + "node": ">= 12.13.0", + "npm": ">= 6.12.0" } }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, + "node_modules/@slack/types": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@slack/types/-/types-2.7.0.tgz", + "integrity": "sha512-QUrHBilZeWyXAuHfEbSnzBwvFm4u/75LHKRKu8xRUnGNt35Amz8y9YQwb6voU1S5FmTYxMNAL+ZbAPTor4aRdw==", "engines": { - "node": "*" + "node": ">= 12.13.0", + "npm": ">= 6.12.0" } }, - "node_modules/async-hook-jl": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/async-hook-jl/-/async-hook-jl-1.7.6.tgz", - "integrity": "sha512-gFaHkFfSxTjvoxDMYqDuGHlcRyUuamF8s+ZTtJdDzqjws4mCt7v0vuV79/E2Wr2/riMQgtG4/yUtXWs1gZ7JMg==", + "node_modules/@slack/web-api": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@slack/web-api/-/web-api-6.7.2.tgz", + "integrity": "sha512-qgWMxdy1A2uNvhETfRl349UjTEvnUzHl947Ly5c+lqOrXJIwsG12szL4tD3WrRlTuxCijDemF3FjtUNz18YAxg==", "dependencies": { - "stack-chain": "^1.3.7" + "@slack/logger": "^3.0.0", + "@slack/types": "^2.0.0", + "@types/is-stream": "^1.1.0", + "@types/node": ">=12.0.0", + "axios": "^0.27.2", + "eventemitter3": "^3.1.0", + "form-data": "^2.5.0", + "is-electron": "2.2.0", + "is-stream": "^1.1.0", + "p-queue": "^6.6.1", + "p-retry": "^4.0.0" }, "engines": { - "node": "^4.7 || >=6.9 || >=7.3" + "node": ">= 12.13.0", + "npm": ">= 6.12.0" } }, - "node_modules/async-listener": { - "version": "0.6.10", - "resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.10.tgz", - "integrity": "sha512-gpuo6xOyF4D5DE5WvyqZdPA3NGhiT6Qf07l7DCB0wwDEsLvDIbCr6j9S5aj5Ch96dLace5tXVzWBZkxU/c5ohw==", + "node_modules/@slack/web-api/node_modules/form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", "dependencies": { - "semver": "^5.3.0", - "shimmer": "^1.1.0" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" }, "engines": { - "node": "<=0.11.8 || >0.11.10" + "node": ">= 0.12" } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "node_modules/axios": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", - "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "node_modules/@smithy/abort-controller": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.5.tgz", + "integrity": "sha512-byVZ2KWLMPYAZGKjRpniAzLcygJO4ruClZKdJTuB0eCB76ONFTdptBHlviHpAZXknRz7skYWPfcgO9v30A1SyA==", + "dev": true, + "optional": true, "dependencies": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "node_modules/@smithy/abort-controller/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "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/before-after-hook": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.2.tgz", - "integrity": "sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ==" + "optional": true }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "node_modules/@smithy/config-resolver": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.5.tgz", + "integrity": "sha512-n0c2AXz+kjALY2FQr7Zy9zhYigXzboIh1AuUUVCqFBKFtdEvTwnwPXrTDoEehLiRTUHNL+4yzZ3s+D0kKYSLSg==", "dev": true, + "optional": true, + "dependencies": { + "@smithy/types": "^2.2.2", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.0", + "tslib": "^2.5.0" + }, "engines": { - "node": ">=8" + "node": ">=14.0.0" } }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/@smithy/config-resolver/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } + "optional": true }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "node_modules/@smithy/credential-provider-imds": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.0.7.tgz", + "integrity": "sha512-XivkZj/pipzpQPxgleE1odwJQ6oDsVViB4VUO/HRDI4EdEfZjud44USupOUOa/xOjS39/75DYB4zgTbyV+totw==", "dev": true, + "optional": true, "dependencies": { - "fill-range": "^7.0.1" + "@smithy/node-config-provider": "^2.0.7", + "@smithy/property-provider": "^2.0.6", + "@smithy/types": "^2.2.2", + "@smithy/url-parser": "^2.0.5", + "tslib": "^2.5.0" }, "engines": { - "node": ">=8" + "node": ">=14.0.0" } }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true + "node_modules/@smithy/credential-provider-imds/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true }, - "node_modules/bson": { - "version": "4.6.5", - "resolved": "https://registry.npmjs.org/bson/-/bson-4.6.5.tgz", - "integrity": "sha512-uqrgcjyOaZsHfz7ea8zLRCLe1u+QGUSzMZmvXqO24CDW7DWoW1qiN9folSwa7hSneTSgM2ykDIzF5kcQQ8cwNw==", + "node_modules/@smithy/eventstream-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.5.tgz", + "integrity": "sha512-iqR6OuOV3zbQK8uVs9o+9AxhVk8kW9NAxA71nugwUB+kTY9C35pUd0A5/m4PRT0Y0oIW7W4kgnSR3fdYXQjECw==", "dev": true, + "optional": true, "dependencies": { - "buffer": "^5.6.0" - }, - "engines": { - "node": ">=6.9.0" + "@aws-crypto/crc32": "3.0.0", + "@smithy/types": "^2.2.2", + "@smithy/util-hex-encoding": "^2.0.0", + "tslib": "^2.5.0" } }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "node_modules/@smithy/eventstream-codec/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "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" - } - ], + "optional": true + }, + "node_modules/@smithy/fetch-http-handler": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.0.5.tgz", + "integrity": "sha512-EzFoMowdBNy1VqtvkiXgPFEdosIAt4/4bgZ8uiDiUyfhmNXq/3bV+CagPFFBsgFOR/X2XK4zFZHRsoa7PNHVVg==", + "dev": true, + "optional": true, "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "@smithy/protocol-http": "^2.0.5", + "@smithy/querystring-builder": "^2.0.5", + "@smithy/types": "^2.2.2", + "@smithy/util-base64": "^2.0.0", + "tslib": "^2.5.0" } }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "node_modules/@smithy/fetch-http-handler/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true, - "engines": { - "node": ">=6" - } + "optional": true }, - "node_modules/chai": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", - "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", + "node_modules/@smithy/hash-node": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.5.tgz", + "integrity": "sha512-mk551hIywBITT+kXruRNXk7f8Fy7DTzBjZJSr/V6nolYKmUHIG3w5QU6nO9qPYEQGKc/yEPtkpdS28ndeG93lA==", "dev": true, + "optional": true, "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" + "@smithy/types": "^2.2.2", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" }, "engines": { - "node": ">=4" + "node": ">=14.0.0" } }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@smithy/hash-node/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "optional": true + }, + "node_modules/@smithy/invalid-dependency": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.5.tgz", + "integrity": "sha512-0wEi+JT0hM+UUwrJVYbqjuGFhy5agY/zXyiN7BNAJ1XoCDjU5uaNSj8ekPWsXd/d4yM6NSe8UbPd8cOc1+3oBQ==", + "dev": true, + "optional": true, + "dependencies": { + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" } }, - "node_modules/check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "node_modules/@smithy/invalid-dependency/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + }, + "node_modules/@smithy/is-array-buffer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.0.0.tgz", + "integrity": "sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==", "dev": true, + "optional": true, + "dependencies": { + "tslib": "^2.5.0" + }, "engines": { - "node": "*" + "node": ">=14.0.0" } }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "node_modules/@smithy/is-array-buffer/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], + "optional": true + }, + "node_modules/@smithy/middleware-content-length": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.5.tgz", + "integrity": "sha512-E7VwV5H02fgZIUGRli4GevBCAPvkyEI/fgl9SU47nPPi3DAAX3nEtUb8xfGbXjOcJ5BdSUoWWZn42tEd/blOqA==", + "dev": true, + "optional": true, "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "@smithy/protocol-http": "^2.0.5", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" }, "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "node": ">=14.0.0" } }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "node_modules/@smithy/middleware-content-length/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + }, + "node_modules/@smithy/middleware-endpoint": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.0.5.tgz", + "integrity": "sha512-tyzDuoNTbsMQCq5Xkc4QOt6e2GACUllQIV8SQ5fc59FtOIV9/vbf58/GxVjZm2o8+MMbdDBANjTDZe/ijZKfyA==", "dev": true, + "optional": true, "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "@smithy/middleware-serde": "^2.0.5", + "@smithy/types": "^2.2.2", + "@smithy/url-parser": "^2.0.5", + "@smithy/util-middleware": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/cls-hooked": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/cls-hooked/-/cls-hooked-4.2.2.tgz", - "integrity": "sha512-J4Xj5f5wq/4jAvcdgoGsL3G103BtWpZrMo8NEinRltN+xpTZdI+M38pyQqhuFU/P792xkMFvnKSf+Lm81U1bxw==", + "node_modules/@smithy/middleware-endpoint/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + }, + "node_modules/@smithy/middleware-retry": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.5.tgz", + "integrity": "sha512-ulIfbFyzQTVnJbLjUl1CTSi0etg6tej/ekwaLp0Gn8ybUkDkKYa+uB6CF/m2J5B6meRwyJlsryR+DjaOVyiicg==", + "dev": true, + "optional": true, "dependencies": { - "async-hook-jl": "^1.7.6", - "emitter-listener": "^1.0.1", - "semver": "^5.4.1" + "@smithy/protocol-http": "^2.0.5", + "@smithy/service-error-classification": "^2.0.0", + "@smithy/types": "^2.2.2", + "@smithy/util-middleware": "^2.0.0", + "@smithy/util-retry": "^2.0.0", + "tslib": "^2.5.0", + "uuid": "^8.3.2" }, "engines": { - "node": "^4.7 || >=6.9 || >=7.3 || >=8.2.1" + "node": ">=14.0.0" } }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@smithy/middleware-retry/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + }, + "node_modules/@smithy/middleware-serde": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.5.tgz", + "integrity": "sha512-in0AA5sous74dOfTGU9rMJBXJ0bDVNxwdXtEt5lh3FVd2sEyjhI+rqpLLRF1E4ixbw3RSEf80hfRpcPdjg4vvQ==", "dev": true, + "optional": true, "dependencies": { - "color-name": "~1.1.4" + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=14.0.0" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "node_modules/@smithy/middleware-serde/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "node_modules/@smithy/middleware-stack": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.0.tgz", + "integrity": "sha512-31XC1xNF65nlbc16yuh3wwTudmqs6qy4EseQUGF8A/p2m/5wdd/cnXJqpniy/XvXVwkHPz/GwV36HqzHtIKATQ==", + "dev": true, + "optional": true, "dependencies": { - "delayed-stream": "~1.0.0" + "tslib": "^2.5.0" }, "engines": { - "node": ">= 0.8" + "node": ">=14.0.0" } }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "node_modules/@smithy/middleware-stack/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true }, - "node_modules/continuation-local-storage": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", - "integrity": "sha512-jx44cconVqkCEEyLSKWwkvUXwO561jXMa3LPjTPsm5QR22PA0/mhe33FT4Xb5y74JDvt/Cq+5lm8S8rskLv9ZA==", + "node_modules/@smithy/node-config-provider": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.0.7.tgz", + "integrity": "sha512-GuLxhnf0aVQsfQp4ZWaM1TRCIndpQjAswyFcmDFRNf4yFqpxpLPDeV540+O0Z21Hmu3deoQm/dCPXbVn90PYzg==", + "dev": true, + "optional": true, "dependencies": { - "async-listener": "^0.6.0", - "emitter-listener": "^1.1.1" + "@smithy/property-provider": "^2.0.6", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true + "node_modules/@smithy/node-config-provider/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/@smithy/node-http-handler": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.0.5.tgz", + "integrity": "sha512-lZm5DZf4b3V0saUw9WTC4/du887P6cy2fUyQgQQKRRV6OseButyD5yTzeMmXE53CaXJBMBsUvvIQ0hRVxIq56w==", + "dev": true, + "optional": true, "dependencies": { - "ms": "2.1.2" + "@smithy/abort-controller": "^2.0.5", + "@smithy/protocol-http": "^2.0.5", + "@smithy/querystring-builder": "^2.0.5", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=14.0.0" } }, - "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==", + "node_modules/@smithy/node-http-handler/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + }, + "node_modules/@smithy/property-provider": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.6.tgz", + "integrity": "sha512-CVem6ZkkWxbTnhjDLyLESY0oLA6IUZYtdqrCpGQKUXaFBOuc/izjm7fIFGBxEbjZ1EGcH9hHxrjqX36RWULNRg==", "dev": true, + "optional": true, "dependencies": { - "type-detect": "^4.0.0" + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" }, "engines": { - "node": ">=0.12" + "node": ">=14.0.0" } }, - "node_modules/deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true + "node_modules/@smithy/property-provider/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "node_modules/@smithy/protocol-http": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-2.0.5.tgz", + "integrity": "sha512-d2hhHj34mA2V86doiDfrsy2fNTnUOowGaf9hKb0hIPHqvcnShU4/OSc4Uf1FwHkAdYF3cFXTrj5VGUYbEuvMdw==", + "dev": true, + "optional": true, + "dependencies": { + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, "engines": { - "node": ">=0.4.0" + "node": ">=14.0.0" } }, - "node_modules/denque": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.0.1.tgz", - "integrity": "sha512-tfiWc6BQLXNLpNiR5iGd0Ocu3P3VpxfzFiqubLgMfhfOw9WyvgJBd46CClNn9k3qfbjvT//0cf7AlYRX/OslMQ==", + "node_modules/@smithy/protocol-http/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + }, + "node_modules/@smithy/querystring-builder": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.5.tgz", + "integrity": "sha512-4DCX9krxLzATj+HdFPC3i8pb7XTAWzzKqSw8aTZMjXjtQY+vhe4azMAqIvbb6g7JKwIkmkRAjK6EXO3YWSnJVQ==", "dev": true, + "optional": true, + "dependencies": { + "@smithy/types": "^2.2.2", + "@smithy/util-uri-escape": "^2.0.0", + "tslib": "^2.5.0" + }, "engines": { - "node": ">=0.10" + "node": ">=14.0.0" } }, - "node_modules/deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==" + "node_modules/@smithy/querystring-builder/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true }, - "node_modules/diagnostic-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/diagnostic-channel/-/diagnostic-channel-1.1.0.tgz", - "integrity": "sha512-fwujyMe1gj6rk6dYi9hMZm0c8Mz8NDMVl2LB4iaYh3+LIAThZC8RKFGXWG0IML2OxAit/ZFRgZhMkhQ3d/bobQ==", + "node_modules/@smithy/querystring-parser": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.5.tgz", + "integrity": "sha512-C2stCULH0r54KBksv3AWcN8CLS3u9+WsEW8nBrvctrJ5rQTNa1waHkffpVaiKvcW2nP0aIMBPCobD/kYf/q9mA==", + "dev": true, + "optional": true, "dependencies": { - "semver": "^5.3.0" + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/diagnostic-channel-publishers": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/diagnostic-channel-publishers/-/diagnostic-channel-publishers-1.0.5.tgz", - "integrity": "sha512-dJwUS0915pkjjimPJVDnS/QQHsH0aOYhnZsLJdnZIMOrB+csj8RnZhWTuwnm8R5v3Z7OZs+ksv5luC14DGB7eg==", - "peerDependencies": { - "diagnostic-channel": "*" - } + "node_modules/@smithy/querystring-parser/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "node_modules/@smithy/service-error-classification": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.0.tgz", + "integrity": "sha512-2z5Nafy1O0cTf69wKyNjGW/sNVMiqDnb4jgwfMG8ye8KnFJ5qmJpDccwIbJNhXIfbsxTg9SEec2oe1cexhMJvw==", "dev": true, + "optional": true, "engines": { - "node": ">=0.3.1" + "node": ">=14.0.0" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "node_modules/@smithy/shared-ini-file-loader": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.0.6.tgz", + "integrity": "sha512-NO6dHqho6APbVR0DxPtYoL4KXBqUeSM3Slsd103MOgL50YbzzsQmMLtDMZ87W8MlvvCN0tuiq+OrAO/rM7hTQg==", "dev": true, + "optional": true, "dependencies": { - "path-type": "^4.0.0" + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" }, "engines": { - "node": ">=8" + "node": ">=14.0.0" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "node_modules/@smithy/shared-ini-file-loader/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } + "optional": true }, - "node_modules/emitter-listener": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.2.tgz", - "integrity": "sha512-Bt1sBAGFHY9DKY+4/2cV6izcKJUf5T7/gkdmkxzX/qv9CcGH8xSwVRW5mtX03SWJtRTWSOpzCuWN9rBFYZepZQ==", + "node_modules/@smithy/signature-v4": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.5.tgz", + "integrity": "sha512-ABIzXmUDXK4n2c9cXjQLELgH2RdtABpYKT+U131e2I6RbCypFZmxIHmIBufJzU2kdMCQ3+thBGDWorAITFW04A==", + "dev": true, + "optional": true, "dependencies": { - "shimmer": "^1.2.0" + "@smithy/eventstream-codec": "^2.0.5", + "@smithy/is-array-buffer": "^2.0.0", + "@smithy/types": "^2.2.2", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-middleware": "^2.0.0", + "@smithy/util-uri-escape": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "node_modules/@smithy/signature-v4/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "node_modules/@smithy/smithy-client": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.0.5.tgz", + "integrity": "sha512-kCTFr8wfOAWKDzGvfBElc6shHigWtHNhMQ1IbosjC4jOlayFyZMSs2PysKB+Ox/dhQ41KqOzgVjgiQ+PyWqHMQ==", "dev": true, + "optional": true, + "dependencies": { + "@smithy/middleware-stack": "^2.0.0", + "@smithy/types": "^2.2.2", + "@smithy/util-stream": "^2.0.5", + "tslib": "^2.5.0" + }, "engines": { - "node": ">=6" + "node": ">=14.0.0" } }, - "node_modules/eslint": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.21.0.tgz", - "integrity": "sha512-/XJ1+Qurf1T9G2M5IHrsjp+xrGT73RZf23xA1z5wB1ZzzEAWSZKvRwhWxTFp1rvkvCfwcvAUNAP31bhKTTGfDA==", + "node_modules/@smithy/smithy-client/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true, + "optional": true + }, + "node_modules/@smithy/types": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.2.2.tgz", + "integrity": "sha512-4PS0y1VxDnELGHGgBWlDksB2LJK8TG8lcvlWxIsgR+8vROI7Ms8h1P4FQUx+ftAX2QZv5g1CJCdhdRmQKyonyw==", + "dev": true, + "optional": true, "dependencies": { - "@eslint/eslintrc": "^1.3.0", - "@humanwhocodes/config-array": "^0.10.4", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.3", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "functional-red-black-tree": "^1.0.1", - "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", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" + "tslib": "^2.5.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=14.0.0" } }, - "node_modules/eslint-config-prettier": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", - "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "node_modules/@smithy/types/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } + "optional": true }, - "node_modules/eslint-plugin-prettier": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", - "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "node_modules/@smithy/url-parser": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.5.tgz", + "integrity": "sha512-OdMBvZhpckQSkugCXNJQCvqJ71wE7Ftxce92UOQLQ9pwF6hoS5PLL7wEfpnuEXtStzBqJYkzu1C1ZfjuFGOXAA==", "dev": true, + "optional": true, "dependencies": { - "prettier-linter-helpers": "^1.0.0" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "eslint": ">=7.28.0", - "prettier": ">=2.0.0" - }, - "peerDependenciesMeta": { - "eslint-config-prettier": { - "optional": true - } + "@smithy/querystring-parser": "^2.0.5", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" } }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "node_modules/@smithy/url-parser/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true, + "optional": true + }, + "node_modules/@smithy/util-base64": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.0.0.tgz", + "integrity": "sha512-Zb1E4xx+m5Lud8bbeYi5FkcMJMnn+1WUnJF3qD7rAdXpaL7UjkFQLdmW5fHadoKbdHpwH9vSR8EyTJFHJs++tA==", + "dev": true, + "optional": true, "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=14.0.0" } }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "node_modules/@smithy/util-base64/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + }, + "node_modules/@smithy/util-body-length-browser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.0.0.tgz", + "integrity": "sha512-JdDuS4ircJt+FDnaQj88TzZY3+njZ6O+D3uakS32f2VNnDo3vyEuNdBOh/oFd8Df1zSZOuH1HEChk2AOYDezZg==", "dev": true, + "optional": true, "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" + "tslib": "^2.5.0" } }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "node_modules/@smithy/util-body-length-browser/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + }, + "node_modules/@smithy/util-body-length-node": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.1.0.tgz", + "integrity": "sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw==", "dev": true, + "optional": true, + "dependencies": { + "tslib": "^2.5.0" + }, "engines": { - "node": ">=10" + "node": ">=14.0.0" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "node_modules/@smithy/util-body-length-node/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } + "optional": true }, - "node_modules/eslint/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "node_modules/@smithy/util-buffer-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.0.0.tgz", + "integrity": "sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==", "dev": true, + "optional": true, "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "@smithy/is-array-buffer": "^2.0.0", + "tslib": "^2.5.0" }, "engines": { - "node": ">= 8" + "node": ">=14.0.0" } }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "node_modules/@smithy/util-buffer-from/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "optional": true }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "node_modules/@smithy/util-config-provider": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.0.0.tgz", + "integrity": "sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg==", "dev": true, + "optional": true, "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "tslib": "^2.5.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=14.0.0" } }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "node_modules/@smithy/util-config-provider/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true, - "engines": { - "node": ">=4.0" - } + "optional": true }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.6.tgz", + "integrity": "sha512-h8xyKTZIIom62DN4xbPUmL+RL1deZcK1qJGmCr4c2yXjOrs5/iZ1VtQQcl+xP78620ga/565AikZE1sktdg2yA==", "dev": true, + "optional": true, "dependencies": { - "is-glob": "^4.0.3" + "@smithy/property-provider": "^2.0.6", + "@smithy/types": "^2.2.2", + "bowser": "^2.11.0", + "tslib": "^2.5.0" }, "engines": { - "node": ">=10.13.0" + "node": ">= 10.0.0" } }, - "node_modules/eslint/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "node_modules/@smithy/util-defaults-mode-browser/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + }, + "node_modules/@smithy/util-defaults-mode-node": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.7.tgz", + "integrity": "sha512-2C1YfmYJj9bpM/cRAgQppYNzPd8gDEXZ5XIVDuEQg3TmmIiinZaFf/HsHYo9NK/PMy5oawJVdIuR7SVriIo1AQ==", "dev": true, + "optional": true, + "dependencies": { + "@smithy/config-resolver": "^2.0.5", + "@smithy/credential-provider-imds": "^2.0.7", + "@smithy/node-config-provider": "^2.0.7", + "@smithy/property-provider": "^2.0.6", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, "engines": { - "node": ">=8" + "node": ">= 10.0.0" } }, - "node_modules/eslint/node_modules/shebang-command": { + "node_modules/@smithy/util-defaults-mode-node/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + }, + "node_modules/@smithy/util-hex-encoding": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz", + "integrity": "sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==", "dev": true, + "optional": true, "dependencies": { - "shebang-regex": "^3.0.0" + "tslib": "^2.5.0" }, "engines": { - "node": ">=8" + "node": ">=14.0.0" } }, - "node_modules/eslint/node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "node_modules/@smithy/util-hex-encoding/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true, - "engines": { - "node": ">=8" - } + "optional": true }, - "node_modules/eslint/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "node_modules/@smithy/util-middleware": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.0.tgz", + "integrity": "sha512-eCWX4ECuDHn1wuyyDdGdUWnT4OGyIzV0LN1xRttBFMPI9Ff/4heSHVxneyiMtOB//zpXWCha1/SWHJOZstG7kA==", "dev": true, + "optional": true, "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" + "tslib": "^2.5.0" }, "engines": { - "node": ">= 8" + "node": ">=14.0.0" } }, - "node_modules/espree": { - "version": "9.3.3", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.3.tgz", - "integrity": "sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==", + "node_modules/@smithy/util-middleware/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + }, + "node_modules/@smithy/util-retry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.0.tgz", + "integrity": "sha512-/dvJ8afrElasuiiIttRJeoS2sy8YXpksQwiM/TcepqdRVp7u4ejd9C4IQURHNjlfPUT7Y6lCDSa2zQJbdHhVTg==", "dev": true, + "optional": true, "dependencies": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "@smithy/service-error-classification": "^2.0.0", + "tslib": "^2.5.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">= 14.0.0" } }, - "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "node_modules/@smithy/util-retry/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + }, + "node_modules/@smithy/util-stream": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.5.tgz", + "integrity": "sha512-ylx27GwI05xLpYQ4hDIfS15vm+wYjNN0Sc2P0FxuzgRe8v0BOLHppGIQ+Bezcynk8C9nUzsUue3TmtRhjut43g==", "dev": true, + "optional": true, "dependencies": { - "estraverse": "^5.1.0" + "@smithy/fetch-http-handler": "^2.0.5", + "@smithy/node-http-handler": "^2.0.5", + "@smithy/types": "^2.2.2", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" }, "engines": { - "node": ">=0.10" + "node": ">=14.0.0" } }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "node_modules/@smithy/util-stream/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true, - "engines": { - "node": ">=4.0" - } + "optional": true }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "node_modules/@smithy/util-uri-escape": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.0.0.tgz", + "integrity": "sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==", "dev": true, + "optional": true, "dependencies": { - "estraverse": "^5.2.0" + "tslib": "^2.5.0" }, "engines": { - "node": ">=4.0" + "node": ">=14.0.0" } }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "node_modules/@smithy/util-uri-escape/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true, - "engines": { - "node": ">=4.0" - } + "optional": true }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "node_modules/@smithy/util-utf8": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.0.tgz", + "integrity": "sha512-rctU1VkziY84n5OXe3bPNpKR001ZCME2JCaBBFgtiM2hfKbHFudc/BkMuPab8hRbLd0j3vbnBTTZ1igBf0wgiQ==", "dev": true, + "optional": true, + "dependencies": { + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" + }, "engines": { - "node": ">=4.0" + "node": ">=14.0.0" } }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "node_modules/@smithy/util-utf8/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true, + "optional": true + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", "engines": { - "node": ">=0.10.0" + "node": ">= 10" } }, - "node_modules/eventemitter3": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", - "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", "dev": true }, - "node_modules/fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "node_modules/@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", "dev": true }, - "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "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==", + "dev": true + }, + "node_modules/@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, + "node_modules/@types/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@types/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-jkZatu4QVbR60mpIzjINmtS1ZF4a/FqdTUTBeQDVOQ2PYyidtwFKr0B5G6ERukKwliq+7mIXvxyppwzG5EgRYg==", "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" + "@types/node": "*" } }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "node_modules/@types/mocha": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", "dev": true }, - "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "node_modules/@types/node": { + "version": "14.14.22", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.22.tgz", + "integrity": "sha512-g+f/qj/cNcqKkc3tFqlXOYjrmZA+jNBiDzbP3kH+B+otKFqAdPgVTGP1IeKRdMml/aE69as5S4FqtxAbl+LaMw==" + }, + "node_modules/@types/node-fetch": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.3.tgz", + "integrity": "sha512-ETTL1mOEdq/sxUtgtOhKjyB2Irra4cjxksvcMUR5Zr4n+PxVhsCD9WS46oPbHL3et9Zde7CNRr+WUNlcHvsX+w==", "dev": true, "dependencies": { - "reusify": "^1.0.4" + "@types/node": "*", + "form-data": "^3.0.0" } }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "node_modules/@types/node-fetch/node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", "dev": true, "dependencies": { - "flat-cache": "^3.0.4" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">= 6" } }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" + }, + "node_modules/@types/tunnel": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@types/tunnel/-/tunnel-0.0.3.tgz", + "integrity": "sha512-sOUTGn6h1SfQ+gbgqC364jLFBw2lnFqkgF3q0WovEHRLMrVD1sd5aufqi/aJObLekJO+Aq5z646U4Oxy6shXMA==", "dev": true, "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" + "@types/node": "*" } }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "node_modules/@types/uuid": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", + "dev": true + }, + "node_modules/@types/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==", + "dev": true + }, + "node_modules/@types/whatwg-url": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", + "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", "dev": true, "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@types/node": "*", + "@types/webidl-conversions": "*" } }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "bin": { - "flat": "cli.js" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "node_modules/@types/yargs": { + "version": "17.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.11.tgz", + "integrity": "sha512-aB4y9UDUXTSMxmM4MH+YnuR0g5Cph3FLQBoWoMB21DSvFVAxRVEHEMx3TLh+zUZYMCQtKiqazz0Q4Rre31f/OA==", "dev": true, "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" + "@types/yargs-parser": "*" } }, - "node_modules/flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", + "node_modules/@types/yargs-parser": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", + "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", "dev": true }, - "node_modules/follow-redirects": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", - "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.33.0.tgz", + "integrity": "sha512-jHvZNSW2WZ31OPJ3enhLrEKvAZNyAFWZ6rx9tUwaessTc4sx9KmgMNhVcqVAl1ETnT5rU5fpXTLmY9YvC1DCNg==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.33.0", + "@typescript-eslint/type-utils": "5.33.0", + "@typescript-eslint/utils": "5.33.0", + "debug": "^4.3.4", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.2.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, "engines": { - "node": ">=4.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { - "debug": { + "typescript": { "optional": true } } }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=10" } }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "node_modules/@typescript-eslint/parser": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.33.0.tgz", + "integrity": "sha512-cgM5cJrWmrDV2KpvlcSkelTBASAs1mgqq+IUGKJvFxWrapHpaRy5EXPQz9YaKF3nZ8KY18ILTiVpUtbIac86/w==", "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.33.0", + "@typescript-eslint/types": "5.33.0", + "@typescript-eslint/typescript-estree": "5.33.0", + "debug": "^4.3.4" + }, "engines": { - "node": "6.* || 8.* || >= 10.*" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.33.0.tgz", + "integrity": "sha512-/Jta8yMNpXYpRDl8EwF/M8It2A9sFJTubDo0ATZefGXmOqlaBffEw0ZbkbQ7TNDK6q55NPHFshGBPAZvZkE8Pw==", "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.33.0", + "@typescript-eslint/visitor-keys": "5.33.0" + }, "engines": { - "node": "*" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "node_modules/@typescript-eslint/type-utils": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.33.0.tgz", + "integrity": "sha512-2zB8uEn7hEH2pBeyk3NpzX1p3lF9dKrEbnXq1F7YkpZ6hlyqb2yZujqgRGqXgRBTHWIUG3NGx/WeZk224UKlIA==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "@typescript-eslint/utils": "5.33.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" }, "engines": { - "node": "*" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/@typescript-eslint/types": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.33.0.tgz", + "integrity": "sha512-nIMt96JngB4MYFYXpZ/3ZNU4GWPNdBbcB5w2rDOCpXOVUkhtNlG2mmm8uXhubhidRZdwMaMBap7Uk8SZMU/ppw==", "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, "engines": { - "node": ">= 6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-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==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.33.0.tgz", + "integrity": "sha512-tqq3MRLlggkJKJUrzM6wltk8NckKyyorCSGMq4eVkyL5sDYzJJcMgZATqmF8fLdsWrW7OjjIZ1m9v81vKcaqwQ==", "dev": true, "dependencies": { - "type-fest": "^0.20.2" + "@typescript-eslint/types": "5.33.0", + "@typescript-eslint/visitor-keys": "5.33.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" }, "engines": { - "node": ">=8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "node_modules/@typescript-eslint/utils": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.33.0.tgz", + "integrity": "sha512-JxOAnXt9oZjXLIiXb5ZIcZXiwVHCkqZgof0O8KPgz7C7y0HS42gi75PdPlqh1Tf109M0fyUw45Ao6JLo7S5AHw==", + "dev": true, "dependencies": { - "function-bind": "^1.1.1" + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.33.0", + "@typescript-eslint/types": "5.33.0", + "@typescript-eslint/typescript-estree": "5.33.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" }, "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.33.0.tgz", + "integrity": "sha512-/XsqCzD4t+Y9p5wd9HZiptuGKBlaZO5showwqODii5C0nZawxWLF+Q6k5wYHBrQv96h6GYKyqqMHCSTqta8Kiw==", "dev": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" + "@typescript-eslint/types": "5.33.0", + "eslint-visitor-keys": "^3.3.0" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dependencies": { - "agent-base": "6", - "debug": "4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "engines": { - "node": ">= 6" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/husky": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.1.tgz", - "integrity": "sha512-xs7/chUH/CKdOCs7Zy0Aev9e/dKOMZf3K1Az1nar3tzlv0jfqnYtu235bstsWTmXOR0EfINrPa97yy4Lz6RiKw==", + "node_modules/@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true + }, + "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==", "dev": true, "bin": { - "husky": "lib/bin.js" + "acorn": "bin/acorn" }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/typicode" + "node": ">=0.4.0" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "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" - } - ] + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } }, - "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "dev": true, "engines": { - "node": ">= 4" + "node": ">=0.4.0" } }, - "node_modules/import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", - "dev": true, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "debug": "4" }, "engines": { - "node": ">=6" + "node": ">= 6.0.0" } }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, - "engines": { - "node": ">=4" + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", "dev": true, "engines": { - "node": ">=0.8.19" + "node": ">=6" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "engines": { + "node": ">=8" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "node_modules/ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", "dev": true, "dependencies": { - "binary-extensions": "^2.0.0" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" }, "engines": { "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", - "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", - "dependencies": { - "has": "^1.0.3" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-electron": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-electron/-/is-electron-2.2.0.tgz", - "integrity": "sha512-SpMppC2XR3YdxSzczXReBjqs2zGscWQpBIKqwXYBFic0ERaxNVgwLCHwOLZeESfdJQjX0RDvrJ1lBXX2ij+G1Q==" - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dev": true, "dependencies": { - "is-extglob": "^2.1.1" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" }, "engines": { - "node": ">=0.10.0" + "node": ">= 8" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, + "node_modules/applicationinsights": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/applicationinsights/-/applicationinsights-2.5.1.tgz", + "integrity": "sha512-FkkvevcsaPnfifZvVTSxZy6njnNKpTaOFZQ55cGlbvVX9Y15vuRFpZUdLTLLyS0vqOeNUa+xk30jzwLjJBTXbQ==", + "dependencies": { + "@azure/core-auth": "^1.4.0", + "@azure/core-rest-pipeline": "^1.10.0", + "@azure/opentelemetry-instrumentation-azure-sdk": "^1.0.0-beta.2", + "@microsoft/applicationinsights-web-snippet": "^1.0.1", + "@opentelemetry/api": "^1.0.4", + "@opentelemetry/core": "^1.0.1", + "@opentelemetry/sdk-trace-base": "^1.0.1", + "@opentelemetry/semantic-conventions": "^1.0.1", + "cls-hooked": "^4.2.2", + "continuation-local-storage": "^3.2.1", + "diagnostic-channel": "1.1.0", + "diagnostic-channel-publishers": "1.0.5" + }, "engines": { - "node": ">=10" + "node": ">=8.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "applicationinsights-native-metrics": "*" + }, + "peerDependenciesMeta": { + "applicationinsights-native-metrics": { + "optional": true + } } }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, + "node_modules/applicationinsights/node_modules/@opentelemetry/core": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.0.1.tgz", + "integrity": "sha512-90nQ2X6b/8X+xjcLDBYKooAcOsIlwLRYm+1VsxcX5cHl6V4CSVmDpBreQSDH/A21SqROzapk6813008SatmPpQ==", "dependencies": { - "argparse": "^2.0.1" + "@opentelemetry/semantic-conventions": "1.0.1" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" } }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { + "node_modules/applicationinsights/node_modules/@opentelemetry/resources": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.0.1.tgz", + "integrity": "sha512-p8DevOaAEepPucUtImR4cZKHOE2L1jgQAtkdZporV+XnxPA/HqCHPEESyUVuo4f5M0NUlL6k5Pba75KwNJlTRg==", "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" + "@opentelemetry/core": "1.0.1", + "@opentelemetry/semantic-conventions": "1.0.1" }, "engines": { - "node": ">= 0.8.0" + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" } }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, + "node_modules/applicationinsights/node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.0.1.tgz", + "integrity": "sha512-JVSAepTpW7dnqfV7XFN0zHj1jXGNd5OcvIGQl76buogqffdgJdgJWQNrOuUJaus56zrOtlzqFH+YtMA9RGEg8w==", "dependencies": { - "p-locate": "^5.0.0" + "@opentelemetry/core": "1.0.1", + "@opentelemetry/resources": "1.0.1", + "@opentelemetry/semantic-conventions": "1.0.1" }, "engines": { - "node": ">=10" + "node": ">=8.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.1.0" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/loupe": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", - "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true, - "dependencies": { - "get-func-name": "^2.0.0" + "engines": { + "node": "*" } }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/async-hook-jl": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/async-hook-jl/-/async-hook-jl-1.7.6.tgz", + "integrity": "sha512-gFaHkFfSxTjvoxDMYqDuGHlcRyUuamF8s+ZTtJdDzqjws4mCt7v0vuV79/E2Wr2/riMQgtG4/yUtXWs1gZ7JMg==", "dependencies": { - "yallist": "^4.0.0" + "stack-chain": "^1.3.7" }, "engines": { - "node": ">=10" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/memory-pager": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", - "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", - "dev": true, - "optional": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" + "node": "^4.7 || >=6.9 || >=7.3" } }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, + "node_modules/async-listener": { + "version": "0.6.10", + "resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.10.tgz", + "integrity": "sha512-gpuo6xOyF4D5DE5WvyqZdPA3NGhiT6Qf07l7DCB0wwDEsLvDIbCr6j9S5aj5Ch96dLace5tXVzWBZkxU/c5ohw==", "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" + "semver": "^5.3.0", + "shimmer": "^1.1.0" }, "engines": { - "node": ">=8.6" + "node": "<=0.11.8 || >0.11.10" } }, - "node_modules/mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", - "engines": { - "node": ">= 0.6" + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "node_modules/axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "dependencies": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" } }, - "node_modules/mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", - "dependencies": { - "mime-db": "1.44.0" - }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "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/before-after-hook": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.2.tgz", + "integrity": "sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ==" + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "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/bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", + "dev": true, + "optional": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/mocha": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.0.0.tgz", - "integrity": "sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA==", + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "dependencies": { - "@ungap/promise-all-settled": "1.1.2", - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" + "fill-range": "^7.0.1" }, "engines": { - "node": ">= 14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" + "node": ">=8" } }, - "node_modules/mocha/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==", + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/bson": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.2.tgz", + "integrity": "sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ==", "dev": true, "dependencies": { - "balanced-match": "^1.0.0" + "buffer": "^5.6.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/mocha/node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, - "engines": { - "node": ">=0.3.1" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "node_modules/mocha/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, - "node_modules/mocha/node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "node_modules/chai": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", + "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", "dev": true, "dependencies": { - "brace-expansion": "^2.0.1" + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" }, "engines": { - "node": ">=10" + "node": ">=4" } }, - "node_modules/mocha/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/mocha/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/mocha/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/mocha/node_modules/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", "dev": true, "engines": { - "node": ">=10" + "node": "*" } }, - "node_modules/module-details-from-path": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", - "integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==" - }, - "node_modules/mongodb": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.8.1.tgz", - "integrity": "sha512-/NyiM3Ox9AwP5zrfT9TXjRKDJbXlLaUDQ9Rg//2lbg8D2A8GXV0VidYYnA/gfdK6uwbnL4FnAflH7FbGw3TS7w==", + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], "dependencies": { - "bson": "^4.6.5", - "denque": "^2.0.1", - "mongodb-connection-string-url": "^2.5.2", - "socks": "^2.6.2" + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" }, "engines": { - "node": ">=12.9.0" + "node": ">= 8.10.0" }, "optionalDependencies": { - "saslprep": "^1.0.3" + "fsevents": "~2.3.2" } }, - "node_modules/mongodb-connection-string-url": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.5.2.tgz", - "integrity": "sha512-tWDyIG8cQlI5k3skB6ywaEA5F9f5OntrKKsT/Lteub2zgwSUlhqEN2inGgBTm8bpYJf8QYBdA/5naz65XDpczA==", + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "dependencies": { - "@types/whatwg-url": "^8.2.1", - "whatwg-url": "^11.0.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, - "node_modules/mongodb-connection-string-url/node_modules/tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", - "dev": true, + "node_modules/cls-hooked": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/cls-hooked/-/cls-hooked-4.2.2.tgz", + "integrity": "sha512-J4Xj5f5wq/4jAvcdgoGsL3G103BtWpZrMo8NEinRltN+xpTZdI+M38pyQqhuFU/P792xkMFvnKSf+Lm81U1bxw==", "dependencies": { - "punycode": "^2.1.1" + "async-hook-jl": "^1.7.6", + "emitter-listener": "^1.0.1", + "semver": "^5.4.1" }, "engines": { - "node": ">=12" - } - }, - "node_modules/mongodb-connection-string-url/node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "engines": { - "node": ">=12" + "node": "^4.7 || >=6.9 || >=7.3 || >=8.2.1" } }, - "node_modules/mongodb-connection-string-url/node_modules/whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=12" + "node": ">=7.0.0" } }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, - "node_modules/nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": ">= 0.8" } }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "node_modules/nock": { - "version": "13.2.9", - "resolved": "https://registry.npmjs.org/nock/-/nock-13.2.9.tgz", - "integrity": "sha512-1+XfJNYF1cjGB+TKMWi29eZ0b82QOvQs2YoLNzbpWGqFMtRQHTa57osqdGj4FrFPgkO4D4AZinzUJR9VvW3QUA==", - "dev": true, + "node_modules/continuation-local-storage": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", + "integrity": "sha512-jx44cconVqkCEEyLSKWwkvUXwO561jXMa3LPjTPsm5QR22PA0/mhe33FT4Xb5y74JDvt/Cq+5lm8S8rskLv9ZA==", "dependencies": { - "debug": "^4.1.0", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.21", - "propagate": "^2.0.0" - }, - "engines": { - "node": ">= 10.13" + "async-listener": "^0.6.0", + "emitter-listener": "^1.1.1" } }, - "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { - "whatwg-url": "^5.0.0" + "ms": "2.1.2" }, "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" + "node": ">=6.0" }, "peerDependenciesMeta": { - "encoding": { + "supports-color": { "optional": true } } }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "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==", "dev": true, "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-detect": "^4.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=0.12" } }, - "node_modules/p-finally": { + "node_modules/deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "node_modules/delayed-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "engines": { - "node": ">=4" + "node": ">=0.4.0" } }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, + "node_modules/deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==" + }, + "node_modules/diagnostic-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/diagnostic-channel/-/diagnostic-channel-1.1.0.tgz", + "integrity": "sha512-fwujyMe1gj6rk6dYi9hMZm0c8Mz8NDMVl2LB4iaYh3+LIAThZC8RKFGXWG0IML2OxAit/ZFRgZhMkhQ3d/bobQ==", "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "semver": "^5.3.0" } }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "node_modules/diagnostic-channel-publishers": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/diagnostic-channel-publishers/-/diagnostic-channel-publishers-1.0.5.tgz", + "integrity": "sha512-dJwUS0915pkjjimPJVDnS/QQHsH0aOYhnZsLJdnZIMOrB+csj8RnZhWTuwnm8R5v3Z7OZs+ksv5luC14DGB7eg==", + "peerDependencies": { + "diagnostic-channel": "*" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.3.1" } }, - "node_modules/p-queue": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", - "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, "dependencies": { - "eventemitter3": "^4.0.4", - "p-timeout": "^3.2.0" + "path-type": "^4.0.0" }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-queue/node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, - "node_modules/p-retry": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.3.0.tgz", - "integrity": "sha512-Pow4yaHpOiJou1QcpGcBJhGHiS4782LdDa6GhU91hlaNh3ExOOupjSJcxPQZYmUSZk3Pl2ARz/LRvW8Qu0+3mQ==", + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, "dependencies": { - "@types/retry": "^0.12.0", - "retry": "^0.12.0" + "esutils": "^2.0.2" }, "engines": { - "node": ">=8" + "node": ">=6.0.0" } }, - "node_modules/p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "node_modules/emitter-listener": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.2.tgz", + "integrity": "sha512-Bt1sBAGFHY9DKY+4/2cV6izcKJUf5T7/gkdmkxzX/qv9CcGH8xSwVRW5mtX03SWJtRTWSOpzCuWN9rBFYZepZQ==", "dependencies": { - "p-finally": "^1.0.0" - }, - "engines": { - "node": ">=8" + "shimmer": "^1.2.0" } }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, "engines": { "node": ">=6" } }, - "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==", + "node_modules/eslint": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.21.0.tgz", + "integrity": "sha512-/XJ1+Qurf1T9G2M5IHrsjp+xrGT73RZf23xA1z5wB1ZzzEAWSZKvRwhWxTFp1rvkvCfwcvAUNAP31bhKTTGfDA==", "dev": true, + "dependencies": { + "@eslint/eslintrc": "^1.3.0", + "@humanwhocodes/config-array": "^0.10.4", + "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.3", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "functional-red-black-tree": "^1.0.1", + "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", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, "engines": { - "node": ">=8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "node_modules/eslint-config-prettier": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", + "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", "dev": true, - "engines": { - "node": ">=0.10.0" + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "node_modules/eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, "engines": { - "node": ">=8" + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } } }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, "engines": { - "node": "*" + "node": ">=8.0.0" } }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, "engines": { - "node": ">=8.6" + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" } }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true, "engines": { - "node": ">= 0.8.0" + "node": ">=10" } }, - "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==", + "node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "dev": true, - "bin": { - "prettier": "bin-prettier.js" + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">=10.13.0" + "node": ">= 8" + } + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", "dev": true, "dependencies": { - "fast-diff": "^1.1.2" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": ">=6.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "engines": { - "node": ">= 0.6.0" + "node": ">=4.0" } }, - "node_modules/propagate": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz", - "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==", + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, "engines": { - "node": ">= 8" + "node": ">=10.13.0" } }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "node_modules/eslint/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "node_modules/eslint/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "node_modules/eslint/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" + "engines": { + "node": ">=8" } }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "node_modules/eslint/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "dependencies": { - "picomatch": "^2.2.1" + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" }, "engines": { - "node": ">=8.10.0" + "node": ">= 8" } }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "node_modules/espree": { + "version": "9.3.3", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.3.tgz", + "integrity": "sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==", "dev": true, + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + }, "engines": { - "node": ">=8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" + "url": "https://opencollective.com/eslint" } }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=0.10" } }, - "node_modules/require-in-the-middle": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-5.2.0.tgz", - "integrity": "sha512-efCx3b+0Z69/LGJmm9Yvi4cqEdxnoGnxYxGxBghkkTTFeXRtTCmmhO0AnAfHz59k957uTSuy8WaHqOs8wbYUWg==", - "dependencies": { - "debug": "^4.1.1", - "module-details-from-path": "^1.0.3", - "resolve": "^1.22.1" - }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, "engines": { - "node": ">=6" + "node": ">=4.0" } }, - "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, "dependencies": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" + "estraverse": "^5.2.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=4.0" } }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, "engines": { - "node": ">= 4" + "node": ">=4.0" } }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, "engines": { - "iojs": ">=1.0.0", "node": ">=0.10.0" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "node_modules/eventemitter3": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">=0.8.x" } }, - "node_modules/run-parallel": { + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-diff": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "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" - } - ], "dependencies": { - "queue-microtask": "^1.2.2" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "node_modules/fast-xml-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", + "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==", "dev": true, "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" }, { - "type": "consulting", - "url": "https://feross.org/support" + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" } - ] - }, - "node_modules/saslprep": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", - "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", - "dev": true, + ], "optional": true, "dependencies": { - "sparse-bitfield": "^3.0.3" + "strnum": "^1.0.5" }, - "engines": { - "node": ">=6" - } - }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "bin": { - "semver": "bin/semver" + "fxparser": "src/cli/cli.js" } }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", "dev": true, "dependencies": { - "randombytes": "^2.1.0" + "reusify": "^1.0.4" } }, - "node_modules/shimmer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", - "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, "engines": { "node": ">=8" } }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/socks": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", - "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, "dependencies": { - "ip": "^1.1.5", - "smart-buffer": "^4.2.0" + "flatted": "^3.1.0", + "rimraf": "^3.0.2" }, "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/sparse-bitfield": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", + "node_modules/flatted": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", + "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, + "hasInstallScript": true, "optional": true, - "dependencies": { - "memory-pager": "^1.0.2" + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/stack-chain": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/stack-chain/-/stack-chain-1.3.7.tgz", - "integrity": "sha1-0ZLJ/06moiyUxN1FkXHj8AzqEoU=" + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=8" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "dependencies": { - "ansi-regex": "^5.0.1" + "is-glob": "^4.0.1" }, "engines": { - "node": ">=8" + "node": ">= 6" } }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "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==", "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, "engines": { "node": ">=8" }, @@ -3676,337 +4041,344 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", "dev": true }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dependencies": { - "is-number": "^7.0.0" + "function-bind": "^1.1.1" }, "engines": { - "node": ">=8.0" + "node": ">= 0.4.0" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" - }, - "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" } }, - "node_modules/tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "dependencies": { - "tslib": "^1.8.1" + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" }, "engines": { "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" } }, - "node_modules/tunnel": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", - "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, "engines": { - "node": ">=0.6.11 <=0.7.0 || >=0.7.3" + "node": ">= 6" } }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "node_modules/husky": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.1.tgz", + "integrity": "sha512-xs7/chUH/CKdOCs7Zy0Aev9e/dKOMZf3K1Az1nar3tzlv0jfqnYtu235bstsWTmXOR0EfINrPa97yy4Lz6RiKw==", "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" + "bin": { + "husky": "lib/bin.js" }, "engines": { - "node": ">= 0.8.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" } }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "dev": true, - "engines": { - "node": ">=4" - } + "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/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/ignore": { + "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": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 4" } }, - "node_modules/typescript": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", - "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "node_modules/import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { - "node": ">=4.2.0" + "node": ">=6" } }, - "node_modules/universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==" + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true, - "dependencies": { - "punycode": "^2.1.0" + "engines": { + "node": ">=0.8.19" } }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" } }, - "node_modules/v8-compile-cache": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", - "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", "dev": true }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "node_modules/is-core-module": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", + "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/word-wrap": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", - "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", + "node_modules/is-electron": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-electron/-/is-electron-2.2.0.tgz", + "integrity": "sha512-SpMppC2XR3YdxSzczXReBjqs2zGscWQpBIKqwXYBFic0ERaxNVgwLCHwOLZeESfdJQjX0RDvrJ1lBXX2ij+G1Q==" + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", - "dev": true - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=8" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "node_modules/xml2js": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", - "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" + "is-extglob": "^2.1.1" }, "engines": { - "node": ">=4.0.0" + "node": ">=0.10.0" } }, - "node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, "engines": { - "node": ">=4.0" + "node": ">=0.12.0" } }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "dev": true, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/yargs": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" - }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "engines": { - "node": ">=12" + "node": ">=0.10.0" } }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true, "engines": { - "node": ">=12" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/yargs-unparser": { + "node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" }, "engines": { - "node": ">=10" + "node": ">= 0.8.0" } }, - "node_modules/yargs-unparser/node_modules/camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, "engines": { "node": ">=10" }, @@ -4014,11 +4386,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/yargs-unparser/node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, "engines": { "node": ">=10" }, @@ -4026,722 +4414,3488 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "node_modules/loupe": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", + "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", "dev": true, + "dependencies": { + "get-func-name": "^2.0.0" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { - "node": ">=6" + "node": ">=10" } }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "dev": true, + "optional": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 8" } - } - }, - "dependencies": { - "@actions/core": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.9.1.tgz", - "integrity": "sha512-5ad+U2YGrmmiw6du20AQW5XuWo7UKN2052FjSV7MX+Wfjf8sCqcsZe62NfgHys4QI4/Y+vQvLKYL8jWtA1ZBTA==", - "requires": { - "@actions/http-client": "^2.0.1", - "uuid": "^8.3.2" + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" } }, - "@actions/github": { - "version": "5.0.3", + "node_modules/mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "dependencies": { + "mime-db": "1.44.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "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, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mocha": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.0.0.tgz", + "integrity": "sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA==", + "dev": true, + "dependencies": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/mocha/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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/mocha/node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/mocha/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/mocha/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/module-details-from-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", + "integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==" + }, + "node_modules/mongodb": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.17.0.tgz", + "integrity": "sha512-LZGMIPjPfWEfhPJATk1s9IvVTD18tyfKdT/0blCMih5vGagk2SwA9wFAUPMdtJpTrhXmyfGgwAaMkvneX2bn2A==", + "dev": true, + "dependencies": { + "bson": "^4.7.2", + "mongodb-connection-string-url": "^2.6.0", + "socks": "^2.7.1" + }, + "engines": { + "node": ">=12.9.0" + }, + "optionalDependencies": { + "@aws-sdk/credential-providers": "^3.186.0", + "@mongodb-js/saslprep": "^1.1.0" + } + }, + "node_modules/mongodb-connection-string-url": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz", + "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==", + "dev": true, + "dependencies": { + "@types/whatwg-url": "^8.2.1", + "whatwg-url": "^11.0.0" + } + }, + "node_modules/mongodb-connection-string-url/node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/mongodb-connection-string-url/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/mongodb-connection-string-url/node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dev": true, + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/nanoid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node_modules/nock": { + "version": "13.2.9", + "resolved": "https://registry.npmjs.org/nock/-/nock-13.2.9.tgz", + "integrity": "sha512-1+XfJNYF1cjGB+TKMWi29eZ0b82QOvQs2YoLNzbpWGqFMtRQHTa57osqdGj4FrFPgkO4D4AZinzUJR9VvW3QUA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.21", + "propagate": "^2.0.0" + }, + "engines": { + "node": ">= 10.13" + } + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue/node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "node_modules/p-retry": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.3.0.tgz", + "integrity": "sha512-Pow4yaHpOiJou1QcpGcBJhGHiS4782LdDa6GhU91hlaNh3ExOOupjSJcxPQZYmUSZk3Pl2ARz/LRvW8Qu0+3mQ==", + "dependencies": { + "@types/retry": "^0.12.0", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "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==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/propagate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz", + "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "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/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-in-the-middle": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-5.2.0.tgz", + "integrity": "sha512-efCx3b+0Z69/LGJmm9Yvi4cqEdxnoGnxYxGxBghkkTTFeXRtTCmmhO0AnAfHz59k957uTSuy8WaHqOs8wbYUWg==", + "dependencies": { + "debug": "^4.1.1", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "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" + } + ] + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/shimmer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", + "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "dev": true, + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "dev": true, + "optional": true, + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "node_modules/stack-chain": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/stack-chain/-/stack-chain-1.3.7.tgz", + "integrity": "sha1-0ZLJ/06moiyUxN1FkXHj8AzqEoU=" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "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", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", + "dev": true, + "optional": true + }, + "node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "engines": { + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/universal-user-agent": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", + "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==" + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", + "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", + "dev": true + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/word-wrap": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", + "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workerpool": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/xml2js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "dev": true, + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", + "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser/node_modules/camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs-unparser/node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, + "dependencies": { + "@actions/core": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.9.1.tgz", + "integrity": "sha512-5ad+U2YGrmmiw6du20AQW5XuWo7UKN2052FjSV7MX+Wfjf8sCqcsZe62NfgHys4QI4/Y+vQvLKYL8jWtA1ZBTA==", + "requires": { + "@actions/http-client": "^2.0.1", + "uuid": "^8.3.2" + } + }, + "@actions/github": { + "version": "5.0.3", "resolved": "https://registry.npmjs.org/@actions/github/-/github-5.0.3.tgz", "integrity": "sha512-myjA/pdLQfhUGLtRZC/J4L1RXOG4o6aYdiEq+zr5wVVKljzbFld+xv10k1FX6IkIJtNxbAq44BdwSNpQ015P0A==", "requires": { - "@actions/http-client": "^2.0.1", - "@octokit/core": "^3.6.0", - "@octokit/plugin-paginate-rest": "^2.17.0", - "@octokit/plugin-rest-endpoint-methods": "^5.13.0" + "@actions/http-client": "^2.0.1", + "@octokit/core": "^3.6.0", + "@octokit/plugin-paginate-rest": "^2.17.0", + "@octokit/plugin-rest-endpoint-methods": "^5.13.0" + }, + "dependencies": { + "@octokit/auth-token": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz", + "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==", + "requires": { + "@octokit/types": "^6.0.3" + } + }, + "@octokit/core": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz", + "integrity": "sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==", + "requires": { + "@octokit/auth-token": "^2.4.4", + "@octokit/graphql": "^4.5.8", + "@octokit/request": "^5.6.3", + "@octokit/request-error": "^2.0.5", + "@octokit/types": "^6.0.3", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/graphql": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz", + "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==", + "requires": { + "@octokit/request": "^5.6.0", + "@octokit/types": "^6.0.3", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/plugin-paginate-rest": { + "version": "2.21.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz", + "integrity": "sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==", + "requires": { + "@octokit/types": "^6.40.0" + } + }, + "@octokit/plugin-rest-endpoint-methods": { + "version": "5.16.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.2.tgz", + "integrity": "sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==", + "requires": { + "@octokit/types": "^6.39.0", + "deprecation": "^2.3.1" + } + } + } + }, + "@actions/http-client": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.0.1.tgz", + "integrity": "sha512-PIXiMVtz6VvyaRsGY268qvj57hXQEpsYogYOu2nrQhlf+XCGmZstmuZBbAybUl1nQGnvS1k1eEsQ69ZoD7xlSw==", + "requires": { + "tunnel": "^0.0.6" + } + }, + "@aws-crypto/crc32": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", + "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", + "dev": true, + "optional": true, + "requires": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "@aws-crypto/ie11-detection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", + "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^1.11.1" + } + }, + "@aws-crypto/sha256-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", + "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", + "dev": true, + "optional": true, + "requires": { + "@aws-crypto/ie11-detection": "^3.0.0", + "@aws-crypto/sha256-js": "^3.0.0", + "@aws-crypto/supports-web-crypto": "^3.0.0", + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "@aws-crypto/sha256-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", + "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", + "dev": true, + "optional": true, + "requires": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "@aws-crypto/supports-web-crypto": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", + "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^1.11.1" + } + }, + "@aws-crypto/util": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", + "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", + "dev": true, + "optional": true, + "requires": { + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "@aws-sdk/client-cognito-identity": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.405.0.tgz", + "integrity": "sha512-kvmNAREFQbhaZoEMQzBOYTaN7cFIOLgk2DZYYlHh2ErUYXSbvbVOBUriMRW9hRDtKLooe3ZFBLO3sWKvQE/AfA==", + "dev": true, + "optional": true, + "requires": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.405.0", + "@aws-sdk/credential-provider-node": "3.405.0", + "@aws-sdk/middleware-host-header": "3.398.0", + "@aws-sdk/middleware-logger": "3.398.0", + "@aws-sdk/middleware-recursion-detection": "3.398.0", + "@aws-sdk/middleware-signing": "3.398.0", + "@aws-sdk/middleware-user-agent": "3.398.0", + "@aws-sdk/types": "3.398.0", + "@aws-sdk/util-endpoints": "3.398.0", + "@aws-sdk/util-user-agent-browser": "3.398.0", + "@aws-sdk/util-user-agent-node": "3.405.0", + "@smithy/config-resolver": "^2.0.5", + "@smithy/fetch-http-handler": "^2.0.5", + "@smithy/hash-node": "^2.0.5", + "@smithy/invalid-dependency": "^2.0.5", + "@smithy/middleware-content-length": "^2.0.5", + "@smithy/middleware-endpoint": "^2.0.5", + "@smithy/middleware-retry": "^2.0.5", + "@smithy/middleware-serde": "^2.0.5", + "@smithy/middleware-stack": "^2.0.0", + "@smithy/node-config-provider": "^2.0.6", + "@smithy/node-http-handler": "^2.0.5", + "@smithy/protocol-http": "^2.0.5", + "@smithy/smithy-client": "^2.0.5", + "@smithy/types": "^2.2.2", + "@smithy/url-parser": "^2.0.5", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.6", + "@smithy/util-defaults-mode-node": "^2.0.6", + "@smithy/util-retry": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + } + } + }, + "@aws-sdk/client-sso": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.405.0.tgz", + "integrity": "sha512-z1ssydU07bDhe0tNXQwVO+rWh/iSfK48JI8s8vgpBNwH+NejMzIJ9r3AkjCiJ+LSAwlBZItUsNWwR0veIfgBiw==", + "dev": true, + "optional": true, + "requires": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/middleware-host-header": "3.398.0", + "@aws-sdk/middleware-logger": "3.398.0", + "@aws-sdk/middleware-recursion-detection": "3.398.0", + "@aws-sdk/middleware-user-agent": "3.398.0", + "@aws-sdk/types": "3.398.0", + "@aws-sdk/util-endpoints": "3.398.0", + "@aws-sdk/util-user-agent-browser": "3.398.0", + "@aws-sdk/util-user-agent-node": "3.405.0", + "@smithy/config-resolver": "^2.0.5", + "@smithy/fetch-http-handler": "^2.0.5", + "@smithy/hash-node": "^2.0.5", + "@smithy/invalid-dependency": "^2.0.5", + "@smithy/middleware-content-length": "^2.0.5", + "@smithy/middleware-endpoint": "^2.0.5", + "@smithy/middleware-retry": "^2.0.5", + "@smithy/middleware-serde": "^2.0.5", + "@smithy/middleware-stack": "^2.0.0", + "@smithy/node-config-provider": "^2.0.6", + "@smithy/node-http-handler": "^2.0.5", + "@smithy/protocol-http": "^2.0.5", + "@smithy/smithy-client": "^2.0.5", + "@smithy/types": "^2.2.2", + "@smithy/url-parser": "^2.0.5", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.6", + "@smithy/util-defaults-mode-node": "^2.0.6", + "@smithy/util-retry": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + } + } + }, + "@aws-sdk/client-sts": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.405.0.tgz", + "integrity": "sha512-asVEpda3zu5QUO5ZNNjbLBS0718IhxxyUDVrNmVTKZoOhK1pMNouGZf+l49v0Lb5cOPbUds8cxsNaInj2MvIKw==", + "dev": true, + "optional": true, + "requires": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/credential-provider-node": "3.405.0", + "@aws-sdk/middleware-host-header": "3.398.0", + "@aws-sdk/middleware-logger": "3.398.0", + "@aws-sdk/middleware-recursion-detection": "3.398.0", + "@aws-sdk/middleware-sdk-sts": "3.398.0", + "@aws-sdk/middleware-signing": "3.398.0", + "@aws-sdk/middleware-user-agent": "3.398.0", + "@aws-sdk/types": "3.398.0", + "@aws-sdk/util-endpoints": "3.398.0", + "@aws-sdk/util-user-agent-browser": "3.398.0", + "@aws-sdk/util-user-agent-node": "3.405.0", + "@smithy/config-resolver": "^2.0.5", + "@smithy/fetch-http-handler": "^2.0.5", + "@smithy/hash-node": "^2.0.5", + "@smithy/invalid-dependency": "^2.0.5", + "@smithy/middleware-content-length": "^2.0.5", + "@smithy/middleware-endpoint": "^2.0.5", + "@smithy/middleware-retry": "^2.0.5", + "@smithy/middleware-serde": "^2.0.5", + "@smithy/middleware-stack": "^2.0.0", + "@smithy/node-config-provider": "^2.0.6", + "@smithy/node-http-handler": "^2.0.5", + "@smithy/protocol-http": "^2.0.5", + "@smithy/smithy-client": "^2.0.5", + "@smithy/types": "^2.2.2", + "@smithy/url-parser": "^2.0.5", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.6", + "@smithy/util-defaults-mode-node": "^2.0.6", + "@smithy/util-retry": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "fast-xml-parser": "4.2.5", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + } + } + }, + "@aws-sdk/credential-provider-cognito-identity": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.405.0.tgz", + "integrity": "sha512-tmu8r0kB3qHHIitQAwiziWzxoaGCv/vCh00EcabuW3x3UsKQUF71ZLuNcMOv5wqTsQw0Fmv3dKy2tzVmRm3Z5g==", + "dev": true, + "optional": true, + "requires": { + "@aws-sdk/client-cognito-identity": "3.405.0", + "@aws-sdk/types": "3.398.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + } + } + }, + "@aws-sdk/credential-provider-env": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.398.0.tgz", + "integrity": "sha512-Z8Yj5z7FroAsR6UVML+XUdlpoqEe9Dnle8c2h8/xWwIC2feTfIBhjLhRVxfbpbM1pLgBSNEcZ7U8fwq5l7ESVQ==", + "dev": true, + "optional": true, + "requires": { + "@aws-sdk/types": "3.398.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + } + } + }, + "@aws-sdk/credential-provider-ini": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.405.0.tgz", + "integrity": "sha512-b4TqVsM4WQM96GDVs+TYOhU2/0SnUWzz6NH55qY1y2xyF8/pZEhc0XXdpvZtQQBLGdROhXCbxhBVye8GmTpgcg==", + "dev": true, + "optional": true, + "requires": { + "@aws-sdk/credential-provider-env": "3.398.0", + "@aws-sdk/credential-provider-process": "3.405.0", + "@aws-sdk/credential-provider-sso": "3.405.0", + "@aws-sdk/credential-provider-web-identity": "3.398.0", + "@aws-sdk/types": "3.398.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + } + } + }, + "@aws-sdk/credential-provider-node": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.405.0.tgz", + "integrity": "sha512-AMmRP09nwYsft0MXDlHIxMQe7IloWW8As0lbZmPrG7Y7mK5RDmCIwD2yMDz77Zqlv09FsYt+9+cOK2fTNhim+Q==", + "dev": true, + "optional": true, + "requires": { + "@aws-sdk/credential-provider-env": "3.398.0", + "@aws-sdk/credential-provider-ini": "3.405.0", + "@aws-sdk/credential-provider-process": "3.405.0", + "@aws-sdk/credential-provider-sso": "3.405.0", + "@aws-sdk/credential-provider-web-identity": "3.398.0", + "@aws-sdk/types": "3.398.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + } + } + }, + "@aws-sdk/credential-provider-process": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.405.0.tgz", + "integrity": "sha512-EqAMcUVeZAICYHHL8x5Fi5CYPgCo9UCE7ScWmU5Sa2wAFY4XLyQ1mMxX3lKGYx9lBxWk3dqnhmvlcqdzN7AjyQ==", + "dev": true, + "optional": true, + "requires": { + "@aws-sdk/types": "3.398.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + } + } + }, + "@aws-sdk/credential-provider-sso": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.405.0.tgz", + "integrity": "sha512-fXqSgQHz7qcmIWMVguwSMSjqFkVfN2+XiNgiskcmeYiCS7mIGAgUnKABZc9Ds2+YW9ATYiY0BOD5aWxc8TX5fA==", + "dev": true, + "optional": true, + "requires": { + "@aws-sdk/client-sso": "3.405.0", + "@aws-sdk/token-providers": "3.405.0", + "@aws-sdk/types": "3.398.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + } + } + }, + "@aws-sdk/credential-provider-web-identity": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.398.0.tgz", + "integrity": "sha512-iG3905Alv9pINbQ8/MIsshgqYMbWx+NDQWpxbIW3W0MkSH3iAqdVpSCteYidYX9G/jv2Um1nW3y360ib20bvNg==", + "dev": true, + "optional": true, + "requires": { + "@aws-sdk/types": "3.398.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + } + } + }, + "@aws-sdk/credential-providers": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.405.0.tgz", + "integrity": "sha512-332QZ2Wrr5gfFUGPLwITcjhxnBD4y94fxKg7qerSBq7fjjIkl/OjnchZf5ReePrjpglxs6hgLdGrPYIYPC4Hhw==", + "dev": true, + "optional": true, + "requires": { + "@aws-sdk/client-cognito-identity": "3.405.0", + "@aws-sdk/client-sso": "3.405.0", + "@aws-sdk/client-sts": "3.405.0", + "@aws-sdk/credential-provider-cognito-identity": "3.405.0", + "@aws-sdk/credential-provider-env": "3.398.0", + "@aws-sdk/credential-provider-ini": "3.405.0", + "@aws-sdk/credential-provider-node": "3.405.0", + "@aws-sdk/credential-provider-process": "3.405.0", + "@aws-sdk/credential-provider-sso": "3.405.0", + "@aws-sdk/credential-provider-web-identity": "3.398.0", + "@aws-sdk/types": "3.398.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + } + } + }, + "@aws-sdk/middleware-host-header": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.398.0.tgz", + "integrity": "sha512-m+5laWdBaxIZK2ko0OwcCHJZJ5V1MgEIt8QVQ3k4/kOkN9ICjevOYmba751pHoTnbOYB7zQd6D2OT3EYEEsUcA==", + "dev": true, + "optional": true, + "requires": { + "@aws-sdk/types": "3.398.0", + "@smithy/protocol-http": "^2.0.5", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + } + } + }, + "@aws-sdk/middleware-logger": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.398.0.tgz", + "integrity": "sha512-CiJjW+FL12elS6Pn7/UVjVK8HWHhXMfvHZvOwx/Qkpy340sIhkuzOO6fZEruECDTZhl2Wqn81XdJ1ZQ4pRKpCg==", + "dev": true, + "optional": true, + "requires": { + "@aws-sdk/types": "3.398.0", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + } + } + }, + "@aws-sdk/middleware-recursion-detection": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.398.0.tgz", + "integrity": "sha512-7QpOqPQAZNXDXv6vsRex4R8dLniL0E/80OPK4PPFsrCh9btEyhN9Begh4i1T+5lL28hmYkztLOkTQ2N5J3hgRQ==", + "dev": true, + "optional": true, + "requires": { + "@aws-sdk/types": "3.398.0", + "@smithy/protocol-http": "^2.0.5", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + } + } + }, + "@aws-sdk/middleware-sdk-sts": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.398.0.tgz", + "integrity": "sha512-+JH76XHEgfVihkY+GurohOQ5Z83zVN1nYcQzwCFnCDTh4dG4KwhnZKG+WPw6XJECocY0R+H0ivofeALHvVWJtQ==", + "dev": true, + "optional": true, + "requires": { + "@aws-sdk/middleware-signing": "3.398.0", + "@aws-sdk/types": "3.398.0", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + } + } + }, + "@aws-sdk/middleware-signing": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.398.0.tgz", + "integrity": "sha512-O0KqXAix1TcvZBFt1qoFkHMUNJOSgjJTYS7lFTRKSwgsD27bdW2TM2r9R8DAccWFt5Amjkdt+eOwQMIXPGTm8w==", + "dev": true, + "optional": true, + "requires": { + "@aws-sdk/types": "3.398.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/protocol-http": "^2.0.5", + "@smithy/signature-v4": "^2.0.0", + "@smithy/types": "^2.2.2", + "@smithy/util-middleware": "^2.0.0", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + } + } + }, + "@aws-sdk/middleware-user-agent": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.398.0.tgz", + "integrity": "sha512-nF1jg0L+18b5HvTcYzwyFgfZQQMELJINFqI0mi4yRKaX7T5a3aGp5RVLGGju/6tAGTuFbfBoEhkhU3kkxexPYQ==", + "dev": true, + "optional": true, + "requires": { + "@aws-sdk/types": "3.398.0", + "@aws-sdk/util-endpoints": "3.398.0", + "@smithy/protocol-http": "^2.0.5", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + } + } + }, + "@aws-sdk/token-providers": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.405.0.tgz", + "integrity": "sha512-rVzC7ptf7TlV84M9w+Ds9isio1EY7bs1MRFv/6lmYstsyTri+DaZG10TwXSGfzIMwB0yVh11niCxO9wSjQ36zg==", + "dev": true, + "optional": true, + "requires": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/middleware-host-header": "3.398.0", + "@aws-sdk/middleware-logger": "3.398.0", + "@aws-sdk/middleware-recursion-detection": "3.398.0", + "@aws-sdk/middleware-user-agent": "3.398.0", + "@aws-sdk/types": "3.398.0", + "@aws-sdk/util-endpoints": "3.398.0", + "@aws-sdk/util-user-agent-browser": "3.398.0", + "@aws-sdk/util-user-agent-node": "3.405.0", + "@smithy/config-resolver": "^2.0.5", + "@smithy/fetch-http-handler": "^2.0.5", + "@smithy/hash-node": "^2.0.5", + "@smithy/invalid-dependency": "^2.0.5", + "@smithy/middleware-content-length": "^2.0.5", + "@smithy/middleware-endpoint": "^2.0.5", + "@smithy/middleware-retry": "^2.0.5", + "@smithy/middleware-serde": "^2.0.5", + "@smithy/middleware-stack": "^2.0.0", + "@smithy/node-config-provider": "^2.0.6", + "@smithy/node-http-handler": "^2.0.5", + "@smithy/property-provider": "^2.0.0", + "@smithy/protocol-http": "^2.0.5", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/smithy-client": "^2.0.5", + "@smithy/types": "^2.2.2", + "@smithy/url-parser": "^2.0.5", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.6", + "@smithy/util-defaults-mode-node": "^2.0.6", + "@smithy/util-retry": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + } + } + }, + "@aws-sdk/types": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.398.0.tgz", + "integrity": "sha512-r44fkS+vsEgKCuEuTV+TIk0t0m5ZlXHNjSDYEUvzLStbbfUFiNus/YG4UCa0wOk9R7VuQI67badsvvPeVPCGDQ==", + "dev": true, + "optional": true, + "requires": { + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + } + } + }, + "@aws-sdk/util-endpoints": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.398.0.tgz", + "integrity": "sha512-Fy0gLYAei/Rd6BrXG4baspCnWTUSd0NdokU1pZh4KlfEAEN1i8SPPgfiO5hLk7+2inqtCmqxVJlfqbMVe9k4bw==", + "dev": true, + "optional": true, + "requires": { + "@aws-sdk/types": "3.398.0", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + } + } + }, + "@aws-sdk/util-locate-window": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.310.0.tgz", + "integrity": "sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + } + } + }, + "@aws-sdk/util-user-agent-browser": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.398.0.tgz", + "integrity": "sha512-A3Tzx1tkDHlBT+IgxmsMCHbV8LM7SwwCozq2ZjJRx0nqw3MCrrcxQFXldHeX/gdUMO+0Oocb7HGSnVODTq+0EA==", + "dev": true, + "optional": true, + "requires": { + "@aws-sdk/types": "3.398.0", + "@smithy/types": "^2.2.2", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + } + } + }, + "@aws-sdk/util-user-agent-node": { + "version": "3.405.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.405.0.tgz", + "integrity": "sha512-6Ssld7aalKCnW6lSGfiiWpqwo2L+AmYq2oV3P9yYAo9ZL+Q78dXquabwj3uq3plJ4l2xE4Gfcf2FJ/1PZpqDvQ==", + "dev": true, + "optional": true, + "requires": { + "@aws-sdk/types": "3.398.0", + "@smithy/node-config-provider": "^2.0.6", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + } + } + }, + "@aws-sdk/util-utf8-browser": { + "version": "3.259.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", + "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + } + } + }, + "@azure/abort-controller": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.0.1.tgz", + "integrity": "sha512-wP2Jw6uPp8DEDy0n4KNidvwzDjyVV2xnycEIq7nPzj1rHyb/r+t3OPeNT1INZePP2wy5ZqlwyuyOMTi0ePyY1A==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@azure/core-asynciterator-polyfill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@azure/core-asynciterator-polyfill/-/core-asynciterator-polyfill-1.0.0.tgz", + "integrity": "sha512-kmv8CGrPfN9SwMwrkiBK9VTQYxdFQEGe0BmQk+M8io56P9KNzpAxcWE/1fxJj7uouwN4kXF0BHW8DNlgx+wtCg==", + "dev": true + }, + "@azure/core-auth": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.4.0.tgz", + "integrity": "sha512-HFrcTgmuSuukRf/EdPmqBrc5l6Q5Uu+2TbuhaKbgaCpP2TfAeiNaQPAadxO+CYBRHGUzIDteMAjFspFLDLnKVQ==", + "requires": { + "@azure/abort-controller": "^1.0.0", + "tslib": "^2.2.0" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + } + } + }, + "@azure/core-http": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@azure/core-http/-/core-http-3.0.1.tgz", + "integrity": "sha512-A3x+um3cAPgQe42Lu7Iv/x8/fNjhL/nIoEfqFxfn30EyxK6zC13n+OUxzZBRC0IzQqssqIbt4INf5YG7lYYFtw==", + "dev": true, + "requires": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-auth": "^1.3.0", + "@azure/core-tracing": "1.0.0-preview.13", + "@azure/core-util": "^1.1.1", + "@azure/logger": "^1.0.0", + "@types/node-fetch": "^2.5.0", + "@types/tunnel": "^0.0.3", + "form-data": "^4.0.0", + "node-fetch": "^2.6.7", + "process": "^0.11.10", + "tslib": "^2.2.0", + "tunnel": "^0.0.6", + "uuid": "^8.3.0", + "xml2js": "^0.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + } + } + }, + "@azure/core-lro": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-2.2.4.tgz", + "integrity": "sha512-e1I2v2CZM0mQo8+RSix0x091Av493e4bnT22ds2fcQGslTHzM2oTbswkB65nP4iEpCxBrFxOSDPKExmTmjCVtQ==", + "dev": true, + "requires": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-tracing": "1.0.0-preview.13", + "@azure/logger": "^1.0.0", + "tslib": "^2.2.0" + }, + "dependencies": { + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "dev": true + } + } + }, + "@azure/core-paging": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.1.1.tgz", + "integrity": "sha512-hqEJBEGKan4YdOaL9ZG/GRG6PXaFd/Wb3SSjQW4LWotZzgl6xqG00h6wmkrpd2NNkbBkD1erLHBO3lPHApv+iQ==", + "dev": true, + "requires": { + "@azure/core-asynciterator-polyfill": "^1.0.0" + } + }, + "@azure/core-rest-pipeline": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.10.3.tgz", + "integrity": "sha512-AMQb0ttiGJ0MIV/r+4TVra6U4+90mPeOveehFnrqKlo7dknPJYdJ61wOzYJXJjDxF8LcCtSogfRelkq+fCGFTw==", + "requires": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-auth": "^1.4.0", + "@azure/core-tracing": "^1.0.1", + "@azure/core-util": "^1.3.0", + "@azure/logger": "^1.0.0", + "form-data": "^4.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "tslib": "^2.2.0" + }, + "dependencies": { + "@azure/core-tracing": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.1.tgz", + "integrity": "sha512-I5CGMoLtX+pI17ZdiFJZgxMJApsK6jjfm85hpgp3oazCdq5Wxgh4wMr7ge/TTWW1B5WBuvIOI1fMU/FrOAMKrw==", + "requires": { + "tslib": "^2.2.0" + } + }, + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + } + } + }, + "@azure/core-tracing": { + "version": "1.0.0-preview.13", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.0-preview.13.tgz", + "integrity": "sha512-KxDlhXyMlh2Jhj2ykX6vNEU0Vou4nHr025KoSEiz7cS3BNiHNaZcdECk/DmLkEB0as5T7b/TpRcehJ5yV6NeXQ==", + "dev": true, + "requires": { + "@opentelemetry/api": "^1.0.1", + "tslib": "^2.2.0" + }, + "dependencies": { + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "dev": true + } + } + }, + "@azure/core-util": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.3.0.tgz", + "integrity": "sha512-ANP0Er7R2KHHHjwmKzPF9wbd0gXvOX7yRRHeYL1eNd/OaNrMLyfZH/FQasHRVAf6rMXX+EAUpvYwLMFDHDI5Gw==", + "requires": { + "@azure/abort-controller": "^1.0.0", + "tslib": "^2.2.0" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + } + } + }, + "@azure/logger": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.0.0.tgz", + "integrity": "sha512-g2qLDgvmhyIxR3JVS8N67CyIOeFRKQlX/llxYJQr1OSGQqM3HTpVP8MjmjcEKbL/OIt2N9C9UFaNQuKOw1laOA==", + "requires": { + "tslib": "^1.9.3" + } + }, + "@azure/opentelemetry-instrumentation-azure-sdk": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/@azure/opentelemetry-instrumentation-azure-sdk/-/opentelemetry-instrumentation-azure-sdk-1.0.0-beta.2.tgz", + "integrity": "sha512-WZ2u3J7LmwwVbyXGguiEGNYHyDoUjNb+VZ9S76xecsYOkoKSzFdWJtv/vYBknW9fLuoWCoyVVg8+lU2ouaZbJQ==", + "requires": { + "@azure/core-tracing": "^1.0.0", + "@azure/logger": "^1.0.0", + "@opentelemetry/api": "^1.2.0", + "@opentelemetry/core": "^1.7.0", + "@opentelemetry/instrumentation": "^0.33.0", + "tslib": "^2.2.0" + }, + "dependencies": { + "@azure/core-tracing": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.1.tgz", + "integrity": "sha512-I5CGMoLtX+pI17ZdiFJZgxMJApsK6jjfm85hpgp3oazCdq5Wxgh4wMr7ge/TTWW1B5WBuvIOI1fMU/FrOAMKrw==", + "requires": { + "tslib": "^2.2.0" + } + }, + "@opentelemetry/api": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.4.1.tgz", + "integrity": "sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA==" + }, + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + } + } + }, + "@azure/storage-blob": { + "version": "12.13.0", + "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.13.0.tgz", + "integrity": "sha512-t3Q2lvBMJucgTjQcP5+hvEJMAsJSk0qmAnjDLie2td017IiduZbbC9BOcFfmwzR6y6cJdZOuewLCNFmEx9IrXA==", + "dev": true, + "requires": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-http": "^3.0.0", + "@azure/core-lro": "^2.2.0", + "@azure/core-paging": "^1.1.1", + "@azure/core-tracing": "1.0.0-preview.13", + "@azure/logger": "^1.0.0", + "events": "^3.0.0", + "tslib": "^2.2.0" + }, + "dependencies": { + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "dev": true + } + } + }, + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + } + }, + "@eslint/eslintrc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", + "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.3.2", + "globals": "^13.15.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + } + }, + "@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==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "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/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "@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==", + "dev": true + }, + "@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==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@microsoft/applicationinsights-web-snippet": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-web-snippet/-/applicationinsights-web-snippet-1.0.1.tgz", + "integrity": "sha512-2IHAOaLauc8qaAitvWS+U931T+ze+7MNWrDHY47IENP5y2UA0vqJDu67kWZDdpCN1fFC77sfgfB+HV7SrKshnQ==" + }, + "@mongodb-js/saslprep": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.0.tgz", + "integrity": "sha512-Xfijy7HvfzzqiOAhAepF4SGN5e9leLkMvg/OPOF97XemjfVCYN/oWa75wnkc6mltMSTwY+XlbhWgUOJmkFspSw==", + "dev": true, + "optional": true, + "requires": { + "sparse-bitfield": "^3.0.3" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@octokit/auth-token": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.0.tgz", + "integrity": "sha512-MDNFUBcJIptB9At7HiV7VCvU3NcL4GnfCQaP8C5lrxWrRPMJBnemYtehaKSOlaM7AYxeRyj9etenu8LVpSpVaQ==", + "requires": { + "@octokit/types": "^6.0.3" + } + }, + "@octokit/core": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.0.4.tgz", + "integrity": "sha512-sUpR/hc4Gc7K34o60bWC7WUH6Q7T6ftZ2dUmepSyJr9PRF76/qqkWjE2SOEzCqLA5W83SaISymwKtxks+96hPQ==", + "requires": { + "@octokit/auth-token": "^3.0.0", + "@octokit/graphql": "^5.0.0", + "@octokit/request": "^6.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^6.0.3", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + }, + "dependencies": { + "@octokit/request": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.0.tgz", + "integrity": "sha512-7IAmHnaezZrgUqtRShMlByJK33MT9ZDnMRgZjnRrRV9a/jzzFwKGz0vxhFU6i7VMLraYcQ1qmcAOin37Kryq+Q==", + "requires": { + "@octokit/endpoint": "^7.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^6.16.1", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.7", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/request-error": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.0.tgz", + "integrity": "sha512-WBtpzm9lR8z4IHIMtOqr6XwfkGvMOOILNLxsWvDwtzm/n7f5AWuqJTXQXdDtOvPfTDrH4TPhEvW2qMlR4JFA2w==", + "requires": { + "@octokit/types": "^6.0.3", + "deprecation": "^2.0.0", + "once": "^1.4.0" + } + } + } + }, + "@octokit/endpoint": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.0.tgz", + "integrity": "sha512-Kz/mIkOTjs9rV50hf/JK9pIDl4aGwAtT8pry6Rpy+hVXkAPhXanNQRxMoq6AeRgDCZR6t/A1zKniY2V1YhrzlQ==", + "requires": { + "@octokit/types": "^6.0.3", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/graphql": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.0.tgz", + "integrity": "sha512-1ZZ8tX4lUEcLPvHagfIVu5S2xpHYXAmgN0+95eAOPoaVPzCfUXJtA5vASafcpWcO86ze0Pzn30TAx72aB2aguQ==", + "requires": { + "@octokit/request": "^6.0.0", + "@octokit/types": "^6.0.3", + "universal-user-agent": "^6.0.0" }, "dependencies": { - "@octokit/auth-token": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz", - "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==", - "requires": { - "@octokit/types": "^6.0.3" - } + "@octokit/openapi-types": { + "version": "13.13.1", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-13.13.1.tgz", + "integrity": "sha512-4EuKSk3N95UBWFau3Bz9b3pheQ8jQYbKmBL5+GSuY8YDPDwu03J4BjI+66yNi8aaX/3h1qDpb0mbBkLdr+cfGQ==" }, - "@octokit/core": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz", - "integrity": "sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==", + "@octokit/request": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.1.tgz", + "integrity": "sha512-gYKRCia3cpajRzDSU+3pt1q2OcuC6PK8PmFIyxZDWCzRXRSIBH8jXjFJ8ZceoygBIm0KsEUg4x1+XcYBz7dHPQ==", "requires": { - "@octokit/auth-token": "^2.4.4", - "@octokit/graphql": "^4.5.8", - "@octokit/request": "^5.6.3", - "@octokit/request-error": "^2.0.5", - "@octokit/types": "^6.0.3", - "before-after-hook": "^2.2.0", + "@octokit/endpoint": "^7.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^7.0.0", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.7", "universal-user-agent": "^6.0.0" + }, + "dependencies": { + "@octokit/types": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-7.5.1.tgz", + "integrity": "sha512-Zk4OUMLCSpXNI8KZZn47lVLJSsgMyCimsWWQI5hyjZg7hdYm0kjotaIkbG0Pp8SfU2CofMBzonboTqvzn3FrJA==", + "requires": { + "@octokit/openapi-types": "^13.11.0" + } + } } }, - "@octokit/graphql": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz", - "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==", + "@octokit/request-error": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.1.tgz", + "integrity": "sha512-ym4Bp0HTP7F3VFssV88WD1ZyCIRoE8H35pXSKwLeMizcdZAYc/t6N9X9Yr9n6t3aG9IH75XDnZ6UeZph0vHMWQ==", + "requires": { + "@octokit/types": "^7.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + }, + "dependencies": { + "@octokit/types": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-7.5.1.tgz", + "integrity": "sha512-Zk4OUMLCSpXNI8KZZn47lVLJSsgMyCimsWWQI5hyjZg7hdYm0kjotaIkbG0Pp8SfU2CofMBzonboTqvzn3FrJA==", + "requires": { + "@octokit/openapi-types": "^13.11.0" + } + } + } + } + } + }, + "@octokit/openapi-types": { + "version": "12.11.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz", + "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==" + }, + "@octokit/plugin-paginate-rest": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-3.1.0.tgz", + "integrity": "sha512-+cfc40pMzWcLkoDcLb1KXqjX0jTGYXjKuQdFQDc6UAknISJHnZTiBqld6HDwRJvD4DsouDKrWXNbNV0lE/3AXA==", + "requires": { + "@octokit/types": "^6.41.0" + } + }, + "@octokit/plugin-request-log": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", + "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", + "requires": {} + }, + "@octokit/plugin-rest-endpoint-methods": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-6.2.0.tgz", + "integrity": "sha512-PZ+yfkbZAuRUtqu6Y191/V3eM0KBPx+Yq7nh+ONPdpm3EX4pd5UnK2y2XgO/0AtNum5a4aJCDjqsDuUZ2hWRXw==", + "requires": { + "@octokit/types": "^6.41.0", + "deprecation": "^2.3.1" + } + }, + "@octokit/request": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz", + "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==", + "requires": { + "@octokit/endpoint": "^6.0.1", + "@octokit/request-error": "^2.1.0", + "@octokit/types": "^6.16.1", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.7", + "universal-user-agent": "^6.0.0" + }, + "dependencies": { + "@octokit/endpoint": { + "version": "6.0.12", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz", + "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==", "requires": { - "@octokit/request": "^5.6.0", "@octokit/types": "^6.0.3", + "is-plain-object": "^5.0.0", "universal-user-agent": "^6.0.0" } - }, - "@octokit/plugin-paginate-rest": { - "version": "2.21.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz", - "integrity": "sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==", + } + } + }, + "@octokit/request-error": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz", + "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", + "requires": { + "@octokit/types": "^6.0.3", + "deprecation": "^2.0.0", + "once": "^1.4.0" + } + }, + "@octokit/rest": { + "version": "19.0.3", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.3.tgz", + "integrity": "sha512-5arkTsnnRT7/sbI4fqgSJ35KiFaN7zQm0uQiQtivNQLI8RQx8EHwJCajcTUwmaCMNDg7tdCvqAnc7uvHHPxrtQ==", + "requires": { + "@octokit/core": "^4.0.0", + "@octokit/plugin-paginate-rest": "^3.0.0", + "@octokit/plugin-request-log": "^1.0.4", + "@octokit/plugin-rest-endpoint-methods": "^6.0.0" + } + }, + "@octokit/types": { + "version": "6.41.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", + "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", + "requires": { + "@octokit/openapi-types": "^12.11.0" + } + }, + "@opentelemetry/api": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.0.4.tgz", + "integrity": "sha512-BuJuXRSJNQ3QoKA6GWWDyuLpOUck+9hAXNMCnrloc1aWVoy6Xq6t9PUV08aBZ4Lutqq2LEHM486bpZqoViScog==" + }, + "@opentelemetry/api-metrics": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-metrics/-/api-metrics-0.33.0.tgz", + "integrity": "sha512-78evfPRRRnJA6uZ3xuBuS3VZlXTO/LRs+Ff1iv3O/7DgibCtq9k27T6Zlj8yRdJDFmcjcbQrvC0/CpDpWHaZYA==", + "requires": { + "@opentelemetry/api": "^1.0.0" + } + }, + "@opentelemetry/core": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.11.0.tgz", + "integrity": "sha512-aP1wHSb+YfU0pM63UAkizYPuS4lZxzavHHw5KJfFNN2oWQ79HSm6JR3CzwFKHwKhSzHN8RE9fgP1IdVJ8zmo1w==", + "requires": { + "@opentelemetry/semantic-conventions": "1.11.0" + }, + "dependencies": { + "@opentelemetry/semantic-conventions": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.11.0.tgz", + "integrity": "sha512-fG4D0AktoHyHwGhFGv+PzKrZjxbKJfckJauTJdq2A+ej5cTazmNYjJVAODXXkYyrsI10muMl+B1iO2q1R6Lp+w==" + } + } + }, + "@opentelemetry/instrumentation": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.33.0.tgz", + "integrity": "sha512-8joPjKJ6TznNt04JbnzZG+m1j/4wm1OIrX7DEw/V5lyZ9/2fahIqG72jeZ26VKOZnLOpVzUUnU/dweURqBzT3Q==", + "requires": { + "@opentelemetry/api-metrics": "0.33.0", + "require-in-the-middle": "^5.0.3", + "semver": "^7.3.2", + "shimmer": "^1.2.1" + }, + "dependencies": { + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "requires": { - "@octokit/types": "^6.40.0" + "lru-cache": "^6.0.0" } - }, - "@octokit/plugin-rest-endpoint-methods": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.2.tgz", - "integrity": "sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==", + } + } + }, + "@opentelemetry/semantic-conventions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.0.1.tgz", + "integrity": "sha512-7XU1sfQ8uCVcXLxtAHA8r3qaLJ2oq7sKtEwzZhzuEXqYmjW+n+J4yM3kNo0HQo3Xp1eUe47UM6Wy6yuAvIyllg==" + }, + "@slack/logger": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@slack/logger/-/logger-3.0.0.tgz", + "integrity": "sha512-DTuBFbqu4gGfajREEMrkq5jBhcnskinhr4+AnfJEk48zhVeEv3XnUKGIX98B74kxhYsIMfApGGySTn7V3b5yBA==", + "requires": { + "@types/node": ">=12.0.0" + } + }, + "@slack/types": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@slack/types/-/types-2.7.0.tgz", + "integrity": "sha512-QUrHBilZeWyXAuHfEbSnzBwvFm4u/75LHKRKu8xRUnGNt35Amz8y9YQwb6voU1S5FmTYxMNAL+ZbAPTor4aRdw==" + }, + "@slack/web-api": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@slack/web-api/-/web-api-6.7.2.tgz", + "integrity": "sha512-qgWMxdy1A2uNvhETfRl349UjTEvnUzHl947Ly5c+lqOrXJIwsG12szL4tD3WrRlTuxCijDemF3FjtUNz18YAxg==", + "requires": { + "@slack/logger": "^3.0.0", + "@slack/types": "^2.0.0", + "@types/is-stream": "^1.1.0", + "@types/node": ">=12.0.0", + "axios": "^0.27.2", + "eventemitter3": "^3.1.0", + "form-data": "^2.5.0", + "is-electron": "2.2.0", + "is-stream": "^1.1.0", + "p-queue": "^6.6.1", + "p-retry": "^4.0.0" + }, + "dependencies": { + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", "requires": { - "@octokit/types": "^6.39.0", - "deprecation": "^2.3.1" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" } } } }, - "@actions/http-client": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.0.1.tgz", - "integrity": "sha512-PIXiMVtz6VvyaRsGY268qvj57hXQEpsYogYOu2nrQhlf+XCGmZstmuZBbAybUl1nQGnvS1k1eEsQ69ZoD7xlSw==", + "@smithy/abort-controller": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.5.tgz", + "integrity": "sha512-byVZ2KWLMPYAZGKjRpniAzLcygJO4ruClZKdJTuB0eCB76ONFTdptBHlviHpAZXknRz7skYWPfcgO9v30A1SyA==", + "dev": true, + "optional": true, + "requires": { + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + } + } + }, + "@smithy/config-resolver": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.5.tgz", + "integrity": "sha512-n0c2AXz+kjALY2FQr7Zy9zhYigXzboIh1AuUUVCqFBKFtdEvTwnwPXrTDoEehLiRTUHNL+4yzZ3s+D0kKYSLSg==", + "dev": true, + "optional": true, "requires": { - "tunnel": "^0.0.6" + "@smithy/types": "^2.2.2", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.0", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + } } }, - "@azure/abort-controller": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.0.1.tgz", - "integrity": "sha512-wP2Jw6uPp8DEDy0n4KNidvwzDjyVV2xnycEIq7nPzj1rHyb/r+t3OPeNT1INZePP2wy5ZqlwyuyOMTi0ePyY1A==", + "@smithy/credential-provider-imds": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.0.7.tgz", + "integrity": "sha512-XivkZj/pipzpQPxgleE1odwJQ6oDsVViB4VUO/HRDI4EdEfZjud44USupOUOa/xOjS39/75DYB4zgTbyV+totw==", + "dev": true, + "optional": true, "requires": { - "tslib": "^1.9.3" + "@smithy/node-config-provider": "^2.0.7", + "@smithy/property-provider": "^2.0.6", + "@smithy/types": "^2.2.2", + "@smithy/url-parser": "^2.0.5", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + } } }, - "@azure/core-asynciterator-polyfill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@azure/core-asynciterator-polyfill/-/core-asynciterator-polyfill-1.0.0.tgz", - "integrity": "sha512-kmv8CGrPfN9SwMwrkiBK9VTQYxdFQEGe0BmQk+M8io56P9KNzpAxcWE/1fxJj7uouwN4kXF0BHW8DNlgx+wtCg==", - "dev": true + "@smithy/eventstream-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.5.tgz", + "integrity": "sha512-iqR6OuOV3zbQK8uVs9o+9AxhVk8kW9NAxA71nugwUB+kTY9C35pUd0A5/m4PRT0Y0oIW7W4kgnSR3fdYXQjECw==", + "dev": true, + "optional": true, + "requires": { + "@aws-crypto/crc32": "3.0.0", + "@smithy/types": "^2.2.2", + "@smithy/util-hex-encoding": "^2.0.0", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + } + } }, - "@azure/core-auth": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.4.0.tgz", - "integrity": "sha512-HFrcTgmuSuukRf/EdPmqBrc5l6Q5Uu+2TbuhaKbgaCpP2TfAeiNaQPAadxO+CYBRHGUzIDteMAjFspFLDLnKVQ==", + "@smithy/fetch-http-handler": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.0.5.tgz", + "integrity": "sha512-EzFoMowdBNy1VqtvkiXgPFEdosIAt4/4bgZ8uiDiUyfhmNXq/3bV+CagPFFBsgFOR/X2XK4zFZHRsoa7PNHVVg==", + "dev": true, + "optional": true, "requires": { - "@azure/abort-controller": "^1.0.0", - "tslib": "^2.2.0" + "@smithy/protocol-http": "^2.0.5", + "@smithy/querystring-builder": "^2.0.5", + "@smithy/types": "^2.2.2", + "@smithy/util-base64": "^2.0.0", + "tslib": "^2.5.0" }, "dependencies": { "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true } } }, - "@azure/core-http": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@azure/core-http/-/core-http-3.0.1.tgz", - "integrity": "sha512-A3x+um3cAPgQe42Lu7Iv/x8/fNjhL/nIoEfqFxfn30EyxK6zC13n+OUxzZBRC0IzQqssqIbt4INf5YG7lYYFtw==", + "@smithy/hash-node": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.5.tgz", + "integrity": "sha512-mk551hIywBITT+kXruRNXk7f8Fy7DTzBjZJSr/V6nolYKmUHIG3w5QU6nO9qPYEQGKc/yEPtkpdS28ndeG93lA==", "dev": true, + "optional": true, "requires": { - "@azure/abort-controller": "^1.0.0", - "@azure/core-auth": "^1.3.0", - "@azure/core-tracing": "1.0.0-preview.13", - "@azure/core-util": "^1.1.1", - "@azure/logger": "^1.0.0", - "@types/node-fetch": "^2.5.0", - "@types/tunnel": "^0.0.3", - "form-data": "^4.0.0", - "node-fetch": "^2.6.7", - "process": "^0.11.10", - "tslib": "^2.2.0", - "tunnel": "^0.0.6", - "uuid": "^8.3.0", - "xml2js": "^0.5.0" + "@smithy/types": "^2.2.2", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" }, "dependencies": { "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true } } }, - "@azure/core-lro": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-2.2.4.tgz", - "integrity": "sha512-e1I2v2CZM0mQo8+RSix0x091Av493e4bnT22ds2fcQGslTHzM2oTbswkB65nP4iEpCxBrFxOSDPKExmTmjCVtQ==", + "@smithy/invalid-dependency": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.5.tgz", + "integrity": "sha512-0wEi+JT0hM+UUwrJVYbqjuGFhy5agY/zXyiN7BNAJ1XoCDjU5uaNSj8ekPWsXd/d4yM6NSe8UbPd8cOc1+3oBQ==", "dev": true, + "optional": true, "requires": { - "@azure/abort-controller": "^1.0.0", - "@azure/core-tracing": "1.0.0-preview.13", - "@azure/logger": "^1.0.0", - "tslib": "^2.2.0" + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" }, "dependencies": { "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", - "dev": true + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true } } }, - "@azure/core-paging": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.1.1.tgz", - "integrity": "sha512-hqEJBEGKan4YdOaL9ZG/GRG6PXaFd/Wb3SSjQW4LWotZzgl6xqG00h6wmkrpd2NNkbBkD1erLHBO3lPHApv+iQ==", + "@smithy/is-array-buffer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.0.0.tgz", + "integrity": "sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==", "dev": true, + "optional": true, "requires": { - "@azure/core-asynciterator-polyfill": "^1.0.0" + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + } } }, - "@azure/core-rest-pipeline": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.10.3.tgz", - "integrity": "sha512-AMQb0ttiGJ0MIV/r+4TVra6U4+90mPeOveehFnrqKlo7dknPJYdJ61wOzYJXJjDxF8LcCtSogfRelkq+fCGFTw==", + "@smithy/middleware-content-length": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.5.tgz", + "integrity": "sha512-E7VwV5H02fgZIUGRli4GevBCAPvkyEI/fgl9SU47nPPi3DAAX3nEtUb8xfGbXjOcJ5BdSUoWWZn42tEd/blOqA==", + "dev": true, + "optional": true, "requires": { - "@azure/abort-controller": "^1.0.0", - "@azure/core-auth": "^1.4.0", - "@azure/core-tracing": "^1.0.1", - "@azure/core-util": "^1.3.0", - "@azure/logger": "^1.0.0", - "form-data": "^4.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "tslib": "^2.2.0" + "@smithy/protocol-http": "^2.0.5", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" }, "dependencies": { - "@azure/core-tracing": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.1.tgz", - "integrity": "sha512-I5CGMoLtX+pI17ZdiFJZgxMJApsK6jjfm85hpgp3oazCdq5Wxgh4wMr7ge/TTWW1B5WBuvIOI1fMU/FrOAMKrw==", - "requires": { - "tslib": "^2.2.0" - } - }, "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true } } }, - "@azure/core-tracing": { - "version": "1.0.0-preview.13", - "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.0-preview.13.tgz", - "integrity": "sha512-KxDlhXyMlh2Jhj2ykX6vNEU0Vou4nHr025KoSEiz7cS3BNiHNaZcdECk/DmLkEB0as5T7b/TpRcehJ5yV6NeXQ==", + "@smithy/middleware-endpoint": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.0.5.tgz", + "integrity": "sha512-tyzDuoNTbsMQCq5Xkc4QOt6e2GACUllQIV8SQ5fc59FtOIV9/vbf58/GxVjZm2o8+MMbdDBANjTDZe/ijZKfyA==", "dev": true, + "optional": true, "requires": { - "@opentelemetry/api": "^1.0.1", - "tslib": "^2.2.0" + "@smithy/middleware-serde": "^2.0.5", + "@smithy/types": "^2.2.2", + "@smithy/url-parser": "^2.0.5", + "@smithy/util-middleware": "^2.0.0", + "tslib": "^2.5.0" }, "dependencies": { "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", - "dev": true + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true } } }, - "@azure/core-util": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.3.0.tgz", - "integrity": "sha512-ANP0Er7R2KHHHjwmKzPF9wbd0gXvOX7yRRHeYL1eNd/OaNrMLyfZH/FQasHRVAf6rMXX+EAUpvYwLMFDHDI5Gw==", + "@smithy/middleware-retry": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.5.tgz", + "integrity": "sha512-ulIfbFyzQTVnJbLjUl1CTSi0etg6tej/ekwaLp0Gn8ybUkDkKYa+uB6CF/m2J5B6meRwyJlsryR+DjaOVyiicg==", + "dev": true, + "optional": true, "requires": { - "@azure/abort-controller": "^1.0.0", - "tslib": "^2.2.0" + "@smithy/protocol-http": "^2.0.5", + "@smithy/service-error-classification": "^2.0.0", + "@smithy/types": "^2.2.2", + "@smithy/util-middleware": "^2.0.0", + "@smithy/util-retry": "^2.0.0", + "tslib": "^2.5.0", + "uuid": "^8.3.2" }, "dependencies": { "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true } } }, - "@azure/logger": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.0.0.tgz", - "integrity": "sha512-g2qLDgvmhyIxR3JVS8N67CyIOeFRKQlX/llxYJQr1OSGQqM3HTpVP8MjmjcEKbL/OIt2N9C9UFaNQuKOw1laOA==", + "@smithy/middleware-serde": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.5.tgz", + "integrity": "sha512-in0AA5sous74dOfTGU9rMJBXJ0bDVNxwdXtEt5lh3FVd2sEyjhI+rqpLLRF1E4ixbw3RSEf80hfRpcPdjg4vvQ==", + "dev": true, + "optional": true, "requires": { - "tslib": "^1.9.3" + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + } } }, - "@azure/opentelemetry-instrumentation-azure-sdk": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/@azure/opentelemetry-instrumentation-azure-sdk/-/opentelemetry-instrumentation-azure-sdk-1.0.0-beta.2.tgz", - "integrity": "sha512-WZ2u3J7LmwwVbyXGguiEGNYHyDoUjNb+VZ9S76xecsYOkoKSzFdWJtv/vYBknW9fLuoWCoyVVg8+lU2ouaZbJQ==", + "@smithy/middleware-stack": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.0.tgz", + "integrity": "sha512-31XC1xNF65nlbc16yuh3wwTudmqs6qy4EseQUGF8A/p2m/5wdd/cnXJqpniy/XvXVwkHPz/GwV36HqzHtIKATQ==", + "dev": true, + "optional": true, "requires": { - "@azure/core-tracing": "^1.0.0", - "@azure/logger": "^1.0.0", - "@opentelemetry/api": "^1.2.0", - "@opentelemetry/core": "^1.7.0", - "@opentelemetry/instrumentation": "^0.33.0", - "tslib": "^2.2.0" + "tslib": "^2.5.0" }, "dependencies": { - "@azure/core-tracing": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.1.tgz", - "integrity": "sha512-I5CGMoLtX+pI17ZdiFJZgxMJApsK6jjfm85hpgp3oazCdq5Wxgh4wMr7ge/TTWW1B5WBuvIOI1fMU/FrOAMKrw==", - "requires": { - "tslib": "^2.2.0" - } - }, - "@opentelemetry/api": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.4.1.tgz", - "integrity": "sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA==" - }, "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true } } }, - "@azure/storage-blob": { - "version": "12.13.0", - "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.13.0.tgz", - "integrity": "sha512-t3Q2lvBMJucgTjQcP5+hvEJMAsJSk0qmAnjDLie2td017IiduZbbC9BOcFfmwzR6y6cJdZOuewLCNFmEx9IrXA==", + "@smithy/node-config-provider": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.0.7.tgz", + "integrity": "sha512-GuLxhnf0aVQsfQp4ZWaM1TRCIndpQjAswyFcmDFRNf4yFqpxpLPDeV540+O0Z21Hmu3deoQm/dCPXbVn90PYzg==", "dev": true, + "optional": true, "requires": { - "@azure/abort-controller": "^1.0.0", - "@azure/core-http": "^3.0.0", - "@azure/core-lro": "^2.2.0", - "@azure/core-paging": "^1.1.1", - "@azure/core-tracing": "1.0.0-preview.13", - "@azure/logger": "^1.0.0", - "events": "^3.0.0", - "tslib": "^2.2.0" + "@smithy/property-provider": "^2.0.6", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" }, "dependencies": { "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", - "dev": true + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + } + } + }, + "@smithy/node-http-handler": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.0.5.tgz", + "integrity": "sha512-lZm5DZf4b3V0saUw9WTC4/du887P6cy2fUyQgQQKRRV6OseButyD5yTzeMmXE53CaXJBMBsUvvIQ0hRVxIq56w==", + "dev": true, + "optional": true, + "requires": { + "@smithy/abort-controller": "^2.0.5", + "@smithy/protocol-http": "^2.0.5", + "@smithy/querystring-builder": "^2.0.5", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true } } }, - "@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "@smithy/property-provider": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.6.tgz", + "integrity": "sha512-CVem6ZkkWxbTnhjDLyLESY0oLA6IUZYtdqrCpGQKUXaFBOuc/izjm7fIFGBxEbjZ1EGcH9hHxrjqX36RWULNRg==", "dev": true, + "optional": true, "requires": { - "@jridgewell/trace-mapping": "0.3.9" + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + } } }, - "@eslint/eslintrc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", - "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", + "@smithy/protocol-http": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-2.0.5.tgz", + "integrity": "sha512-d2hhHj34mA2V86doiDfrsy2fNTnUOowGaf9hKb0hIPHqvcnShU4/OSc4Uf1FwHkAdYF3cFXTrj5VGUYbEuvMdw==", "dev": true, + "optional": true, "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.3.2", - "globals": "^13.15.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + } } }, - "@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==", + "@smithy/querystring-builder": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.5.tgz", + "integrity": "sha512-4DCX9krxLzATj+HdFPC3i8pb7XTAWzzKqSw8aTZMjXjtQY+vhe4azMAqIvbb6g7JKwIkmkRAjK6EXO3YWSnJVQ==", "dev": true, + "optional": true, "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" + "@smithy/types": "^2.2.2", + "@smithy/util-uri-escape": "^2.0.0", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + } } }, - "@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/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@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==", - "dev": true - }, - "@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==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "@smithy/querystring-parser": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.5.tgz", + "integrity": "sha512-C2stCULH0r54KBksv3AWcN8CLS3u9+WsEW8nBrvctrJ5rQTNa1waHkffpVaiKvcW2nP0aIMBPCobD/kYf/q9mA==", "dev": true, + "optional": true, "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + } } }, - "@microsoft/applicationinsights-web-snippet": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-web-snippet/-/applicationinsights-web-snippet-1.0.1.tgz", - "integrity": "sha512-2IHAOaLauc8qaAitvWS+U931T+ze+7MNWrDHY47IENP5y2UA0vqJDu67kWZDdpCN1fFC77sfgfB+HV7SrKshnQ==" + "@smithy/service-error-classification": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.0.tgz", + "integrity": "sha512-2z5Nafy1O0cTf69wKyNjGW/sNVMiqDnb4jgwfMG8ye8KnFJ5qmJpDccwIbJNhXIfbsxTg9SEec2oe1cexhMJvw==", + "dev": true, + "optional": true }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "@smithy/shared-ini-file-loader": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.0.6.tgz", + "integrity": "sha512-NO6dHqho6APbVR0DxPtYoL4KXBqUeSM3Slsd103MOgL50YbzzsQmMLtDMZ87W8MlvvCN0tuiq+OrAO/rM7hTQg==", "dev": true, + "optional": true, "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + } } }, - "@nodelib/fs.stat": { + "@smithy/signature-v4": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.5.tgz", + "integrity": "sha512-ABIzXmUDXK4n2c9cXjQLELgH2RdtABpYKT+U131e2I6RbCypFZmxIHmIBufJzU2kdMCQ3+thBGDWorAITFW04A==", "dev": true, + "optional": true, "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "@smithy/eventstream-codec": "^2.0.5", + "@smithy/is-array-buffer": "^2.0.0", + "@smithy/types": "^2.2.2", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-middleware": "^2.0.0", + "@smithy/util-uri-escape": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + } } }, - "@octokit/auth-token": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.0.tgz", - "integrity": "sha512-MDNFUBcJIptB9At7HiV7VCvU3NcL4GnfCQaP8C5lrxWrRPMJBnemYtehaKSOlaM7AYxeRyj9etenu8LVpSpVaQ==", + "@smithy/smithy-client": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.0.5.tgz", + "integrity": "sha512-kCTFr8wfOAWKDzGvfBElc6shHigWtHNhMQ1IbosjC4jOlayFyZMSs2PysKB+Ox/dhQ41KqOzgVjgiQ+PyWqHMQ==", + "dev": true, + "optional": true, "requires": { - "@octokit/types": "^6.0.3" + "@smithy/middleware-stack": "^2.0.0", + "@smithy/types": "^2.2.2", + "@smithy/util-stream": "^2.0.5", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + } } }, - "@octokit/core": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.0.4.tgz", - "integrity": "sha512-sUpR/hc4Gc7K34o60bWC7WUH6Q7T6ftZ2dUmepSyJr9PRF76/qqkWjE2SOEzCqLA5W83SaISymwKtxks+96hPQ==", + "@smithy/types": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.2.2.tgz", + "integrity": "sha512-4PS0y1VxDnELGHGgBWlDksB2LJK8TG8lcvlWxIsgR+8vROI7Ms8h1P4FQUx+ftAX2QZv5g1CJCdhdRmQKyonyw==", + "dev": true, + "optional": true, "requires": { - "@octokit/auth-token": "^3.0.0", - "@octokit/graphql": "^5.0.0", - "@octokit/request": "^6.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^6.0.3", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" + "tslib": "^2.5.0" }, "dependencies": { - "@octokit/request": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.0.tgz", - "integrity": "sha512-7IAmHnaezZrgUqtRShMlByJK33MT9ZDnMRgZjnRrRV9a/jzzFwKGz0vxhFU6i7VMLraYcQ1qmcAOin37Kryq+Q==", - "requires": { - "@octokit/endpoint": "^7.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^6.16.1", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/request-error": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.0.tgz", - "integrity": "sha512-WBtpzm9lR8z4IHIMtOqr6XwfkGvMOOILNLxsWvDwtzm/n7f5AWuqJTXQXdDtOvPfTDrH4TPhEvW2qMlR4JFA2w==", - "requires": { - "@octokit/types": "^6.0.3", - "deprecation": "^2.0.0", - "once": "^1.4.0" - } + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true } } }, - "@octokit/endpoint": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.0.tgz", - "integrity": "sha512-Kz/mIkOTjs9rV50hf/JK9pIDl4aGwAtT8pry6Rpy+hVXkAPhXanNQRxMoq6AeRgDCZR6t/A1zKniY2V1YhrzlQ==", + "@smithy/url-parser": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.5.tgz", + "integrity": "sha512-OdMBvZhpckQSkugCXNJQCvqJ71wE7Ftxce92UOQLQ9pwF6hoS5PLL7wEfpnuEXtStzBqJYkzu1C1ZfjuFGOXAA==", + "dev": true, + "optional": true, "requires": { - "@octokit/types": "^6.0.3", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" + "@smithy/querystring-parser": "^2.0.5", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + } } }, - "@octokit/graphql": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.0.tgz", - "integrity": "sha512-1ZZ8tX4lUEcLPvHagfIVu5S2xpHYXAmgN0+95eAOPoaVPzCfUXJtA5vASafcpWcO86ze0Pzn30TAx72aB2aguQ==", + "@smithy/util-base64": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.0.0.tgz", + "integrity": "sha512-Zb1E4xx+m5Lud8bbeYi5FkcMJMnn+1WUnJF3qD7rAdXpaL7UjkFQLdmW5fHadoKbdHpwH9vSR8EyTJFHJs++tA==", + "dev": true, + "optional": true, "requires": { - "@octokit/request": "^6.0.0", - "@octokit/types": "^6.0.3", - "universal-user-agent": "^6.0.0" + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" }, "dependencies": { - "@octokit/openapi-types": { - "version": "13.13.1", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-13.13.1.tgz", - "integrity": "sha512-4EuKSk3N95UBWFau3Bz9b3pheQ8jQYbKmBL5+GSuY8YDPDwu03J4BjI+66yNi8aaX/3h1qDpb0mbBkLdr+cfGQ==" - }, - "@octokit/request": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.1.tgz", - "integrity": "sha512-gYKRCia3cpajRzDSU+3pt1q2OcuC6PK8PmFIyxZDWCzRXRSIBH8jXjFJ8ZceoygBIm0KsEUg4x1+XcYBz7dHPQ==", - "requires": { - "@octokit/endpoint": "^7.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^7.0.0", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" - }, - "dependencies": { - "@octokit/types": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-7.5.1.tgz", - "integrity": "sha512-Zk4OUMLCSpXNI8KZZn47lVLJSsgMyCimsWWQI5hyjZg7hdYm0kjotaIkbG0Pp8SfU2CofMBzonboTqvzn3FrJA==", - "requires": { - "@octokit/openapi-types": "^13.11.0" - } - } - } - }, - "@octokit/request-error": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.1.tgz", - "integrity": "sha512-ym4Bp0HTP7F3VFssV88WD1ZyCIRoE8H35pXSKwLeMizcdZAYc/t6N9X9Yr9n6t3aG9IH75XDnZ6UeZph0vHMWQ==", - "requires": { - "@octokit/types": "^7.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" - }, - "dependencies": { - "@octokit/types": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-7.5.1.tgz", - "integrity": "sha512-Zk4OUMLCSpXNI8KZZn47lVLJSsgMyCimsWWQI5hyjZg7hdYm0kjotaIkbG0Pp8SfU2CofMBzonboTqvzn3FrJA==", - "requires": { - "@octokit/openapi-types": "^13.11.0" - } - } - } + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true } } }, - "@octokit/openapi-types": { - "version": "12.11.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz", - "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==" - }, - "@octokit/plugin-paginate-rest": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-3.1.0.tgz", - "integrity": "sha512-+cfc40pMzWcLkoDcLb1KXqjX0jTGYXjKuQdFQDc6UAknISJHnZTiBqld6HDwRJvD4DsouDKrWXNbNV0lE/3AXA==", + "@smithy/util-body-length-browser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.0.0.tgz", + "integrity": "sha512-JdDuS4ircJt+FDnaQj88TzZY3+njZ6O+D3uakS32f2VNnDo3vyEuNdBOh/oFd8Df1zSZOuH1HEChk2AOYDezZg==", + "dev": true, + "optional": true, "requires": { - "@octokit/types": "^6.41.0" + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + } } }, - "@octokit/plugin-request-log": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", - "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", - "requires": {} - }, - "@octokit/plugin-rest-endpoint-methods": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-6.2.0.tgz", - "integrity": "sha512-PZ+yfkbZAuRUtqu6Y191/V3eM0KBPx+Yq7nh+ONPdpm3EX4pd5UnK2y2XgO/0AtNum5a4aJCDjqsDuUZ2hWRXw==", + "@smithy/util-body-length-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.1.0.tgz", + "integrity": "sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw==", + "dev": true, + "optional": true, "requires": { - "@octokit/types": "^6.41.0", - "deprecation": "^2.3.1" + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + } } }, - "@octokit/request": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz", - "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==", + "@smithy/util-buffer-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.0.0.tgz", + "integrity": "sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==", + "dev": true, + "optional": true, "requires": { - "@octokit/endpoint": "^6.0.1", - "@octokit/request-error": "^2.1.0", - "@octokit/types": "^6.16.1", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" + "@smithy/is-array-buffer": "^2.0.0", + "tslib": "^2.5.0" }, "dependencies": { - "@octokit/endpoint": { - "version": "6.0.12", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz", - "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==", - "requires": { - "@octokit/types": "^6.0.3", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - } + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true } } }, - "@octokit/request-error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz", - "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", + "@smithy/util-config-provider": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.0.0.tgz", + "integrity": "sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg==", + "dev": true, + "optional": true, "requires": { - "@octokit/types": "^6.0.3", - "deprecation": "^2.0.0", - "once": "^1.4.0" + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + } } }, - "@octokit/rest": { - "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.3.tgz", - "integrity": "sha512-5arkTsnnRT7/sbI4fqgSJ35KiFaN7zQm0uQiQtivNQLI8RQx8EHwJCajcTUwmaCMNDg7tdCvqAnc7uvHHPxrtQ==", + "@smithy/util-defaults-mode-browser": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.6.tgz", + "integrity": "sha512-h8xyKTZIIom62DN4xbPUmL+RL1deZcK1qJGmCr4c2yXjOrs5/iZ1VtQQcl+xP78620ga/565AikZE1sktdg2yA==", + "dev": true, + "optional": true, "requires": { - "@octokit/core": "^4.0.0", - "@octokit/plugin-paginate-rest": "^3.0.0", - "@octokit/plugin-request-log": "^1.0.4", - "@octokit/plugin-rest-endpoint-methods": "^6.0.0" + "@smithy/property-provider": "^2.0.6", + "@smithy/types": "^2.2.2", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + } } }, - "@octokit/types": { - "version": "6.41.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", - "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", + "@smithy/util-defaults-mode-node": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.7.tgz", + "integrity": "sha512-2C1YfmYJj9bpM/cRAgQppYNzPd8gDEXZ5XIVDuEQg3TmmIiinZaFf/HsHYo9NK/PMy5oawJVdIuR7SVriIo1AQ==", + "dev": true, + "optional": true, "requires": { - "@octokit/openapi-types": "^12.11.0" + "@smithy/config-resolver": "^2.0.5", + "@smithy/credential-provider-imds": "^2.0.7", + "@smithy/node-config-provider": "^2.0.7", + "@smithy/property-provider": "^2.0.6", + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + } } }, - "@opentelemetry/api": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.0.4.tgz", - "integrity": "sha512-BuJuXRSJNQ3QoKA6GWWDyuLpOUck+9hAXNMCnrloc1aWVoy6Xq6t9PUV08aBZ4Lutqq2LEHM486bpZqoViScog==" - }, - "@opentelemetry/api-metrics": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-metrics/-/api-metrics-0.33.0.tgz", - "integrity": "sha512-78evfPRRRnJA6uZ3xuBuS3VZlXTO/LRs+Ff1iv3O/7DgibCtq9k27T6Zlj8yRdJDFmcjcbQrvC0/CpDpWHaZYA==", + "@smithy/util-hex-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz", + "integrity": "sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==", + "dev": true, + "optional": true, "requires": { - "@opentelemetry/api": "^1.0.0" + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + } } }, - "@opentelemetry/core": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.11.0.tgz", - "integrity": "sha512-aP1wHSb+YfU0pM63UAkizYPuS4lZxzavHHw5KJfFNN2oWQ79HSm6JR3CzwFKHwKhSzHN8RE9fgP1IdVJ8zmo1w==", + "@smithy/util-middleware": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.0.tgz", + "integrity": "sha512-eCWX4ECuDHn1wuyyDdGdUWnT4OGyIzV0LN1xRttBFMPI9Ff/4heSHVxneyiMtOB//zpXWCha1/SWHJOZstG7kA==", + "dev": true, + "optional": true, "requires": { - "@opentelemetry/semantic-conventions": "1.11.0" + "tslib": "^2.5.0" }, "dependencies": { - "@opentelemetry/semantic-conventions": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.11.0.tgz", - "integrity": "sha512-fG4D0AktoHyHwGhFGv+PzKrZjxbKJfckJauTJdq2A+ej5cTazmNYjJVAODXXkYyrsI10muMl+B1iO2q1R6Lp+w==" + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true } } }, - "@opentelemetry/instrumentation": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.33.0.tgz", - "integrity": "sha512-8joPjKJ6TznNt04JbnzZG+m1j/4wm1OIrX7DEw/V5lyZ9/2fahIqG72jeZ26VKOZnLOpVzUUnU/dweURqBzT3Q==", + "@smithy/util-retry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.0.tgz", + "integrity": "sha512-/dvJ8afrElasuiiIttRJeoS2sy8YXpksQwiM/TcepqdRVp7u4ejd9C4IQURHNjlfPUT7Y6lCDSa2zQJbdHhVTg==", + "dev": true, + "optional": true, "requires": { - "@opentelemetry/api-metrics": "0.33.0", - "require-in-the-middle": "^5.0.3", - "semver": "^7.3.2", - "shimmer": "^1.2.1" + "@smithy/service-error-classification": "^2.0.0", + "tslib": "^2.5.0" }, "dependencies": { - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "requires": { - "lru-cache": "^6.0.0" - } + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true } } }, - "@opentelemetry/semantic-conventions": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.0.1.tgz", - "integrity": "sha512-7XU1sfQ8uCVcXLxtAHA8r3qaLJ2oq7sKtEwzZhzuEXqYmjW+n+J4yM3kNo0HQo3Xp1eUe47UM6Wy6yuAvIyllg==" - }, - "@slack/logger": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@slack/logger/-/logger-3.0.0.tgz", - "integrity": "sha512-DTuBFbqu4gGfajREEMrkq5jBhcnskinhr4+AnfJEk48zhVeEv3XnUKGIX98B74kxhYsIMfApGGySTn7V3b5yBA==", + "@smithy/util-stream": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.5.tgz", + "integrity": "sha512-ylx27GwI05xLpYQ4hDIfS15vm+wYjNN0Sc2P0FxuzgRe8v0BOLHppGIQ+Bezcynk8C9nUzsUue3TmtRhjut43g==", + "dev": true, + "optional": true, "requires": { - "@types/node": ">=12.0.0" + "@smithy/fetch-http-handler": "^2.0.5", + "@smithy/node-http-handler": "^2.0.5", + "@smithy/types": "^2.2.2", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + } } }, - "@slack/types": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@slack/types/-/types-2.7.0.tgz", - "integrity": "sha512-QUrHBilZeWyXAuHfEbSnzBwvFm4u/75LHKRKu8xRUnGNt35Amz8y9YQwb6voU1S5FmTYxMNAL+ZbAPTor4aRdw==" + "@smithy/util-uri-escape": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.0.0.tgz", + "integrity": "sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true + } + } }, - "@slack/web-api": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@slack/web-api/-/web-api-6.7.2.tgz", - "integrity": "sha512-qgWMxdy1A2uNvhETfRl349UjTEvnUzHl947Ly5c+lqOrXJIwsG12szL4tD3WrRlTuxCijDemF3FjtUNz18YAxg==", + "@smithy/util-utf8": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.0.tgz", + "integrity": "sha512-rctU1VkziY84n5OXe3bPNpKR001ZCME2JCaBBFgtiM2hfKbHFudc/BkMuPab8hRbLd0j3vbnBTTZ1igBf0wgiQ==", + "dev": true, + "optional": true, "requires": { - "@slack/logger": "^3.0.0", - "@slack/types": "^2.0.0", - "@types/is-stream": "^1.1.0", - "@types/node": ">=12.0.0", - "axios": "^0.27.2", - "eventemitter3": "^3.1.0", - "form-data": "^2.5.0", - "is-electron": "2.2.0", - "is-stream": "^1.1.0", - "p-queue": "^6.6.1", - "p-retry": "^4.0.0" + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" }, "dependencies": { - "form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "optional": true } } }, @@ -4855,15 +8009,15 @@ "dev": true }, "@types/webidl-conversions": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-6.1.1.tgz", - "integrity": "sha512-XAahCdThVuCFDQLT7R7Pk/vqeObFNL3YqRyFZg+AqAP/W1/w3xHaIxuW7WszQqTbIBOPRcItYJIou3i/mppu3Q==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==", "dev": true }, "@types/whatwg-url": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.1.tgz", - "integrity": "sha512-2YubE1sjj5ifxievI5Ge1sckb9k/Er66HyR2c+3+I6VDUUg1TLPdYYTEbQ+DjRkS4nTxMJhgWfSfMRD2sl2EYQ==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", + "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", "dev": true, "requires": { "@types/node": "*", @@ -5205,6 +8359,13 @@ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, + "bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", + "dev": true, + "optional": true + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -5231,9 +8392,9 @@ "dev": true }, "bson": { - "version": "4.6.5", - "resolved": "https://registry.npmjs.org/bson/-/bson-4.6.5.tgz", - "integrity": "sha512-uqrgcjyOaZsHfz7ea8zLRCLe1u+QGUSzMZmvXqO24CDW7DWoW1qiN9folSwa7hSneTSgM2ykDIzF5kcQQ8cwNw==", + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.2.tgz", + "integrity": "sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ==", "dev": true, "requires": { "buffer": "^5.6.0" @@ -5395,12 +8556,6 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, - "denque": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.0.1.tgz", - "integrity": "sha512-tfiWc6BQLXNLpNiR5iGd0Ocu3P3VpxfzFiqubLgMfhfOw9WyvgJBd46CClNn9k3qfbjvT//0cf7AlYRX/OslMQ==", - "dev": true - }, "deprecation": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", @@ -5739,6 +8894,16 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "fast-xml-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", + "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==", + "dev": true, + "optional": true, + "requires": { + "strnum": "^1.0.5" + } + }, "fastq": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", @@ -5999,9 +9164,9 @@ "dev": true }, "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", "dev": true }, "is-binary-path": { @@ -6321,22 +9486,22 @@ "integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==" }, "mongodb": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.8.1.tgz", - "integrity": "sha512-/NyiM3Ox9AwP5zrfT9TXjRKDJbXlLaUDQ9Rg//2lbg8D2A8GXV0VidYYnA/gfdK6uwbnL4FnAflH7FbGw3TS7w==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.17.0.tgz", + "integrity": "sha512-LZGMIPjPfWEfhPJATk1s9IvVTD18tyfKdT/0blCMih5vGagk2SwA9wFAUPMdtJpTrhXmyfGgwAaMkvneX2bn2A==", "dev": true, "requires": { - "bson": "^4.6.5", - "denque": "^2.0.1", - "mongodb-connection-string-url": "^2.5.2", - "saslprep": "^1.0.3", - "socks": "^2.6.2" + "@aws-sdk/credential-providers": "^3.186.0", + "@mongodb-js/saslprep": "^1.1.0", + "bson": "^4.7.2", + "mongodb-connection-string-url": "^2.6.0", + "socks": "^2.7.1" } }, "mongodb-connection-string-url": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.5.2.tgz", - "integrity": "sha512-tWDyIG8cQlI5k3skB6ywaEA5F9f5OntrKKsT/Lteub2zgwSUlhqEN2inGgBTm8bpYJf8QYBdA/5naz65XDpczA==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz", + "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==", "dev": true, "requires": { "@types/whatwg-url": "^8.2.1", @@ -6665,16 +9830,6 @@ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true }, - "saslprep": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", - "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", - "dev": true, - "optional": true, - "requires": { - "sparse-bitfield": "^3.0.3" - } - }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", @@ -6713,19 +9868,19 @@ "dev": true }, "socks": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", - "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", "dev": true, "requires": { - "ip": "^1.1.5", + "ip": "^2.0.0", "smart-buffer": "^4.2.0" } }, "sparse-bitfield": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", "dev": true, "optional": true, "requires": { @@ -6763,6 +9918,13 @@ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, + "strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", + "dev": true, + "optional": true + }, "supports-color": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", diff --git a/.github/actions/package.json b/.github/actions/package.json index d8b910d36f..470bfb5047 100644 --- a/.github/actions/package.json +++ b/.github/actions/package.json @@ -32,7 +32,7 @@ "eslint-plugin-prettier": "^4.2.1", "husky": "^8.0.1", "mocha": "^10.0.0", - "mongodb": "^4.8.1", + "mongodb": "^4.17.0", "nock": "^13.2.9", "prettier": "2.7.1", "ts-node": "^10.9.1", From 121a657acb470586b2947dc5725ad706c35f0aef Mon Sep 17 00:00:00 2001 From: Garrett Serack Date: Fri, 8 Sep 2023 07:53:49 -0700 Subject: [PATCH 15/15] make translations export work correctly in CI (#11415) --- Extension/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Extension/package.json b/Extension/package.json index e74936e952..b1512f85d3 100644 --- a/Extension/package.json +++ b/Extension/package.json @@ -6134,7 +6134,7 @@ "generate-native-strings": "ts-node -T ./.scripts/generateNativeStrings.ts", "generate-options-schema": "ts-node -T ./.scripts/generateOptionsSchema.ts", "copy-walkthrough-media": "ts-node -T ./.scripts/copyWalkthruMedia.ts", - "translations-export": "yarn generate-native-strings && gulp translations-export", + "translations-export": "yarn install && yarn prep && yarn generate-native-strings && gulp translations-export", "translations-generate": "set NODE_OPTIONS=--no-experimental-fetch && gulp translations-generate", "translations-import": "gulp translations-import", "import-edge-strings": "ts-node -T ./.scripts/import_edge_strings.ts",