@theia/core
Version:
Theia is a cloud & desktop IDE framework implemented in TypeScript.
148 lines • 5.86 kB
JavaScript
;
// *****************************************************************************
// Copyright (C) 2018 Ericsson and others.
//
// This program and the accompanying materials are made available under the
// terms of the Eclipse Public License v. 2.0 which is available at
// http://www.eclipse.org/legal/epl-2.0.
//
// This Source Code may also be made available under the following Secondary
// Licenses when the conditions for such availability set forth in the Eclipse
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
// with the GNU Classpath Exception which is available at
// https://www.gnu.org/software/classpath/license.html.
//
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
// *****************************************************************************
Object.defineProperty(exports, "__esModule", { value: true });
exports.PreferenceProviderImpl = exports.PreferenceProviderBase = void 0;
const tslib_1 = require("tslib");
const debounce = require("p-debounce");
const inversify_1 = require("inversify");
const common_1 = require("../../common");
const promise_util_1 = require("../../common/promise-util");
class PreferenceProviderBase {
constructor() {
this.onDidPreferencesChangedEmitter = new common_1.Emitter();
this.onDidPreferencesChanged = this.onDidPreferencesChangedEmitter.event;
this.toDispose = new common_1.DisposableCollection();
this.fireDidPreferencesChanged = debounce(() => {
const changes = this.deferredChanges;
this.deferredChanges = undefined;
if (changes && Object.keys(changes).length) {
this.onDidPreferencesChangedEmitter.fire(changes);
return true;
}
return false;
}, 0);
this.toDispose.push(this.onDidPreferencesChangedEmitter);
}
/**
* Informs the listeners that one or more preferences of this provider are changed.
* The listeners are able to find what was changed from the emitted event.
*/
emitPreferencesChangedEvent(changes) {
if (Array.isArray(changes)) {
for (const change of changes) {
this.mergePreferenceProviderDataChange(change);
}
}
else {
for (const preferenceName of Object.keys(changes)) {
this.mergePreferenceProviderDataChange(changes[preferenceName]);
}
}
return this.fireDidPreferencesChanged();
}
mergePreferenceProviderDataChange(change) {
if (!this.deferredChanges) {
this.deferredChanges = {};
}
const current = this.deferredChanges[change.preferenceName];
const { newValue, scope, domain } = change;
if (!current) {
// new
this.deferredChanges[change.preferenceName] = change;
}
else if (current.oldValue === newValue) {
// delete
delete this.deferredChanges[change.preferenceName];
}
else {
// update
Object.assign(current, { newValue, scope, domain });
}
}
dispose() {
this.toDispose.dispose();
}
}
exports.PreferenceProviderBase = PreferenceProviderBase;
/**
* The {@link PreferenceProvider} is used to store and retrieve preference values. A {@link PreferenceProvider} does not operate in a global scope but is
* configured for one or more {@link PreferenceScope}s. The (default implementation for the) {@link PreferenceService} aggregates all {@link PreferenceProvider}s and
* serves as a common facade for manipulating preference values.
*/
let PreferenceProviderImpl = class PreferenceProviderImpl extends PreferenceProviderBase {
constructor() {
super();
this._ready = new promise_util_1.Deferred();
}
get(preferenceName, resourceUri) {
return this.resolve(preferenceName, resourceUri).value;
}
resolve(preferenceName, resourceUri) {
const value = this.getPreferences(resourceUri)[preferenceName];
if (value !== undefined) {
return {
value: value,
configUri: this.getConfigUri(resourceUri)
};
}
return {};
}
/**
* Resolved when the preference provider is ready to provide preferences
* It should be resolved by subclasses.
*/
get ready() {
return this._ready.promise;
}
/**
* Retrieve the domain for this provider.
*
* @returns the domain or `undefined` if this provider is suitable for all domains.
*/
getDomain() {
return undefined;
}
getConfigUri(resourceUri, sectionName) {
return undefined;
}
getParsedContent(jsonData) {
const preferences = {};
if (!(0, common_1.isObject)(jsonData)) {
return preferences;
}
for (const [preferenceName, preferenceValue] of Object.entries(jsonData)) {
if (common_1.PreferenceLanguageOverrideService.testOverrideValue(preferenceName, preferenceValue)) {
for (const [overriddenPreferenceName, overriddenValue] of Object.entries(preferenceValue)) {
preferences[`${preferenceName}.${overriddenPreferenceName}`] = overriddenValue;
}
}
else {
preferences[preferenceName] = preferenceValue;
}
}
return preferences;
}
canHandleScope(scope) {
return true;
}
};
exports.PreferenceProviderImpl = PreferenceProviderImpl;
exports.PreferenceProviderImpl = PreferenceProviderImpl = tslib_1.__decorate([
(0, inversify_1.injectable)(),
tslib_1.__metadata("design:paramtypes", [])
], PreferenceProviderImpl);
//# sourceMappingURL=preference-provider-impl.js.map