sussudio
Version:
An unofficial VS Code Internal API
90 lines (89 loc) • 5.36 kB
JavaScript
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { RunOnceScheduler } from "../../../base/common/async.mjs";
import { Emitter } from "../../../base/common/event.mjs";
import { Disposable } from "../../../base/common/lifecycle.mjs";
import { extUriBiasedIgnorePathCase } from "../../../base/common/resources.mjs";
import { isConfigurationOverrides } from "./configuration.mjs";
import { Configuration, ConfigurationChangeEvent, ConfigurationModel, UserSettings } from "./configurationModels.mjs";
import { DefaultConfiguration, NullPolicyConfiguration, PolicyConfiguration } from "./configurations.mjs";
import { NullPolicyService } from "../../policy/common/policy.mjs";
export class ConfigurationService extends Disposable {
settingsResource;
configuration;
defaultConfiguration;
policyConfiguration;
userConfiguration;
reloadConfigurationScheduler;
_onDidChangeConfiguration = this._register(new Emitter());
onDidChangeConfiguration = this._onDidChangeConfiguration.event;
constructor(settingsResource, fileService, policyService, logService) {
super();
this.settingsResource = settingsResource;
this.defaultConfiguration = this._register(new DefaultConfiguration());
this.policyConfiguration = policyService instanceof NullPolicyService ? new NullPolicyConfiguration() : this._register(new PolicyConfiguration(this.defaultConfiguration, policyService, logService));
this.userConfiguration = this._register(new UserSettings(this.settingsResource, undefined, extUriBiasedIgnorePathCase, fileService));
this.configuration = new Configuration(this.defaultConfiguration.configurationModel, this.policyConfiguration.configurationModel, new ConfigurationModel(), new ConfigurationModel());
this.reloadConfigurationScheduler = this._register(new RunOnceScheduler(() => this.reloadConfiguration(), 50));
this._register(this.defaultConfiguration.onDidChangeConfiguration(({ defaults, properties }) => this.onDidDefaultConfigurationChange(defaults, properties)));
this._register(this.policyConfiguration.onDidChangeConfiguration(model => this.onDidPolicyConfigurationChange(model)));
this._register(this.userConfiguration.onDidChange(() => this.reloadConfigurationScheduler.schedule()));
}
async initialize() {
const [defaultModel, policyModel, userModel] = await Promise.all([this.defaultConfiguration.initialize(), this.policyConfiguration.initialize(), this.userConfiguration.loadConfiguration()]);
this.configuration = new Configuration(defaultModel, policyModel, new ConfigurationModel(), userModel);
}
getConfigurationData() {
return this.configuration.toData();
}
getValue(arg1, arg2) {
const section = typeof arg1 === 'string' ? arg1 : undefined;
const overrides = isConfigurationOverrides(arg1) ? arg1 : isConfigurationOverrides(arg2) ? arg2 : {};
return this.configuration.getValue(section, overrides, undefined);
}
updateValue(key, value, arg3, arg4) {
return Promise.reject(new Error('not supported'));
}
inspect(key) {
return this.configuration.inspect(key, {}, undefined);
}
keys() {
return this.configuration.keys(undefined);
}
async reloadConfiguration() {
const configurationModel = await this.userConfiguration.loadConfiguration();
this.onDidChangeUserConfiguration(configurationModel);
}
onDidChangeUserConfiguration(userConfigurationModel) {
const previous = this.configuration.toData();
const change = this.configuration.compareAndUpdateLocalUserConfiguration(userConfigurationModel);
this.trigger(change, previous, 2 /* ConfigurationTarget.USER */);
}
onDidDefaultConfigurationChange(defaultConfigurationModel, properties) {
const previous = this.configuration.toData();
const change = this.configuration.compareAndUpdateDefaultConfiguration(defaultConfigurationModel, properties);
this.trigger(change, previous, 7 /* ConfigurationTarget.DEFAULT */);
}
onDidPolicyConfigurationChange(policyConfiguration) {
const previous = this.configuration.toData();
const change = this.configuration.compareAndUpdatePolicyConfiguration(policyConfiguration);
this.trigger(change, previous, 7 /* ConfigurationTarget.DEFAULT */);
}
trigger(configurationChange, previous, source) {
const event = new ConfigurationChangeEvent(configurationChange, { data: previous }, this.configuration);
event.source = source;
event.sourceConfig = this.getTargetConfiguration(source);
this._onDidChangeConfiguration.fire(event);
}
getTargetConfiguration(target) {
switch (target) {
case 7 /* ConfigurationTarget.DEFAULT */:
return this.configuration.defaults.contents;
case 2 /* ConfigurationTarget.USER */:
return this.configuration.localUserConfiguration.contents;
}
return {};
}
}