@difizen/mana-core
Version:
173 lines (153 loc) • 5.53 kB
text/typescript
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { Emitter } from '@difizen/mana-common';
import type { Event } from '@difizen/mana-common';
import { singleton } from '@difizen/mana-syringe';
import type { IDisposable } from '../../../utils/lifecycle';
import { VSDisposable } from '../../../utils/lifecycle';
import { Registry } from '../platform';
import {
ConfigurationTarget,
isConfigurationOverrides,
IConfigurationService,
} from './configuration';
import type {
IConfigurationChangeEvent,
IConfigurationOverrides,
IConfigurationData,
IConfigurationValue,
IConfigurationChange,
} from './configuration';
import {
DefaultConfigurationModel,
Configuration,
ConfigurationModel,
ConfigurationChangeEvent,
UserSettings,
} from './configurationModels';
import { Extensions } from './configurationRegistry';
import type { IConfigurationRegistry } from './configurationRegistry';
({ contrib: IConfigurationService })
export class ConfigurationService
extends VSDisposable
implements IConfigurationService, IDisposable
{
readonly _serviceBrand: undefined;
private configuration: Configuration;
private userConfiguration: UserSettings;
private readonly _onDidChangeConfiguration: Emitter<IConfigurationChangeEvent> =
this._register(new Emitter<IConfigurationChangeEvent>());
readonly onDidChangeConfiguration: Event<IConfigurationChangeEvent> =
this._onDidChangeConfiguration.event;
constructor() {
super();
this.userConfiguration = this._register(new UserSettings(undefined));
this.configuration = new Configuration(
new DefaultConfigurationModel(),
new ConfigurationModel(),
);
this._register(
Registry.as<IConfigurationRegistry>(
Extensions.Configuration,
).onDidUpdateConfiguration((configurationProperties) =>
this.onDidDefaultConfigurationChange(configurationProperties),
),
);
}
async initialize(): Promise<void> {
const userConfiguration = await this.userConfiguration.loadConfiguration();
this.configuration = new Configuration(
new DefaultConfigurationModel(),
userConfiguration,
);
}
getConfigurationData(): IConfigurationData {
return this.configuration.toData();
}
getValue<T>(): T;
getValue<T>(section: string): T;
getValue<T>(overrides: IConfigurationOverrides): T;
getValue<T>(section: string, overrides: IConfigurationOverrides): T;
getValue(arg1?: any, arg2?: any): any {
const section = typeof arg1 === 'string' ? arg1 : undefined;
const overrides = isConfigurationOverrides(arg1)
? arg1
: isConfigurationOverrides(arg2)
? arg2
: {};
return this.configuration.getValue(section, overrides, undefined);
}
updateValue(key: string, value: any): Promise<void>;
updateValue(
key: string,
value: any,
overrides: IConfigurationOverrides,
): Promise<void>;
updateValue(key: string, value: any, target: ConfigurationTarget): Promise<void>;
updateValue(
key: string,
value: any,
overrides: IConfigurationOverrides,
target: ConfigurationTarget,
): Promise<void>;
updateValue(_key: string, _value: any, _arg3?: any, _arg4?: any): Promise<void> {
return Promise.reject(new Error('not supported'));
}
inspect<T>(key: string): IConfigurationValue<T> {
return this.configuration.inspect<T>(key, {}, undefined);
}
keys(): {
default: string[];
user: string[];
workspace: string[];
workspaceFolder: string[];
} {
return this.configuration.keys(undefined);
}
async reloadConfiguration(): Promise<void> {
const configurationModel = await this.userConfiguration.loadConfiguration();
this.onDidChangeUserConfiguration(configurationModel);
}
private onDidChangeUserConfiguration(
userConfigurationModel: ConfigurationModel,
): void {
const previous = this.configuration.toData();
const change =
this.configuration.compareAndUpdateLocalUserConfiguration(userConfigurationModel);
this.trigger(change, previous, ConfigurationTarget.USER);
}
private onDidDefaultConfigurationChange(keys: string[]): void {
const previous = this.configuration.toData();
const change = this.configuration.compareAndUpdateDefaultConfiguration(
new DefaultConfigurationModel(),
keys,
);
this.trigger(change, previous, ConfigurationTarget.DEFAULT);
}
private trigger(
configurationChange: IConfigurationChange,
previous: IConfigurationData,
source: ConfigurationTarget,
): void {
const event = new ConfigurationChangeEvent(
configurationChange,
{ data: previous },
this.configuration,
);
event.source = source;
event.sourceConfig = this.getTargetConfiguration(source);
this._onDidChangeConfiguration.fire(event);
}
private getTargetConfiguration(target: ConfigurationTarget): any {
// eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check
switch (target) {
case ConfigurationTarget.DEFAULT:
return this.configuration.defaults.contents;
case ConfigurationTarget.USER:
return this.configuration.localUserConfiguration.contents;
}
return {};
}
}