From 0113841d38e589d0e465b7c570acfe118592d71c Mon Sep 17 00:00:00 2001 From: Elaheh Rashedi Date: Mon, 21 Jun 2021 11:28:58 -0700 Subject: [PATCH] Read cmake file API on open (#1909) --- src/cmake-tools.ts | 28 +- src/cpptools.ts | 10 +- src/drivers/cmakefileapi/api_helpers.ts | 6 +- src/drivers/cmfileapi-driver.ts | 25 +- src/drivers/cms-driver.ts | 18 +- src/drivers/codemodel-driver-interface.ts | 21 -- src/drivers/driver.ts | 52 +++- src/drivers/legacy-driver.ts | 16 ++ src/extension.ts | 131 +++++---- test/unit-tests/cpptools.test.ts | 12 +- .../driver/driver-codemodel-tests.ts | 3 +- yarn.lock | 260 +++++++++--------- 12 files changed, 343 insertions(+), 239 deletions(-) diff --git a/src/cmake-tools.ts b/src/cmake-tools.ts index 57dd31db7..b9882e49c 100644 --- a/src/cmake-tools.ts +++ b/src/cmake-tools.ts @@ -57,7 +57,7 @@ const CMAKE_LOGGER = logging.createLogger('cmake'); export enum ConfigureType { Normal, Clean, - Cache, + Cache } export enum ConfigureTrigger { @@ -358,9 +358,9 @@ export class CMakeTools implements vscode.Disposable, api.CMakeToolsAPI { /** * Event fired when the code model from CMake is updated */ - get codeModel() { return this._codeModel.value; } - get onCodeModelChanged() { return this._codeModel.changeEvent; } - private readonly _codeModel = new Property(null); + get codeModelContent() { return this._codeModelContent.value; } + get onCodeModelChanged() { return this._codeModelContent.changeEvent; } + private readonly _codeModelContent = new Property(null); private _codeModelDriverSub: vscode.Disposable|null = null; private readonly _communicationModeSub = this.workspaceContext.config.onChange('cmakeCommunicationMode', () => { @@ -904,8 +904,8 @@ export class CMakeTools implements vscode.Disposable, api.CMakeToolsAPI { } const drv = await this._cmakeDriver; console.assert(drv !== null, 'Null driver immediately after creation?'); - if (drv instanceof codemodel_api.CodeModelDriver) { - this._codeModelDriverSub = drv.onCodeModelChanged(cm => { this._codeModel.set(cm); }); + if (drv && !(drv instanceof LegacyCMakeDriver)) { + this._codeModelDriverSub = drv.onCodeModelChanged(cm => { this._codeModelContent.set(cm); }); } } @@ -990,7 +990,20 @@ export class CMakeTools implements vscode.Disposable, api.CMakeToolsAPI { return this.configureInternal(ConfigureTrigger.api, extra_args, ConfigureType.Normal); } - configureInternal(trigger: ConfigureTrigger = ConfigureTrigger.api, extra_args: string[] = [], type: ConfigureType = ConfigureType.Normal): Thenable { + async configureInternal(trigger: ConfigureTrigger = ConfigureTrigger.api, extra_args: string[] = [], type: ConfigureType = ConfigureType.Normal): Promise { + const drv: CMakeDriver | null = await this.getCMakeDriverInstance(); + // Don't show a progress bar when the extension is using Cache for configuration. + // Using cache for configuration happens only one time. + if (drv && drv.shouldUseCachedConfiguration(trigger)) { + const retc: number = await drv.configure(trigger, []); + if (retc === 0) { + await this._refreshCompileDatabase(drv.expansionOptions); + } + await this._ctestController.reloadTests(drv); + this._onReconfiguredEmitter.fire(); + return retc; + } + return vscode.window.withProgress( { location: vscode.ProgressLocation.Notification, @@ -1000,7 +1013,6 @@ export class CMakeTools implements vscode.Disposable, api.CMakeToolsAPI { progress.report({message: localize('preparing.to.configure', 'Preparing to configure')}); log.info(localize('run.configure', 'Configuring folder: {0}', this.folderName), extra_args); return this._doConfigure(progress, async consumer => { - const drv = await this.getCMakeDriverInstance(); const IS_CONFIGURING_KEY = 'cmake:isConfiguring'; if (drv) { let old_prog = 0; diff --git a/src/cpptools.ts b/src/cpptools.ts index eec3c019c..dfc9fe01f 100644 --- a/src/cpptools.ts +++ b/src/cpptools.ts @@ -289,7 +289,7 @@ export interface CodeModelParams { /** * The CMake codemodel content. This is the important one. */ - codeModel: codemodel_api.CodeModelContent; + codeModelContent: codemodel_api.CodeModelContent; /** * The contents of the CMakeCache.txt, which also provides supplementary * configuration information. @@ -413,9 +413,9 @@ export class CppConfigurationProvider implements cpt.CustomConfigurationProvider const lang = fileGroup.language === "RC" ? undefined : fileGroup.language; // First try to get toolchain values directly reported by CMake. Check the // group's language compiler, then the C++ compiler, then the C compiler. - const comp_toolchains = opts.codeModel.toolchains?.get(lang ?? "") - || opts.codeModel.toolchains?.get('CXX') - || opts.codeModel.toolchains?.get('C'); + const comp_toolchains: codemodel_api.CodeModelToolchain | undefined = opts.codeModelContent.toolchains?.get(lang ?? "") + || opts.codeModelContent.toolchains?.get('CXX') + || opts.codeModelContent.toolchains?.get('C'); // If none of those work, fall back to the same order, but in the cache. const comp_cache = opts.cache.get(`CMAKE_${lang}_COMPILER`) || opts.cache.get('CMAKE_CXX_COMPILER') @@ -525,7 +525,7 @@ export class CppConfigurationProvider implements cpt.CustomConfigurationProvider let hadMissingCompilers = false; this._workspaceBrowseConfiguration = {browsePath: []}; this._activeTarget = opts.activeTarget; - for (const config of opts.codeModel.configurations) { + for (const config of opts.codeModelContent.configurations) { for (const project of config.projects) { for (const target of project.targets) { // Now some shenanigans since header files don't have config data: diff --git a/src/drivers/cmakefileapi/api_helpers.ts b/src/drivers/cmakefileapi/api_helpers.ts index ad27aef72..f10fd135e 100644 --- a/src/drivers/cmakefileapi/api_helpers.ts +++ b/src/drivers/cmakefileapi/api_helpers.ts @@ -295,7 +295,11 @@ export async function loadToolchains(filename: string): Promise { if (el.compiler.path) { - acc.set(el.language, { path: el.compiler.path, target: el.compiler.target }); + if (el.compiler.target) { + acc.set(el.language, { path: el.compiler.path, target: el.compiler.target }); + } else { + acc.set(el.language, { path: el.compiler.path }); + } } return acc; }, new Map()); diff --git a/src/drivers/cmfileapi-driver.ts b/src/drivers/cmfileapi-driver.ts index f72b774d7..807f91393 100644 --- a/src/drivers/cmfileapi-driver.ts +++ b/src/drivers/cmfileapi-driver.ts @@ -14,7 +14,7 @@ import { loadToolchains } from '@cmt/drivers/cmakefileapi/api_helpers'; import * as codemodel from '@cmt/drivers/codemodel-driver-interface'; -import {CMakePreconditionProblemSolver} from '@cmt/drivers/driver'; +import {CMakeDriver, CMakePreconditionProblemSolver} from '@cmt/drivers/driver'; import {CMakeGenerator, Kit} from '@cmt/kit'; import * as logging from '@cmt/logging'; import {fs} from '@cmt/pr'; @@ -37,7 +37,12 @@ const log = logging.createLogger('cmakefileapi-driver'); /** * The CMake driver with FileApi of CMake >= 3.15.0 */ -export class CMakeFileApiDriver extends codemodel.CodeModelDriver { +export class CMakeFileApiDriver extends CMakeDriver { + + get isCacheConfigSupported(): boolean { + return true; + } + private constructor(cmake: CMakeExecutable, readonly config: ConfigurationReader, workspaceRootPath: string|null, @@ -198,6 +203,12 @@ export class CMakeFileApiDriver extends codemodel.CodeModelDriver { await this._cleanPriorConfiguration(); } + async doCacheConfigure(): Promise { + this._needsReconfigure = true; + await this.updateCodeModel(); + return 0; + } + async doConfigure(args_: string[], outputConsumer?: proc.OutputConsumer): Promise { const api_path = this.getCMakeFileApiPath(); await createQueryFileForApi(api_path); @@ -237,7 +248,6 @@ export class CMakeFileApiDriver extends codemodel.CodeModelDriver { this._needsReconfigure = false; await this.updateCodeModel(); } - return res.retc === null ? -1 : res.retc; } @@ -273,7 +283,7 @@ export class CMakeFileApiDriver extends codemodel.CodeModelDriver { throw Error('No code model object found'); } this._target_map = await loadConfigurationTargetMap(reply_path, codemodel_obj.jsonFile); - this._codeModel = await loadExtCodeModelContent(reply_path, codemodel_obj.jsonFile); + this._codeModelContent = await loadExtCodeModelContent(reply_path, codemodel_obj.jsonFile); // load toolchains const toolchains_obj = indexFile.objects.find((value: index_api.Index.ObjectKind) => value.kind === 'toolchains'); @@ -288,15 +298,16 @@ export class CMakeFileApiDriver extends codemodel.CodeModelDriver { 'This version of CMake does not support the "toolchains" object kind. Compiler paths will be determined by reading CMakeCache.txt.')); } } else { - this._codeModel.toolchains = await loadToolchains(path.join(reply_path, toolchains_obj.jsonFile)); + this._codeModelContent.toolchains = await loadToolchains(path.join(reply_path, toolchains_obj.jsonFile)); } - this._codeModelChanged.fire(this._codeModel); + this._codeModelChanged.fire(this._codeModelContent); } return indexFile !== null; } - private _codeModel: codemodel.CodeModelContent|null = null; + private _codeModelContent: codemodel.CodeModelContent|null = null; + get codeModelContent() { return this._codeModelContent; } get cmakeCacheEntries(): Map { return this._cache; } get generatorName(): string|null { return this._generatorInformation ? this._generatorInformation.name : null; } diff --git a/src/drivers/cms-driver.ts b/src/drivers/cms-driver.ts index e3591611a..e33a5f5b7 100644 --- a/src/drivers/cms-driver.ts +++ b/src/drivers/cms-driver.ts @@ -9,7 +9,7 @@ import {CacheEntryProperties, ExecutableTarget, RichTarget} from '@cmt/api'; import * as cache from '@cmt/cache'; import * as cms from '@cmt/drivers/cms-client'; import * as codemodel from '@cmt/drivers/codemodel-driver-interface'; -import {CMakePreconditionProblemSolver} from '@cmt/drivers/driver'; +import {CMakeDriver, CMakePreconditionProblemSolver} from '@cmt/drivers/driver'; import {Kit, CMakeGenerator} from '@cmt/kit'; import {createLogger} from '@cmt/logging'; import * as proc from '@cmt/proc'; @@ -29,7 +29,16 @@ export class NoGeneratorError extends Error { message: string = localize('no.usable.generator.found', 'No usable generator found.'); } -export class CMakeServerClientDriver extends codemodel.CodeModelDriver { +export class CMakeServerClientDriver extends CMakeDriver { + + get isCacheConfigSupported(): boolean { + return false; + } + + async doCacheConfigure(): Promise { + throw new Error('Method not implemented.'); + } + private constructor(cmake: CMakeExecutable, readonly config: ConfigurationReader, workspaceFolder: string | null, preconditionHandler: CMakePreconditionProblemSolver) { super(cmake, config, workspaceFolder, preconditionHandler); this.config.onChange('environment', () => this._restartClient()); @@ -384,6 +393,10 @@ export class CMakeServerClientDriver extends codemodel.CodeModelDriver { }); } + get codeModelContent(): codemodel.CodeModelContent | null { + return null; + } + static async create(cmake: CMakeExecutable, config: ConfigurationReader, useCMakePresets: boolean, @@ -402,6 +415,7 @@ export class CMakeServerClientDriver extends codemodel.CodeModelDriver { testPreset, preferredGenerators); } + } /** diff --git a/src/drivers/codemodel-driver-interface.ts b/src/drivers/codemodel-driver-interface.ts index fc54afcee..c799d3299 100644 --- a/src/drivers/codemodel-driver-interface.ts +++ b/src/drivers/codemodel-driver-interface.ts @@ -1,24 +1,3 @@ -import {CMakeDriver} from '@cmt/drivers/driver'; -import * as vscode from 'vscode'; - -/** - * This file contains the API description between IDE parts and the CMake model driver. - * This API CodeModel contains only the current required CMake code model parts. - * There is more information provided by CMake than is mapped. - */ - -/** - * Describes all required methods for access to the build code model of the driver - */ -export abstract class CodeModelDriver extends CMakeDriver { - /** - * Event registration for code model updates - * - * This event is fired after update of the code model, like after cmake configuration. - */ - abstract onCodeModelChanged: vscode.Event; -} - export type TargetTypeString = ('STATIC_LIBRARY'|'MODULE_LIBRARY'|'SHARED_LIBRARY'|'OBJECT_LIBRARY'|'EXECUTABLE'|'UTILITY'|'INTERFACE_LIBRARY'); diff --git a/src/drivers/driver.ts b/src/drivers/driver.ts index f6436647d..c3c12df7e 100644 --- a/src/drivers/driver.ts +++ b/src/drivers/driver.ts @@ -28,6 +28,7 @@ import {ConfigureArguments, VariantOption} from '@cmt/variant'; import * as nls from 'vscode-nls'; import { majorVersionSemver, minorVersionSemver, parseTargetTriple, TargetTriple } from '@cmt/triple'; import * as preset from '@cmt/preset'; +import * as codemodel from '@cmt/drivers/codemodel-driver-interface'; nls.config({ messageFormat: nls.MessageFormat.bundle, bundleFormat: nls.BundleFormat.standalone })(); const localize: nls.LocalizeFunc = nls.loadMessageBundle(); @@ -69,6 +70,12 @@ export abstract class CMakeDriver implements vscode.Disposable { * @returns The exit code from CMake */ protected abstract doConfigure(extra_args: string[], consumer?: proc.OutputConsumer): Promise; + protected abstract doCacheConfigure(): Promise; + + private _isConfiguredAtLeastOnce = false; + protected get isConfiguredAtLeastOnce(): boolean { + return this._isConfiguredAtLeastOnce; + } protected async doPreCleanConfigure(): Promise { return Promise.resolve(); @@ -82,16 +89,29 @@ export abstract class CMakeDriver implements vscode.Disposable { return Promise.resolve(true); } + /** + * Check if using cached configuration is supported. + */ + protected abstract get isCacheConfigSupported(): boolean; + /** * Check if we need to reconfigure, such as if an important file has changed */ abstract checkNeedsReconfigure(): Promise; + /** + * Event registration for code model updates + * + * This event is fired after update of the code model, like after cmake configuration. + */ + abstract onCodeModelChanged: vscode.Event; /** * List of targets known to CMake */ abstract get targets(): api.Target[]; + abstract get codeModelContent(): codemodel.CodeModelContent|null; + /** * List of executable targets known to CMake */ @@ -1094,7 +1114,16 @@ export abstract class CMakeDriver implements vscode.Disposable { return count; } + public shouldUseCachedConfiguration(trigger: ConfigureTrigger): boolean { + return (this.isCacheConfigSupported && !this.isConfiguredAtLeastOnce && + trigger === ConfigureTrigger.configureOnOpen && !this.config.configureOnOpen) ? + true : false; + } + async configure(trigger: ConfigureTrigger, extra_args: string[], consumer?: proc.OutputConsumer, withoutCmakeSettings: boolean = false): Promise { + // Check if the configuration is using cache in the first configuration and adjust the logging messages based on that. + const usingCachedConfiguration: boolean = this.shouldUseCachedConfiguration(trigger); + if (this.configRunning) { await this.preconditionHandler(CMakePreconditionProblems.ConfigureIsAlreadyRunning); return -1; @@ -1108,13 +1137,18 @@ export abstract class CMakeDriver implements vscode.Disposable { // _beforeConfigureOrBuild needs to refresh expansions early because it reads various settings // (example: cmake.sourceDirectory). await this._refreshExpansions(); - log.debug(localize('start.configure', 'Start configure'), extra_args); + if (!usingCachedConfiguration) { + log.debug(localize('start.configure', 'Start configure'), extra_args); + } else { + log.debug(localize('use.cached.configuration', 'Use cached configuration'), extra_args); + } const pre_check_ok = await this._beforeConfigureOrBuild(); if (!pre_check_ok) { return -2; } + // Cache flags will construct the command line for cmake. const init_cache_flags = this.generateInitCacheFlags(); let expanded_flags: string[]; @@ -1139,13 +1173,23 @@ export abstract class CMakeDriver implements vscode.Disposable { async (value: string) => expand.expandString(value, {...opts, envOverride: expanded_configure_env})); expanded_flags = await Promise.all(expanded_flags_promises); } - log.trace(localize('cmake.flags.are', 'CMake flags are {0}', JSON.stringify(expanded_flags))); + if (!usingCachedConfiguration) { + log.trace(localize('cmake.flags.are', 'CMake flags are {0}', JSON.stringify(expanded_flags))); + } // A more complete round of expansions await this._refreshExpansions(); const timeStart: number = new Date().getTime(); - const retc = await this.doConfigure(expanded_flags, consumer); + let retc: number; + if (usingCachedConfiguration) { + retc = await this.doCacheConfigure(); + this._isConfiguredAtLeastOnce = true; + return retc; + } else { + retc = await this.doConfigure(expanded_flags, consumer); + this._isConfiguredAtLeastOnce = true; + } const timeEnd: number = new Date().getTime(); const cmakeVersion = this.cmake.version; @@ -1235,6 +1279,7 @@ export abstract class CMakeDriver implements vscode.Disposable { telemetryMeasures['ErrorCount'] = retc ? 1 : 0; } } + telemetry.logEvent('configure', telemetryProperties, telemetryMeasures); return retc; @@ -1603,4 +1648,5 @@ export abstract class CMakeDriver implements vscode.Disposable { await inst._baseInit(useCMakePresets, kit, configurePreset, buildPreset, testPreset, preferredGenerators); return inst; } + } diff --git a/src/drivers/legacy-driver.ts b/src/drivers/legacy-driver.ts index 88aee4783..b692fbb9c 100644 --- a/src/drivers/legacy-driver.ts +++ b/src/drivers/legacy-driver.ts @@ -18,6 +18,7 @@ import * as util from '@cmt/util'; import { ConfigurationReader } from '@cmt/config'; import * as nls from 'vscode-nls'; import { BuildPreset, ConfigurePreset, TestPreset } from '@cmt/preset'; +import { CodeModelContent } from './codemodel-driver-interface'; nls.config({ messageFormat: nls.MessageFormat.bundle, bundleFormat: nls.BundleFormat.standalone })(); const localize: nls.LocalizeFunc = nls.loadMessageBundle(); @@ -28,6 +29,15 @@ const log = logging.createLogger('legacy-driver'); * The legacy driver. */ export class LegacyCMakeDriver extends CMakeDriver { + + get isCacheConfigSupported(): boolean { + return false; + } + + async doCacheConfigure(): Promise { + throw new Error('Method not implemented.'); + } + private constructor(cmake: CMakeExecutable, readonly config: ConfigurationReader, workspaceFolder: string | null, preconditionHandler: CMakePreconditionProblemSolver) { super(cmake, config, workspaceFolder, preconditionHandler); } @@ -164,4 +174,10 @@ export class LegacyCMakeDriver extends CMakeDriver { const gen = this.cmakeCache.get('CMAKE_GENERATOR'); return gen ? gen.as() : null; } + + get codeModelContent(): CodeModelContent | null { + return null; + } + get onCodeModelChanged() { return new vscode.EventEmitter().event; } + } diff --git a/src/extension.ts b/src/extension.ts index 38044cc3f..f2dc267f5 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -37,6 +37,7 @@ import {ProgressHandle, DummyDisposable, reportProgress} from '@cmt/util'; import {DEFAULT_VARIANTS} from '@cmt/variant'; import {expandString, KitContextVars} from '@cmt/expand'; import paths from '@cmt/paths'; +import { CMakeDriver } from './drivers/driver'; nls.config({ messageFormat: nls.MessageFormat.bundle, bundleFormat: nls.BundleFormat.standalone })(); const localize: nls.LocalizeFunc = nls.loadMessageBundle(); @@ -414,11 +415,10 @@ class ExtensionManager implements vscode.Disposable { await telemetry.deactivate(); } - async configureInternal(trigger: ConfigureTrigger, cmt: CMakeTools): Promise { + async configureExtensionInternal(trigger: ConfigureTrigger, cmt: CMakeTools): Promise { if (!await this._ensureActiveConfigurePresetOrKit(cmt)) { return; } - await cmt.configureInternal(trigger, [], ConfigureType.Normal); } @@ -494,61 +494,67 @@ class ExtensionManager implements vscode.Disposable { {title: localize('not.now.button', 'Not now'), doConfigure: false} ); if (!chosen) { - // Do nothing. User cancelled - return; - } - const perist_message = chosen.doConfigure ? - localize('always.configure.on.open', 'Always configure projects upon opening?') : - localize('never.configure.on.open', 'Configure projects on opening?'); - const button_messages = chosen.doConfigure ? - [ localize('yes.button', 'Yes'), localize('no.button', 'No') ] : - [ localize('never.button', 'Never'), localize('never.for.this.workspace.button', 'Not this workspace') ]; - interface Choice2 { - title: string; - persistMode: 'user'|'workspace'; + // User cancelled. + should_configure = null; + } else { + const perist_message = chosen.doConfigure ? + localize('always.configure.on.open', 'Always configure projects upon opening?') : + localize('never.configure.on.open', 'Configure projects on opening?'); + const button_messages = chosen.doConfigure ? + [ localize('yes.button', 'Yes'), localize('no.button', 'No') ] : + [ localize('never.button', 'Never'), localize('never.for.this.workspace.button', 'Not this workspace') ]; + interface Choice2 { + title: string; + persistMode: 'user'|'workspace'; + } + const persist_pr + // Try to persist the user's selection to a `settings.json` + = vscode.window + .showInformationMessage( + perist_message, + {}, + {title: button_messages[0], persistMode: 'user'}, + {title: button_messages[1], persistMode: 'workspace'} + ) + .then(async choice => { + if (!choice) { + // Use cancelled. Do nothing. + return; + } + const config = vscode.workspace.getConfiguration(undefined, ws.uri); + let config_target = vscode.ConfigurationTarget.Global; + if (choice.persistMode === 'workspace') { + config_target = vscode.ConfigurationTarget.WorkspaceFolder; + } + await config.update('cmake.configureOnOpen', chosen.doConfigure, config_target); + }); + rollbar.takePromise(localize('persist.config.on.open.setting', 'Persist config-on-open setting'), {}, persist_pr); + should_configure = chosen.doConfigure; } - const persist_pr - // Try to persist the user's selection to a `settings.json` - = vscode.window - .showInformationMessage( - perist_message, - {}, - {title: button_messages[0], persistMode: 'user'}, - {title: button_messages[1], persistMode: 'workspace'} - ) - .then(async choice => { - if (!choice) { - // Use cancelled. Do nothing. - return; - } - const config = vscode.workspace.getConfiguration(undefined, ws.uri); - let config_target = vscode.ConfigurationTarget.Global; - if (choice.persistMode === 'workspace') { - config_target = vscode.ConfigurationTarget.WorkspaceFolder; - } - await config.update('cmake.configureOnOpen', chosen.doConfigure, config_target); - }); - rollbar.takePromise(localize('persist.config.on.open.setting', 'Persist config-on-open setting'), {}, persist_pr); - should_configure = chosen.doConfigure; - } - - if (should_configure) { + } + + if (should_configure === true) { // We've opened a new workspace folder, and the user wants us to // configure it now. log.debug(localize('configuring.workspace.on.open', 'Configuring workspace on open {0}', ws.uri.toString())); - await this.configureInternal(ConfigureTrigger.configureOnOpen, cmt); - } else if (silentScanForKitsNeeded) { - // This popup will show up the first time after deciding not to configure, if a version change has been detected - // in the kits definition. This may happen during a CMake Tools extension upgrade. - // The warning is emitted only once because scanForKitsIfNeeded returns true only once after such change, - // being tied to a global state variable. + await this.configureExtensionInternal(ConfigureTrigger.configureOnOpen, cmt); + } else { const configureButtonMessage = localize('configure.now.button', 'Configure Now'); - const result = await vscode.window.showWarningMessage(localize('configure.recommended', 'It is recommended to reconfigure after upgrading to a new kits definition.'), configureButtonMessage); + let result: string | undefined; + if (silentScanForKitsNeeded) { + // This popup will show up the first time after deciding not to configure, if a version change has been detected + // in the kits definition. This may happen during a CMake Tools extension upgrade. + // The warning is emitted only once because scanForKitsIfNeeded returns true only once after such change, + // being tied to a global state variable. + result = await vscode.window.showWarningMessage(localize('configure.recommended', 'It is recommended to reconfigure after upgrading to a new kits definition.'), configureButtonMessage); + } if (result === configureButtonMessage) { - await this.configureInternal(ConfigureTrigger.buttonNewKitsDefinition, cmt); + await this.configureExtensionInternal(ConfigureTrigger.buttonNewKitsDefinition, cmt); + } else { + log.debug(localize('using.cache.to.configure.workspace.on.open', 'Using cache to configure workspace on open {0}', ws.uri.toString())); + await this.configureExtensionInternal(ConfigureTrigger.configureOnOpen, cmt); } } - this._updateCodeModel(info); } @@ -644,10 +650,10 @@ class ExtensionManager implements vscode.Disposable { private cpptoolsNumFoldersReady: number = 0; private _updateCodeModel(folder: CMakeToolsFolder) { - const cmt = folder.cmakeTools; + const cmt: CMakeTools = folder.cmakeTools; this._projectOutlineProvider.updateCodeModel( cmt.workspaceContext.folder, - cmt.codeModel, + cmt.codeModelContent, { defaultTarget: cmt.defaultBuildTarget || undefined, launchTargetName: cmt.launchTargetName @@ -657,8 +663,8 @@ class ExtensionManager implements vscode.Disposable { if (!this._cppToolsAPI) { this._cppToolsAPI = await cpt.getCppToolsApi(cpt.Version.v5); } - if (this._cppToolsAPI && cmt.codeModel && (cmt.activeKit || cmt.configurePreset)) { - const codeModel = cmt.codeModel; + + if (this._cppToolsAPI && (cmt.activeKit || cmt.configurePreset)) { const cpptools = this._cppToolsAPI; let cache: CMakeCache; try { @@ -667,7 +673,7 @@ class ExtensionManager implements vscode.Disposable { rollbar.exception(localize('filed.to.open.cache.file.on.code.model.update', 'Failed to open CMake cache file on code model update'), e); return; } - const drv = await cmt.getCMakeDriverInstance(); + const drv: CMakeDriver | null = await cmt.getCMakeDriverInstance(); const env: Map = new Map(); const configureEnv = await drv?.getConfigureEnvironment(); if (configureEnv) { @@ -681,7 +687,22 @@ class ExtensionManager implements vscode.Disposable { const clCompilerPath = await findCLCompilerPath(env); this._configProvider.cpptoolsVersion = cpptools.getVersion(); - this._configProvider.updateConfigurationData({cache, codeModel, clCompilerPath, activeTarget: cmt.defaultBuildTarget, folder: cmt.folder.uri.fsPath}); + let codeModelContent; + if (cmt.codeModelContent) { + codeModelContent = cmt.codeModelContent; + this._configProvider.updateConfigurationData({ cache, codeModelContent, clCompilerPath, activeTarget: cmt.defaultBuildTarget, folder: cmt.folder.uri.fsPath }); + } else if (drv && drv.codeModelContent) { + codeModelContent = drv.codeModelContent; + this._configProvider.updateConfigurationData({ cache, codeModelContent, clCompilerPath, activeTarget: cmt.defaultBuildTarget, folder: cmt.folder.uri.fsPath }); + this._projectOutlineProvider.updateCodeModel( + cmt.workspaceContext.folder, + codeModelContent, + { + defaultTarget: cmt.defaultBuildTarget || undefined, + launchTargetName: cmt.launchTargetName + } + ); + } await this.ensureCppToolsProviderRegistered(); if (cpptools.notifyReady && this.cpptoolsNumFoldersReady < this._folders.size) { ++this.cpptoolsNumFoldersReady; diff --git a/test/unit-tests/cpptools.test.ts b/test/unit-tests/cpptools.test.ts index 0b76f27c4..3db12032e 100644 --- a/test/unit-tests/cpptools.test.ts +++ b/test/unit-tests/cpptools.test.ts @@ -157,7 +157,7 @@ suite('CppTools tests', () => { const cache = await CMakeCache.fromPath(getTestResourceFilePath('TestCMakeCache.txt')); const sourceFile = path.join(here, 'main.cpp'); const uri = vscode.Uri.file(sourceFile); - const codeModel: codemodel_api.CodeModelContent = { + const codeModelContent: codemodel_api.CodeModelContent = { configurations: [{ projects: [{ name: 'cpptools-test', @@ -189,13 +189,13 @@ suite('CppTools tests', () => { toolchains: new Map() }; - provider.updateConfigurationData({cache, codeModel, activeTarget: 'target1', folder: here}); + provider.updateConfigurationData({cache, codeModelContent, activeTarget: 'target1', folder: here}); // Update configuration with a 2nd workspace folder. const smokeFolder = path.join(here, '../smoke'); const sourceFile2 = path.join(smokeFolder, 'main.cpp'); const uri2 = vscode.Uri.file(sourceFile2); - const codeModel2: codemodel_api.CodeModelContent = { + const codeModelContent2: codemodel_api.CodeModelContent = { configurations: [{ projects: [{ name: 'cpptools-test2', @@ -215,7 +215,7 @@ suite('CppTools tests', () => { }], toolchains: new Map([['CXX', { path: 'path_from_toolchain_object' }]]) }; - provider.updateConfigurationData({cache, codeModel: codeModel2, activeTarget: 'target3', folder: smokeFolder}); + provider.updateConfigurationData({cache, codeModelContent: codeModelContent2, activeTarget: 'target3', folder: smokeFolder}); let configurations = await provider.provideConfigurations([vscode.Uri.file(sourceFile2)]); expect(configurations.length).to.eq(1); @@ -225,13 +225,13 @@ suite('CppTools tests', () => { expect(configurations.length).to.eq(1); expect(configurations[0].configuration.defines).to.contain('FLAG1'); - provider.updateConfigurationData({cache, codeModel, activeTarget: 'target2', folder: here}); + provider.updateConfigurationData({cache, codeModelContent, activeTarget: 'target2', folder: here}); configurations = await provider.provideConfigurations([uri]); expect(configurations.length).to.eq(1); expect(configurations[0].configuration.defines).to.contain('FLAG2'); expect(configurations[0].configuration.compilerPath).to.eq('clang++'); - provider.updateConfigurationData({cache, codeModel, activeTarget: 'all', folder: here}); + provider.updateConfigurationData({cache, codeModelContent, activeTarget: 'all', folder: here}); configurations = await provider.provideConfigurations([uri]); expect(configurations.length).to.eq(1); expect(configurations[0].configuration.defines.some(def => def === 'FLAG1' || def === 'FLAG2')).to.be.true; diff --git a/test/unit-tests/driver/driver-codemodel-tests.ts b/test/unit-tests/driver/driver-codemodel-tests.ts index bb34b2a27..13bf6580d 100644 --- a/test/unit-tests/driver/driver-codemodel-tests.ts +++ b/test/unit-tests/driver/driver-codemodel-tests.ts @@ -13,6 +13,7 @@ chai.use(chaiString); import {Kit, CMakeGenerator} from '@cmt/kit'; import {CMakeDriver, CMakePreconditionProblemSolver} from '@cmt/drivers/driver'; +import { LegacyCMakeDriver } from '@cmt/drivers/legacy-driver'; const here = __dirname; function getTestRootFilePath(filename: string): string { @@ -91,7 +92,7 @@ export function makeCodeModelDriverTestsuite( driver = await driver_generator(executable, config, kitDefault, workspaceFolder, async () => {}, []); let code_model: null|codemodel_api.CodeModelContent = null; - if (driver instanceof codemodel_api.CodeModelDriver) { + if (driver && !(driver instanceof LegacyCMakeDriver)) { driver.onCodeModelChanged(cm => { code_model = cm; }); } expect(await driver.configure(ConfigureTrigger.runTests, args)).to.be.eq(0); diff --git a/yarn.lock b/yarn.lock index 7e1fc2651..5550d6628 100644 --- a/yarn.lock +++ b/yarn.lock @@ -106,53 +106,53 @@ dependencies: "@octokit/types" "^6.0.3" -"@octokit/core@^3.2.3": - version "3.4.0" - resolved "https://registry.yarnpkg.com/@octokit/core/-/core-3.4.0.tgz#b48aa27d755b339fe7550548b340dcc2b513b742" - integrity sha512-6/vlKPP8NF17cgYXqucdshWqmMZGXkuvtcrWCgU5NOI0Pl2GjlmZyWgBMrU8zJ3v2MJlM6++CiB45VKYmhiWWg== +"@octokit/core@^3.5.0": + version "3.5.1" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-3.5.1.tgz#8601ceeb1ec0e1b1b8217b960a413ed8e947809b" + integrity sha512-omncwpLVxMP+GLpLPgeGJBF6IWJFjXDS5flY5VbppePYX9XehevbDykRH9PdCdvqt9TS5AOTiDide7h0qrkHjw== dependencies: "@octokit/auth-token" "^2.4.4" "@octokit/graphql" "^4.5.8" - "@octokit/request" "^5.4.12" + "@octokit/request" "^5.6.0" "@octokit/request-error" "^2.0.5" "@octokit/types" "^6.0.3" before-after-hook "^2.2.0" universal-user-agent "^6.0.0" "@octokit/endpoint@^6.0.1": - version "6.0.11" - resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-6.0.11.tgz#082adc2aebca6dcefa1fb383f5efb3ed081949d1" - integrity sha512-fUIPpx+pZyoLW4GCs3yMnlj2LfoXTWDUVPTC4V3MUEKZm48W+XYpeWSZCv+vYF1ZABUm2CqnDVf1sFtIYrj7KQ== + version "6.0.12" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-6.0.12.tgz#3b4d47a4b0e79b1027fb8d75d4221928b2d05658" + integrity sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA== dependencies: "@octokit/types" "^6.0.3" is-plain-object "^5.0.0" universal-user-agent "^6.0.0" "@octokit/graphql@^4.5.8": - version "4.6.2" - resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-4.6.2.tgz#ec44abdfa87f2b9233282136ae33e4ba446a04e7" - integrity sha512-WmsIR1OzOr/3IqfG9JIczI8gMJUMzzyx5j0XXQ4YihHtKlQc+u35VpVoOXhlKAlaBntvry1WpAzPl/a+s3n89Q== + version "4.6.4" + resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-4.6.4.tgz#0c3f5bed440822182e972317122acb65d311a5ed" + integrity sha512-SWTdXsVheRmlotWNjKzPOb6Js6tjSqA2a8z9+glDJng0Aqjzti8MEWOtuT8ZSu6wHnci7LZNuarE87+WJBG4vg== dependencies: - "@octokit/request" "^5.3.0" + "@octokit/request" "^5.6.0" "@octokit/types" "^6.0.3" universal-user-agent "^6.0.0" -"@octokit/openapi-types@^7.2.3": - version "7.3.0" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-7.3.0.tgz#1d9ed79828513c57a95e6360b7c9b4749503e79d" - integrity sha512-o00X2FCLiEeXZkm1Ab5nvPUdVOlrpediwWZkpizUJ/xtZQsJ4FiQ2RB/dJEmb0Nk+NIz7zyDePcSCu/Y/0M3Ew== +"@octokit/openapi-types@^7.3.2": + version "7.3.2" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-7.3.2.tgz#065ce49b338043ec7f741316ce06afd4d459d944" + integrity sha512-oJhK/yhl9Gt430OrZOzAl2wJqR0No9445vmZ9Ey8GjUZUpwuu/vmEFP0TDhDXdpGDoxD6/EIFHJEcY8nHXpDTA== "@octokit/plugin-paginate-rest@^2.6.2": - version "2.13.3" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.13.3.tgz#f0f1792230805108762d87906fb02d573b9e070a" - integrity sha512-46lptzM9lTeSmIBt/sVP/FLSTPGx6DCzAdSX3PfeJ3mTf4h9sGC26WpaQzMEq/Z44cOcmx8VsOhO+uEgE3cjYg== + version "2.13.5" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.13.5.tgz#e459f9b5dccbe0a53f039a355d5b80c0a2b0dc57" + integrity sha512-3WSAKBLa1RaR/7GG+LQR/tAZ9fp9H9waE9aPXallidyci9oZsfgsLn5M836d3LuDC6Fcym+2idRTBpssHZePVg== dependencies: - "@octokit/types" "^6.11.0" + "@octokit/types" "^6.13.0" "@octokit/plugin-request-log@^1.0.2": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.3.tgz#70a62be213e1edc04bb8897ee48c311482f9700d" - integrity sha512-4RFU4li238jMJAzLgAwkBAw+4Loile5haQMQr+uhFq27BmyJXcXSKvoQKqh0agsZEiUlW6iSv3FAgvmGkur7OQ== + version "1.0.4" + resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz#5e50ed7083a613816b1e4a28aeec5fb7f1462e85" + integrity sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA== "@octokit/plugin-rest-endpoint-methods@5.3.1": version "5.3.1" @@ -162,43 +162,43 @@ "@octokit/types" "^6.16.2" deprecation "^2.3.1" -"@octokit/request-error@^2.0.0", "@octokit/request-error@^2.0.5": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-2.0.5.tgz#72cc91edc870281ad583a42619256b380c600143" - integrity sha512-T/2wcCFyM7SkXzNoyVNWjyVlUwBvW3igM3Btr/eKYiPmucXTtkxt2RBsf6gn3LTzaLSLTQtNmvg+dGsOxQrjZg== +"@octokit/request-error@^2.0.5", "@octokit/request-error@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-2.1.0.tgz#9e150357831bfc788d13a4fd4b1913d60c74d677" + integrity sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg== dependencies: "@octokit/types" "^6.0.3" deprecation "^2.0.0" once "^1.4.0" -"@octokit/request@^5.3.0", "@octokit/request@^5.4.12": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.5.0.tgz#6588c532255b8e71886cefa0d2b64b4ad73bf18c" - integrity sha512-jxbMLQdQ3heFMZUaTLSCqcKs2oAHEYh7SnLLXyxbZmlULExZ/RXai7QUWWFKowcGGPlCZuKTZg0gSKHWrfYEoQ== +"@octokit/request@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.6.0.tgz#6084861b6e4fa21dc40c8e2a739ec5eff597e672" + integrity sha512-4cPp/N+NqmaGQwbh3vUsYqokQIzt7VjsgTYVXiwpUP2pxd5YiZB2XuTedbb0SPtv9XS7nzAKjAuQxmY8/aZkiA== dependencies: "@octokit/endpoint" "^6.0.1" - "@octokit/request-error" "^2.0.0" + "@octokit/request-error" "^2.1.0" "@octokit/types" "^6.16.1" is-plain-object "^5.0.0" node-fetch "^2.6.1" universal-user-agent "^6.0.0" "@octokit/rest@^18.1.1": - version "18.5.6" - resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-18.5.6.tgz#8c9a7c9329c7bbf478af20df78ddeab0d21f6d89" - integrity sha512-8HdG6ZjQdZytU6tCt8BQ2XLC7EJ5m4RrbyU/EARSkAM1/HP3ceOzMG/9atEfe17EDMer3IVdHWLedz2wDi73YQ== + version "18.6.0" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-18.6.0.tgz#9a8457374c78c2773d3ab3f50aaffc62f3ed4f76" + integrity sha512-MdHuXHDJM7e5sUBe3K9tt7th0cs4csKU5Bb52LRi2oHAeIMrMZ4XqaTrEv660HoUPoM1iDlnj27Ab/Nh3MtwlA== dependencies: - "@octokit/core" "^3.2.3" + "@octokit/core" "^3.5.0" "@octokit/plugin-paginate-rest" "^2.6.2" "@octokit/plugin-request-log" "^1.0.2" "@octokit/plugin-rest-endpoint-methods" "5.3.1" -"@octokit/types@^6.0.3", "@octokit/types@^6.11.0", "@octokit/types@^6.16.1", "@octokit/types@^6.16.2": - version "6.16.2" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.16.2.tgz#62242e0565a3eb99ca2fd376283fe78b4ea057b4" - integrity sha512-wWPSynU4oLy3i4KGyk+J1BLwRKyoeW2TwRHgwbDz17WtVFzSK2GOErGliruIx8c+MaYtHSYTx36DSmLNoNbtgA== +"@octokit/types@^6.0.3", "@octokit/types@^6.13.0", "@octokit/types@^6.16.1", "@octokit/types@^6.16.2": + version "6.16.4" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.16.4.tgz#d24f5e1bacd2fe96d61854b5bda0e88cf8288dfe" + integrity sha512-UxhWCdSzloULfUyamfOg4dJxV9B+XjgrIZscI0VCbp4eNrjmorGEw+4qdwcpTsu6DIrm9tQsFQS2pK5QkqQ04A== dependencies: - "@octokit/openapi-types" "^7.2.3" + "@octokit/openapi-types" "^7.3.2" "@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0", "@sinonjs/commons@^1.8.1": version "1.8.3" @@ -374,20 +374,20 @@ "@types/node" "*" "@typescript-eslint/eslint-plugin-tslint@^4.22.1": - version "4.26.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin-tslint/-/eslint-plugin-tslint-4.26.1.tgz#6188bf9b967abed153da4ad96b55edbd00fc30b2" - integrity sha512-hkfDEEQRZxFs0lSdOEvzErWCZgFfPY3vjhPCG4yCrYR5mvqLho9IbL8pTqLZh6oC+WX8PNeeNVfp5oRVdOSTTA== + version "4.27.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin-tslint/-/eslint-plugin-tslint-4.27.0.tgz#e9f594d099f6c76b92eb93e824b0be04c4850bfb" + integrity sha512-IKgnBSztNNrzjVUH8wO49IxR6qWnA3SpwqV5rTGF5AnC6AweKS5rj9mFXVqzTezF/JfwqPLJGjMee4r5daNOTw== dependencies: - "@typescript-eslint/experimental-utils" "4.26.1" + "@typescript-eslint/experimental-utils" "4.27.0" lodash "^4.17.21" "@typescript-eslint/eslint-plugin@^4.22.1": - version "4.26.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.26.1.tgz#b9c7313321cb837e2bf8bebe7acc2220659e67d3" - integrity sha512-aoIusj/8CR+xDWmZxARivZjbMBQTT9dImUtdZ8tVCVRXgBUuuZyM5Of5A9D9arQPxbi/0rlJLcuArclz/rCMJw== + version "4.27.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.27.0.tgz#0b7fc974e8bc9b2b5eb98ed51427b0be529b4ad0" + integrity sha512-DsLqxeUfLVNp3AO7PC3JyaddmEHTtI9qTSAs+RB6ja27QvIM0TA8Cizn1qcS6vOu+WDLFJzkwkgweiyFhssDdQ== dependencies: - "@typescript-eslint/experimental-utils" "4.26.1" - "@typescript-eslint/scope-manager" "4.26.1" + "@typescript-eslint/experimental-utils" "4.27.0" + "@typescript-eslint/scope-manager" "4.27.0" debug "^4.3.1" functional-red-black-tree "^1.0.1" lodash "^4.17.21" @@ -395,60 +395,60 @@ semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/experimental-utils@4.26.1": - version "4.26.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.26.1.tgz#a35980a2390da9232aa206b27f620eab66e94142" - integrity sha512-sQHBugRhrXzRCs9PaGg6rowie4i8s/iD/DpTB+EXte8OMDfdCG5TvO73XlO9Wc/zi0uyN4qOmX9hIjQEyhnbmQ== +"@typescript-eslint/experimental-utils@4.27.0": + version "4.27.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.27.0.tgz#78192a616472d199f084eab8f10f962c0757cd1c" + integrity sha512-n5NlbnmzT2MXlyT+Y0Jf0gsmAQzCnQSWXKy4RGSXVStjDvS5we9IWbh7qRVKdGcxT0WYlgcCYUK/HRg7xFhvjQ== dependencies: "@types/json-schema" "^7.0.7" - "@typescript-eslint/scope-manager" "4.26.1" - "@typescript-eslint/types" "4.26.1" - "@typescript-eslint/typescript-estree" "4.26.1" + "@typescript-eslint/scope-manager" "4.27.0" + "@typescript-eslint/types" "4.27.0" + "@typescript-eslint/typescript-estree" "4.27.0" eslint-scope "^5.1.1" eslint-utils "^3.0.0" "@typescript-eslint/parser@^4.22.1": - version "4.26.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.26.1.tgz#cecfdd5eb7a5c13aabce1c1cfd7fbafb5a0f1e8e" - integrity sha512-q7F3zSo/nU6YJpPJvQveVlIIzx9/wu75lr6oDbDzoeIRWxpoc/HQ43G4rmMoCc5my/3uSj2VEpg/D83LYZF5HQ== + version "4.27.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.27.0.tgz#85447e573364bce4c46c7f64abaa4985aadf5a94" + integrity sha512-XpbxL+M+gClmJcJ5kHnUpBGmlGdgNvy6cehgR6ufyxkEJMGP25tZKCaKyC0W/JVpuhU3VU1RBn7SYUPKSMqQvQ== dependencies: - "@typescript-eslint/scope-manager" "4.26.1" - "@typescript-eslint/types" "4.26.1" - "@typescript-eslint/typescript-estree" "4.26.1" + "@typescript-eslint/scope-manager" "4.27.0" + "@typescript-eslint/types" "4.27.0" + "@typescript-eslint/typescript-estree" "4.27.0" debug "^4.3.1" -"@typescript-eslint/scope-manager@4.26.1": - version "4.26.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.26.1.tgz#075a74a15ff33ee3a7ed33e5fce16ee86689f662" - integrity sha512-TW1X2p62FQ8Rlne+WEShyd7ac2LA6o27S9i131W4NwDSfyeVlQWhw8ylldNNS8JG6oJB9Ha9Xyc+IUcqipvheQ== +"@typescript-eslint/scope-manager@4.27.0": + version "4.27.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.27.0.tgz#b0b1de2b35aaf7f532e89c8e81d0fa298cae327d" + integrity sha512-DY73jK6SEH6UDdzc6maF19AHQJBFVRf6fgAXHPXCGEmpqD4vYgPEzqpFz1lf/daSbOcMpPPj9tyXXDPW2XReAw== dependencies: - "@typescript-eslint/types" "4.26.1" - "@typescript-eslint/visitor-keys" "4.26.1" + "@typescript-eslint/types" "4.27.0" + "@typescript-eslint/visitor-keys" "4.27.0" -"@typescript-eslint/types@4.26.1": - version "4.26.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.26.1.tgz#9e7c523f73c34b04a765e4167ca5650436ef1d38" - integrity sha512-STyMPxR3cS+LaNvS8yK15rb8Y0iL0tFXq0uyl6gY45glyI7w0CsyqyEXl/Fa0JlQy+pVANeK3sbwPneCbWE7yg== +"@typescript-eslint/types@4.27.0": + version "4.27.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.27.0.tgz#712b408519ed699baff69086bc59cd2fc13df8d8" + integrity sha512-I4ps3SCPFCKclRcvnsVA/7sWzh7naaM/b4pBO2hVxnM3wrU51Lveybdw5WoIktU/V4KfXrTt94V9b065b/0+wA== -"@typescript-eslint/typescript-estree@4.26.1": - version "4.26.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.26.1.tgz#b2ce2e789233d62283fae2c16baabd4f1dbc9633" - integrity sha512-l3ZXob+h0NQzz80lBGaykdScYaiEbFqznEs99uwzm8fPHhDjwaBFfQkjUC/slw6Sm7npFL8qrGEAMxcfBsBJUg== +"@typescript-eslint/typescript-estree@4.27.0": + version "4.27.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.27.0.tgz#189a7b9f1d0717d5cccdcc17247692dedf7a09da" + integrity sha512-KH03GUsUj41sRLLEy2JHstnezgpS5VNhrJouRdmh6yNdQ+yl8w5LrSwBkExM+jWwCJa7Ct2c8yl8NdtNRyQO6g== dependencies: - "@typescript-eslint/types" "4.26.1" - "@typescript-eslint/visitor-keys" "4.26.1" + "@typescript-eslint/types" "4.27.0" + "@typescript-eslint/visitor-keys" "4.27.0" debug "^4.3.1" globby "^11.0.3" is-glob "^4.0.1" semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/visitor-keys@4.26.1": - version "4.26.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.26.1.tgz#0d55ea735cb0d8903b198017d6d4f518fdaac546" - integrity sha512-IGouNSSd+6x/fHtYRyLOM6/C+QxMDzWlDtN41ea+flWuSF9g02iqcIlX8wM53JkfljoIjP0U+yp7SiTS1onEkw== +"@typescript-eslint/visitor-keys@4.27.0": + version "4.27.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.27.0.tgz#f56138b993ec822793e7ebcfac6ffdce0a60cb81" + integrity sha512-es0GRYNZp0ieckZ938cEANfEhsfHrzuLrePukLKtY3/KPXcq1Xd555Mno9/GOgXhKzn0QfkDLVgqWO3dGY80bg== dependencies: - "@typescript-eslint/types" "4.26.1" + "@typescript-eslint/types" "4.27.0" eslint-visitor-keys "^2.0.0" "@ungap/promise-all-settled@1.1.2": @@ -620,9 +620,9 @@ acorn@^7.1.1, acorn@^7.4.0: integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== acorn@^8.2.1: - version "8.3.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.3.0.tgz#1193f9b96c4e8232f00b11a9edff81b2c8b98b88" - integrity sha512-tqPKHZ5CaBJw0Xmy0ZZvLs1qTV+BNFSyvn77ASXkpBNfIRk8ev26fKrD9iLGwGA9zedPao52GSHzq8lyZG0NUw== + version "8.4.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.4.0.tgz#af53266e698d7cffa416714b503066a82221be60" + integrity sha512-ULr0LDaEqQrMFGyQ3bhJkLsbtrQ8QibAseGZeaSUiT/6zb9IvIkomWHJIvgvwad+hinRAgsI51JcWk2yvwyL+w== agent-base@6: version "6.0.2" @@ -744,7 +744,7 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" -anymatch@~3.1.1: +anymatch@~3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== @@ -1138,9 +1138,9 @@ camelcase@^6.0.0: integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== caniuse-lite@^1.0.30001219: - version "1.0.30001236" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001236.tgz#0a80de4cdf62e1770bb46a30d884fc8d633e3958" - integrity sha512-o0PRQSrSCGJKCPZcgMzl5fUaj5xHe8qA2m4QRvnyY4e1lITqoNkr7q/Oh1NcpGSy0Th97UZ35yoKcINPoq7YOQ== + version "1.0.30001237" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001237.tgz#4b7783661515b8e7151fc6376cfd97f0e427b9e5" + integrity sha512-pDHgRndit6p1NR2GhzMbQ6CkRrp4VKuSsqbcLeOQppYPKOYkKT/6ZvZDvKJUqcmtyWIAHuZq3SVS2vc1egCZzw== chai-as-promised@^7.1.1: version "7.1.1" @@ -1201,19 +1201,19 @@ check-error@^1.0.2: integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= chokidar@3.5.1, chokidar@^2.0.0, chokidar@^3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" - integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== + version "3.5.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" + integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== dependencies: - anymatch "~3.1.1" + anymatch "~3.1.2" braces "~3.0.2" - glob-parent "~5.1.0" + glob-parent "~5.1.2" is-binary-path "~2.1.0" is-glob "~4.0.1" normalize-path "~3.0.0" - readdirp "~3.5.0" + readdirp "~3.6.0" optionalDependencies: - fsevents "~2.3.1" + fsevents "~2.3.2" chrome-trace-event@^1.0.2: version "1.0.3" @@ -1683,9 +1683,9 @@ each-props@^1.3.2: object.defaults "^1.1.0" electron-to-chromium@^1.3.723: - version "1.3.751" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.751.tgz#e0776481f7a62db61d7bb2132b9627398d54c4e9" - integrity sha512-+qEPTSrwAwfHiavFmbTJ8np1NUYFmeXaDUxIj1+x1zOsYDBgWnl5Z8GeVZqis1Ljp4BlRqoZygRsez2Lg9DJgw== + version "1.3.752" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.752.tgz#0728587f1b9b970ec9ffad932496429aef750d09" + integrity sha512-2Tg+7jSl3oPxgsBsWKh5H83QazTkmWG/cnNwJplmyZc7KcN61+I10oUgaXSVk/NwfvN3BdkKDR4FYuRBQQ2v0A== emitter-listener@^1.0.1, emitter-listener@^1.1.1: version "1.1.2" @@ -2454,7 +2454,7 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@~2.3.1: +fsevents@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== @@ -2518,7 +2518,7 @@ git-config-path@^2.0.0: resolved "https://registry.yarnpkg.com/git-config-path/-/git-config-path-2.0.0.tgz#62633d61af63af4405a5024efd325762f58a181b" integrity sha512-qc8h1KIQbJpp+241id3GuAtkdyJ+IK+LIVtkiFTRKRrmddDzs3SI9CvP1QYmWBFvm1I/PWRwj//of8bgAc0ltA== -glob-parent@^3.1.0, glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@^5.1.2, glob-parent@~5.1.0: +glob-parent@^3.1.0, glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -2618,9 +2618,9 @@ globals@^13.6.0, globals@^13.9.0: type-fest "^0.20.2" globby@^11.0.3: - version "11.0.3" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.3.tgz#9b1f0cb523e171dd1ad8c7b2a9fb4b644b9593cb" - integrity sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg== + version "11.0.4" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" + integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== dependencies: array-union "^2.1.0" dir-glob "^3.0.1" @@ -3593,7 +3593,7 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -marked@^2.0.3: +marked@~2.0.3: version "2.0.7" resolved "https://registry.yarnpkg.com/marked/-/marked-2.0.7.tgz#bc5b857a09071b48ce82a1f7304913a993d4b7d1" integrity sha512-BJXxkuIfJchcXOJWTT2DOL+yFWifFv2yGYOUzvXg8Qz610QKw+sHCvTMYwA+qWGhlA2uivBezChZ/pBy1tWdkQ== @@ -4326,9 +4326,9 @@ posix-character-classes@^0.1.0: integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= postcss@^7.0.16, postcss@^8.2.10: - version "8.3.1" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.1.tgz#71f380151c227f83b898294a46481f689f86b70a" - integrity sha512-9qH0MGjsSm+fjxOi3GnwViL1otfi7qkj+l/WX5gcRGmZNGsIcqc+A5fBkE6PUobEQK4APqYVaES+B3Uti98TCw== + version "8.3.5" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.5.tgz#982216b113412bc20a86289e91eb994952a5b709" + integrity sha512-NxTuJocUhYGsMiMFHDUkmjSKT3EdH4/WbGF6GCi1NDGk+vbcUTun4fpbOqaPtD8IIsztA2ilZm2DhYCuyN58gA== dependencies: colorette "^1.2.2" nanoid "^3.1.23" @@ -4454,10 +4454,10 @@ readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable string_decoder "~1.1.1" util-deprecate "~1.0.1" -readdirp@~3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" - integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" @@ -4489,9 +4489,9 @@ regexpp@^2.0.1: integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== regexpp@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" - integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== + version "3.2.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== regextras@^0.7.1: version "0.7.1" @@ -5475,16 +5475,16 @@ typedoc-default-themes@^0.12.10: integrity sha512-fIS001cAYHkyQPidWXmHuhs8usjP5XVJjWB8oZGqkTowZaz3v7g3KDZeeqE82FBrmkAnIBOY3jgy7lnPnqATbA== typedoc@^0.20.36: - version "0.20.36" - resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.20.36.tgz#ee5523c32f566ad8283fc732aa8ea322d1a45f6a" - integrity sha512-qFU+DWMV/hifQ9ZAlTjdFO9wbUIHuUBpNXzv68ZyURAP9pInjZiO4+jCPeAzHVcaBCHER9WL/+YzzTt6ZlN/Nw== + version "0.20.37" + resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.20.37.tgz#9b9417149cb815e3d569fc300b5d2c6e4e6c5d93" + integrity sha512-9+qDhdc4X00qTNOtii6QX2z7ndAeWVOso7w3MPSoSJdXlVhpwPfm1yEp4ooKuWA9fiQILR8FKkyjmeqa13hBbw== dependencies: colors "^1.4.0" fs-extra "^9.1.0" handlebars "^4.7.7" lodash "^4.17.21" lunr "^2.3.9" - marked "^2.0.3" + marked "~2.0.3" minimatch "^3.0.0" progress "^2.0.3" shelljs "^0.8.4" @@ -5492,14 +5492,14 @@ typedoc@^0.20.36: typedoc-default-themes "^0.12.10" typescript@^3.9.5: - version "3.9.9" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.9.tgz#e69905c54bc0681d0518bd4d587cc6f2d0b1a674" - integrity sha512-kdMjTiekY+z/ubJCATUPlRDl39vXYiMV9iyeMuEuXZh2we6zz80uovNN2WlAxmmdE/Z/YQe+EbOEXB5RHEED3w== + version "3.9.10" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.10.tgz#70f3910ac7a51ed6bef79da7800690b19bf778b8" + integrity sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q== typescript@^4.1.5: - version "4.3.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.2.tgz#399ab18aac45802d6f2498de5054fcbbe716a805" - integrity sha512-zZ4hShnmnoVnAHpVHWpTcxdv7dWP60S2FsydQLV8V5PbS3FifjWFFRiHSWpDJahly88PRyV5teTSLoq4eG7mKw== + version "4.3.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.4.tgz#3f85b986945bcf31071decdd96cf8bfa65f9dcbc" + integrity sha512-uauPG7XZn9F/mo+7MrsRjyvbxFpzemRjKEZXS4AK83oP2KKOJPvb+9cO/gmnv8arWZvhnjVOXz7B49m1l0e9Ew== uglify-js@^3.1.4: version "3.13.9" @@ -5783,9 +5783,9 @@ webpack-sources@^2.3.0: source-map "^0.6.1" webpack@^5.38.1: - version "5.38.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.38.1.tgz#5224c7f24c18e729268d3e3bc97240d6e880258e" - integrity sha512-OqRmYD1OJbHZph6RUMD93GcCZy4Z4wC0ele4FXyYF0J6AxO1vOSuIlU1hkS/lDlR9CDYBz64MZRmdbdnFFoT2g== + version "5.39.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.39.1.tgz#d1e014b6d71e1aef385316ad528f21cd5b1f9784" + integrity sha512-ulOvoNCh2PvTUa+zbpRuEb1VPeQnhxpnHleMPVVCq3QqnaFogjsLyps+o42OviQFoaGtTQYrUqDXu1QNkvUPzw== dependencies: "@types/eslint-scope" "^3.7.0" "@types/estree" "^0.0.47"