UNPKG

@21epub/epub-thirdparty

Version:
214 lines (213 loc) 10.5 kB
import { Emitter } from '../../../base/common/event.js'; import * as types from '../../../base/common/types.js'; import * as nls from '../../../nls.js'; import { Extensions as JSONExtensions } from '../../jsonschemas/common/jsonContributionRegistry.js'; import { Registry } from '../../registry/common/platform.js'; export const Extensions = { Configuration: 'base.contributions.configuration' }; export const allSettings = { properties: {}, patternProperties: {} }; export const applicationSettings = { properties: {}, patternProperties: {} }; export const machineSettings = { properties: {}, patternProperties: {} }; export const machineOverridableSettings = { properties: {}, patternProperties: {} }; export const windowSettings = { properties: {}, patternProperties: {} }; export const resourceSettings = { properties: {}, patternProperties: {} }; export const resourceLanguageSettingsSchemaId = 'vscode://schemas/settings/resourceLanguage'; const contributionRegistry = Registry.as(JSONExtensions.JSONContribution); class ConfigurationRegistry { constructor() { this.overrideIdentifiers = new Set(); this._onDidSchemaChange = new Emitter(); this._onDidUpdateConfiguration = new Emitter(); this.defaultValues = {}; this.defaultLanguageConfigurationOverridesNode = { id: 'defaultOverrides', title: nls.localize('defaultLanguageConfigurationOverrides.title', "Default Language Configuration Overrides"), properties: {} }; this.configurationContributors = [this.defaultLanguageConfigurationOverridesNode]; this.resourceLanguageSettingsSchema = { properties: {}, patternProperties: {}, additionalProperties: false, errorMessage: 'Unknown editor configuration setting', allowTrailingCommas: true, allowComments: true }; this.configurationProperties = {}; this.excludedConfigurationProperties = {}; contributionRegistry.registerSchema(resourceLanguageSettingsSchemaId, this.resourceLanguageSettingsSchema); } registerConfiguration(configuration, validate = true) { this.registerConfigurations([configuration], validate); } registerConfigurations(configurations, validate = true) { const properties = this.doRegisterConfigurations(configurations, validate); contributionRegistry.registerSchema(resourceLanguageSettingsSchemaId, this.resourceLanguageSettingsSchema); this._onDidSchemaChange.fire(); this._onDidUpdateConfiguration.fire(properties); } registerOverrideIdentifiers(overrideIdentifiers) { for (const overrideIdentifier of overrideIdentifiers) { this.overrideIdentifiers.add(overrideIdentifier); } this.updateOverridePropertyPatternKey(); } doRegisterConfigurations(configurations, validate) { const properties = []; configurations.forEach(configuration => { properties.push(...this.validateAndRegisterProperties(configuration, validate, configuration.extensionInfo)); // fills in defaults this.configurationContributors.push(configuration); this.registerJSONConfiguration(configuration); }); return properties; } validateAndRegisterProperties(configuration, validate = true, extensionInfo, scope = 3 /* WINDOW */) { var _a; scope = types.isUndefinedOrNull(configuration.scope) ? scope : configuration.scope; let propertyKeys = []; let properties = configuration.properties; if (properties) { for (let key in properties) { if (validate && validateProperty(key)) { delete properties[key]; continue; } const property = properties[key]; // update default value this.updatePropertyDefaultValue(key, property); // update scope if (OVERRIDE_PROPERTY_PATTERN.test(key)) { property.scope = undefined; // No scope for overridable properties `[${identifier}]` } else { property.scope = types.isUndefinedOrNull(property.scope) ? scope : property.scope; property.restricted = types.isUndefinedOrNull(property.restricted) ? !!((_a = extensionInfo === null || extensionInfo === void 0 ? void 0 : extensionInfo.restrictedConfigurations) === null || _a === void 0 ? void 0 : _a.includes(key)) : property.restricted; } // Add to properties maps // Property is included by default if 'included' is unspecified if (properties[key].hasOwnProperty('included') && !properties[key].included) { this.excludedConfigurationProperties[key] = properties[key]; delete properties[key]; continue; } else { this.configurationProperties[key] = properties[key]; } if (!properties[key].deprecationMessage && properties[key].markdownDeprecationMessage) { // If not set, default deprecationMessage to the markdown source properties[key].deprecationMessage = properties[key].markdownDeprecationMessage; } propertyKeys.push(key); } } let subNodes = configuration.allOf; if (subNodes) { for (let node of subNodes) { propertyKeys.push(...this.validateAndRegisterProperties(node, validate, extensionInfo, scope)); } } return propertyKeys; } getConfigurationProperties() { return this.configurationProperties; } registerJSONConfiguration(configuration) { const register = (configuration) => { let properties = configuration.properties; if (properties) { for (const key in properties) { this.updateSchema(key, properties[key]); } } let subNodes = configuration.allOf; if (subNodes) { subNodes.forEach(register); } }; register(configuration); } updateSchema(key, property) { allSettings.properties[key] = property; switch (property.scope) { case 1 /* APPLICATION */: applicationSettings.properties[key] = property; break; case 2 /* MACHINE */: machineSettings.properties[key] = property; break; case 6 /* MACHINE_OVERRIDABLE */: machineOverridableSettings.properties[key] = property; break; case 3 /* WINDOW */: windowSettings.properties[key] = property; break; case 4 /* RESOURCE */: resourceSettings.properties[key] = property; break; case 5 /* LANGUAGE_OVERRIDABLE */: resourceSettings.properties[key] = property; this.resourceLanguageSettingsSchema.properties[key] = property; break; } } updateOverridePropertyPatternKey() { for (const overrideIdentifier of this.overrideIdentifiers.values()) { const overrideIdentifierProperty = `[${overrideIdentifier}]`; const resourceLanguagePropertiesSchema = { type: 'object', description: nls.localize('overrideSettings.defaultDescription', "Configure editor settings to be overridden for a language."), errorMessage: nls.localize('overrideSettings.errorMessage', "This setting does not support per-language configuration."), $ref: resourceLanguageSettingsSchemaId, }; this.updatePropertyDefaultValue(overrideIdentifierProperty, resourceLanguagePropertiesSchema); allSettings.properties[overrideIdentifierProperty] = resourceLanguagePropertiesSchema; applicationSettings.properties[overrideIdentifierProperty] = resourceLanguagePropertiesSchema; machineSettings.properties[overrideIdentifierProperty] = resourceLanguagePropertiesSchema; machineOverridableSettings.properties[overrideIdentifierProperty] = resourceLanguagePropertiesSchema; windowSettings.properties[overrideIdentifierProperty] = resourceLanguagePropertiesSchema; resourceSettings.properties[overrideIdentifierProperty] = resourceLanguagePropertiesSchema; } this._onDidSchemaChange.fire(); } updatePropertyDefaultValue(key, property) { let defaultValue = this.defaultValues[key]; if (types.isUndefined(defaultValue)) { defaultValue = property.default; } if (types.isUndefined(defaultValue)) { defaultValue = getDefaultValue(property.type); } property.default = defaultValue; } } const OVERRIDE_PROPERTY = '\\[.*\\]$'; export const OVERRIDE_PROPERTY_PATTERN = new RegExp(OVERRIDE_PROPERTY); export function overrideIdentifierFromKey(key) { return key.substring(1, key.length - 1); } export function getDefaultValue(type) { const t = Array.isArray(type) ? type[0] : type; switch (t) { case 'boolean': return false; case 'integer': case 'number': return 0; case 'string': return ''; case 'array': return []; case 'object': return {}; default: return null; } } const configurationRegistry = new ConfigurationRegistry(); Registry.add(Extensions.Configuration, configurationRegistry); export function validateProperty(property) { if (!property.trim()) { return nls.localize('config.property.empty', "Cannot register an empty property"); } if (OVERRIDE_PROPERTY_PATTERN.test(property)) { return nls.localize('config.property.languageDefault', "Cannot register '{0}'. This matches property pattern '\\\\[.*\\\\]$' for describing language specific editor settings. Use 'configurationDefaults' contribution.", property); } if (configurationRegistry.getConfigurationProperties()[property] !== undefined) { return nls.localize('config.property.duplicate', "Cannot register '{0}'. This property is already registered.", property); } return null; }