@theia/core 1.65.0-next.19 → 1.65.0-next.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/browser/breadcrumbs/breadcrumbs-renderer.d.ts +1 -1
- package/lib/browser/breadcrumbs/breadcrumbs-renderer.d.ts.map +1 -1
- package/lib/browser/breadcrumbs/breadcrumbs-renderer.js +1 -1
- package/lib/browser/breadcrumbs/breadcrumbs-renderer.js.map +1 -1
- package/lib/browser/catalog.json +24 -7
- package/lib/browser/common-frontend-contribution.d.ts +2 -3
- package/lib/browser/common-frontend-contribution.d.ts.map +1 -1
- package/lib/browser/common-frontend-contribution.js +3 -4
- package/lib/browser/common-frontend-contribution.js.map +1 -1
- package/lib/browser/encoding-registry.d.ts +1 -1
- package/lib/browser/encoding-registry.d.ts.map +1 -1
- package/lib/browser/encoding-registry.js +1 -1
- package/lib/browser/encoding-registry.js.map +1 -1
- package/lib/browser/frontend-application-bindings.d.ts.map +1 -1
- package/lib/browser/frontend-application-bindings.js +10 -17
- package/lib/browser/frontend-application-bindings.js.map +1 -1
- package/lib/browser/frontend-application-module.d.ts.map +1 -1
- package/lib/browser/frontend-application-module.js +4 -5
- package/lib/browser/frontend-application-module.js.map +1 -1
- package/lib/browser/frontend-application.d.ts +1 -1
- package/lib/browser/frontend-application.d.ts.map +1 -1
- package/lib/browser/frontend-application.js +1 -1
- package/lib/browser/frontend-application.js.map +1 -1
- package/lib/browser/hover-service.d.ts +1 -2
- package/lib/browser/hover-service.d.ts.map +1 -1
- package/lib/browser/hover-service.js +1 -2
- package/lib/browser/hover-service.js.map +1 -1
- package/lib/browser/icon-theme-service.d.ts +3 -2
- package/lib/browser/icon-theme-service.d.ts.map +1 -1
- package/lib/browser/icon-theme-service.js +4 -3
- package/lib/browser/icon-theme-service.js.map +1 -1
- package/lib/browser/index.d.ts +0 -1
- package/lib/browser/index.d.ts.map +1 -1
- package/lib/browser/index.js +0 -1
- package/lib/browser/index.js.map +1 -1
- package/lib/browser/keybinding.d.ts +1 -1
- package/lib/browser/keybinding.d.ts.map +1 -1
- package/lib/browser/keybinding.js +1 -1
- package/lib/browser/keybinding.js.map +1 -1
- package/lib/browser/keybinding.spec.js +1 -1
- package/lib/browser/keybinding.spec.js.map +1 -1
- package/lib/browser/menu/browser-menu-plugin.d.ts +2 -2
- package/lib/browser/menu/browser-menu-plugin.d.ts.map +1 -1
- package/lib/browser/menu/browser-menu-plugin.js +2 -3
- package/lib/browser/menu/browser-menu-plugin.js.map +1 -1
- package/lib/browser/open-with-service.d.ts +1 -1
- package/lib/browser/open-with-service.d.ts.map +1 -1
- package/lib/browser/open-with-service.js +3 -3
- package/lib/browser/open-with-service.js.map +1 -1
- package/lib/browser/opener-service.d.ts +1 -2
- package/lib/browser/opener-service.d.ts.map +1 -1
- package/lib/browser/opener-service.js.map +1 -1
- package/lib/browser/preferences/frontend-config-preference-contributions.d.ts +6 -0
- package/lib/browser/preferences/frontend-config-preference-contributions.d.ts.map +1 -0
- package/lib/browser/preferences/frontend-config-preference-contributions.js +60 -0
- package/lib/browser/preferences/frontend-config-preference-contributions.js.map +1 -0
- package/lib/browser/preferences/index.d.ts +0 -5
- package/lib/browser/preferences/index.d.ts.map +1 -1
- package/lib/browser/preferences/index.js +0 -5
- package/lib/browser/preferences/index.js.map +1 -1
- package/lib/browser/preferences/preference-contribution.d.ts +0 -96
- package/lib/browser/preferences/preference-contribution.d.ts.map +1 -1
- package/lib/browser/preferences/preference-contribution.js +14 -355
- package/lib/browser/preferences/preference-contribution.js.map +1 -1
- package/lib/browser/preferences/preference-proxy.spec.js +25 -17
- package/lib/browser/preferences/preference-proxy.spec.js.map +1 -1
- package/lib/browser/preferences/preference-schema-provider.spec.js +21 -34
- package/lib/browser/preferences/preference-schema-provider.spec.js.map +1 -1
- package/lib/browser/preferences/preference-service.spec.js +57 -80
- package/lib/browser/preferences/preference-service.spec.js.map +1 -1
- package/lib/browser/preferences/preference-validation-service.d.ts +24 -26
- package/lib/browser/preferences/preference-validation-service.d.ts.map +1 -1
- package/lib/browser/preferences/preference-validation-service.js +40 -20
- package/lib/browser/preferences/preference-validation-service.js.map +1 -1
- package/lib/browser/preferences/preference-validation-service.spec.js +10 -6
- package/lib/browser/preferences/preference-validation-service.spec.js.map +1 -1
- package/lib/browser/preferences/test/mock-preference-provider.d.ts +2 -3
- package/lib/browser/preferences/test/mock-preference-provider.d.ts.map +1 -1
- package/lib/browser/preferences/test/mock-preference-provider.js +5 -7
- package/lib/browser/preferences/test/mock-preference-provider.js.map +1 -1
- package/lib/browser/preferences/test/mock-preference-proxy.d.ts.map +1 -1
- package/lib/browser/preferences/test/mock-preference-proxy.js.map +1 -1
- package/lib/browser/preferences/test/mock-preference-service.d.ts +1 -4
- package/lib/browser/preferences/test/mock-preference-service.d.ts.map +1 -1
- package/lib/browser/preferences/test/mock-preference-service.js.map +1 -1
- package/lib/browser/quick-input/quick-command-service.d.ts +1 -1
- package/lib/browser/quick-input/quick-command-service.d.ts.map +1 -1
- package/lib/browser/quick-input/quick-command-service.js +1 -1
- package/lib/browser/quick-input/quick-command-service.js.map +1 -1
- package/lib/browser/request/browser-request-service.d.ts +1 -1
- package/lib/browser/request/browser-request-service.d.ts.map +1 -1
- package/lib/browser/request/browser-request-service.js +2 -2
- package/lib/browser/request/browser-request-service.js.map +1 -1
- package/lib/browser/shell/application-shell.d.ts +1 -1
- package/lib/browser/shell/application-shell.d.ts.map +1 -1
- package/lib/browser/shell/application-shell.js +7 -6
- package/lib/browser/shell/application-shell.js.map +1 -1
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-menu-adapters.js +3 -2
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-menu-adapters.js.map +1 -1
- package/lib/browser/shell/tab-bars.d.ts +1 -1
- package/lib/browser/shell/tab-bars.d.ts.map +1 -1
- package/lib/browser/shell/theia-dock-panel.d.ts +1 -1
- package/lib/browser/shell/theia-dock-panel.d.ts.map +1 -1
- package/lib/browser/status-bar/status-bar.d.ts +1 -1
- package/lib/browser/status-bar/status-bar.d.ts.map +1 -1
- package/lib/browser/status-bar/status-bar.js +3 -2
- package/lib/browser/status-bar/status-bar.js.map +1 -1
- package/lib/browser/theming.d.ts +5 -4
- package/lib/browser/theming.d.ts.map +1 -1
- package/lib/browser/theming.js +7 -6
- package/lib/browser/theming.js.map +1 -1
- package/lib/browser/tooltip-service.d.ts +1 -1
- package/lib/browser/tooltip-service.d.ts.map +1 -1
- package/lib/browser/tooltip-service.js +1 -1
- package/lib/browser/tooltip-service.js.map +1 -1
- package/lib/browser/tree/index.d.ts +0 -1
- package/lib/browser/tree/index.d.ts.map +1 -1
- package/lib/browser/tree/index.js +0 -1
- package/lib/browser/tree/index.js.map +1 -1
- package/lib/browser/tree/tree-widget.d.ts +2 -2
- package/lib/browser/tree/tree-widget.d.ts.map +1 -1
- package/lib/browser/tree/tree-widget.js +3 -3
- package/lib/browser/tree/tree-widget.js.map +1 -1
- package/lib/browser/widgets/widget.js +4 -4
- package/lib/browser/widgets/widget.js.map +1 -1
- package/lib/browser/window/default-secondary-window-service.d.ts +1 -2
- package/lib/browser/window/default-secondary-window-service.d.ts.map +1 -1
- package/lib/browser/window/default-secondary-window-service.js +1 -2
- package/lib/browser/window/default-secondary-window-service.js.map +1 -1
- package/lib/browser/window/default-window-service.d.ts +1 -1
- package/lib/browser/window/default-window-service.d.ts.map +1 -1
- package/lib/browser/window/default-window-service.js +1 -1
- package/lib/browser/window/default-window-service.js.map +1 -1
- package/lib/browser/window/default-window-service.spec.js +1 -1
- package/lib/browser/window/default-window-service.spec.js.map +1 -1
- package/lib/browser/window/window-title-service.d.ts +1 -1
- package/lib/browser/window/window-title-service.d.ts.map +1 -1
- package/lib/browser/window/window-title-service.js +1 -1
- package/lib/browser/window/window-title-service.js.map +1 -1
- package/lib/{browser → common}/core-preferences.d.ts +2 -1
- package/lib/common/core-preferences.d.ts.map +1 -0
- package/lib/{browser → common}/core-preferences.js +17 -18
- package/lib/common/core-preferences.js.map +1 -0
- package/lib/common/index.d.ts +4 -0
- package/lib/common/index.d.ts.map +1 -1
- package/lib/common/index.js +4 -0
- package/lib/common/index.js.map +1 -1
- package/lib/common/inversify-utils.d.ts +31 -0
- package/lib/common/inversify-utils.d.ts.map +1 -0
- package/lib/common/inversify-utils.js +60 -0
- package/lib/common/inversify-utils.js.map +1 -0
- package/lib/common/json-schema.d.ts +1 -0
- package/lib/common/json-schema.d.ts.map +1 -1
- package/lib/common/preferences/defaults-preference-provider.d.ts +21 -0
- package/lib/common/preferences/defaults-preference-provider.d.ts.map +1 -0
- package/lib/common/preferences/defaults-preference-provider.js +99 -0
- package/lib/common/preferences/defaults-preference-provider.js.map +1 -0
- package/lib/common/preferences/index.d.ts +12 -0
- package/lib/common/preferences/index.d.ts.map +1 -0
- package/lib/common/preferences/index.js +30 -0
- package/lib/common/preferences/index.js.map +1 -0
- package/lib/{browser → common}/preferences/injectable-preference-proxy.d.ts +1 -1
- package/lib/common/preferences/injectable-preference-proxy.d.ts.map +1 -0
- package/lib/{browser → common}/preferences/injectable-preference-proxy.js +2 -2
- package/lib/common/preferences/injectable-preference-proxy.js.map +1 -0
- package/lib/common/preferences/preference-configurations.d.ts.map +1 -0
- package/lib/common/preferences/preference-configurations.js.map +1 -0
- package/lib/{browser → common}/preferences/preference-language-override-service.d.ts +4 -13
- package/lib/common/preferences/preference-language-override-service.d.ts.map +1 -0
- package/lib/{browser → common}/preferences/preference-language-override-service.js +14 -30
- package/lib/common/preferences/preference-language-override-service.js.map +1 -0
- package/lib/common/preferences/preference-provider-impl.d.ts +52 -0
- package/lib/common/preferences/preference-provider-impl.d.ts.map +1 -0
- package/lib/{browser/preferences/preference-provider.js → common/preferences/preference-provider-impl.js} +23 -95
- package/lib/common/preferences/preference-provider-impl.js.map +1 -0
- package/lib/{browser → common}/preferences/preference-provider.d.ts +34 -59
- package/lib/common/preferences/preference-provider.d.ts.map +1 -0
- package/lib/common/preferences/preference-provider.js +71 -0
- package/lib/common/preferences/preference-provider.js.map +1 -0
- package/lib/common/preferences/preference-provider.spec.d.ts.map +1 -0
- package/lib/{browser → common}/preferences/preference-provider.spec.js +4 -4
- package/lib/common/preferences/preference-provider.spec.js.map +1 -0
- package/lib/{browser → common}/preferences/preference-proxy.d.ts +2 -2
- package/lib/common/preferences/preference-proxy.d.ts.map +1 -0
- package/lib/{browser → common}/preferences/preference-proxy.js +10 -10
- package/lib/common/preferences/preference-proxy.js.map +1 -0
- package/lib/common/preferences/preference-schema-service.d.ts +55 -0
- package/lib/common/preferences/preference-schema-service.d.ts.map +1 -0
- package/lib/common/preferences/preference-schema-service.js +402 -0
- package/lib/common/preferences/preference-schema-service.js.map +1 -0
- package/lib/common/preferences/preference-schema.d.ts +145 -43
- package/lib/common/preferences/preference-schema.d.ts.map +1 -1
- package/lib/common/preferences/preference-schema.js +3 -41
- package/lib/common/preferences/preference-schema.js.map +1 -1
- package/lib/common/preferences/preference-scope.d.ts +4 -1
- package/lib/common/preferences/preference-scope.d.ts.map +1 -1
- package/lib/common/preferences/preference-scope.js +5 -14
- package/lib/common/preferences/preference-scope.js.map +1 -1
- package/lib/{browser → common}/preferences/preference-service.d.ts +9 -10
- package/lib/common/preferences/preference-service.d.ts.map +1 -0
- package/lib/{browser → common}/preferences/preference-service.js +65 -60
- package/lib/common/preferences/preference-service.js.map +1 -0
- package/lib/common/supported-encodings.d.ts.map +1 -0
- package/lib/common/supported-encodings.js.map +1 -0
- package/lib/{browser/tree → common}/tree-preference.d.ts +1 -1
- package/lib/common/tree-preference.d.ts.map +1 -0
- package/lib/{browser/tree → common}/tree-preference.js +3 -5
- package/lib/common/tree-preference.js.map +1 -0
- package/lib/electron-browser/menu/electron-context-menu-renderer.d.ts +2 -1
- package/lib/electron-browser/menu/electron-context-menu-renderer.d.ts.map +1 -1
- package/lib/electron-browser/menu/electron-context-menu-renderer.js +2 -1
- package/lib/electron-browser/menu/electron-context-menu-renderer.js.map +1 -1
- package/lib/electron-browser/menu/electron-main-menu-factory.d.ts +1 -2
- package/lib/electron-browser/menu/electron-main-menu-factory.d.ts.map +1 -1
- package/lib/electron-browser/menu/electron-main-menu-factory.js +1 -1
- package/lib/electron-browser/menu/electron-main-menu-factory.js.map +1 -1
- package/lib/electron-browser/menu/electron-menu-contribution.d.ts +2 -2
- package/lib/electron-browser/menu/electron-menu-contribution.d.ts.map +1 -1
- package/lib/electron-browser/menu/electron-menu-contribution.js +6 -6
- package/lib/electron-browser/menu/electron-menu-contribution.js.map +1 -1
- package/lib/electron-browser/window/electron-window-module.js +1 -1
- package/lib/electron-browser/window/electron-window-module.js.map +1 -1
- package/lib/electron-browser/window/electron-window-service.d.ts +1 -1
- package/lib/electron-browser/window/electron-window-service.d.ts.map +1 -1
- package/lib/electron-browser/window/electron-window-service.js +1 -1
- package/lib/electron-browser/window/electron-window-service.js.map +1 -1
- package/lib/{electron-browser/window → electron-common}/electron-window-preferences.d.ts +2 -1
- package/lib/electron-common/electron-window-preferences.d.ts.map +1 -0
- package/lib/{electron-browser/window → electron-common}/electron-window-preferences.js +7 -7
- package/lib/electron-common/electron-window-preferences.js.map +1 -0
- package/lib/electron-node/window/electron-window-module.d.ts +4 -0
- package/lib/electron-node/window/electron-window-module.d.ts.map +1 -0
- package/lib/{browser/preferences/preference-scope.js → electron-node/window/electron-window-module.js} +7 -5
- package/lib/electron-node/window/electron-window-module.js.map +1 -0
- package/lib/node/backend-application-module.d.ts.map +1 -1
- package/lib/node/backend-application-module.js +13 -0
- package/lib/node/backend-application-module.js.map +1 -1
- package/lib/node/backend-application.js +1 -1
- package/package.json +6 -5
- package/src/browser/breadcrumbs/breadcrumbs-renderer.tsx +1 -1
- package/src/browser/common-frontend-contribution.ts +2 -3
- package/src/browser/encoding-registry.ts +1 -1
- package/src/browser/frontend-application-bindings.ts +8 -13
- package/src/browser/frontend-application-module.ts +4 -4
- package/src/browser/frontend-application.ts +1 -1
- package/src/browser/hover-service.ts +1 -2
- package/src/browser/icon-theme-service.ts +3 -2
- package/src/browser/index.ts +0 -1
- package/src/browser/keybinding.spec.ts +1 -1
- package/src/browser/keybinding.ts +1 -1
- package/src/browser/menu/browser-menu-plugin.ts +4 -4
- package/src/browser/open-with-service.ts +1 -1
- package/src/browser/opener-service.ts +1 -2
- package/src/browser/preferences/frontend-config-preference-contributions.ts +52 -0
- package/src/browser/preferences/index.ts +0 -5
- package/src/browser/preferences/preference-contribution.ts +16 -398
- package/src/browser/preferences/preference-proxy.spec.ts +27 -17
- package/src/browser/preferences/preference-schema-provider.spec.ts +25 -37
- package/src/browser/preferences/preference-service.spec.ts +32 -56
- package/src/browser/preferences/preference-validation-service.spec.ts +27 -19
- package/src/browser/preferences/preference-validation-service.ts +60 -41
- package/src/browser/preferences/test/mock-preference-provider.ts +2 -5
- package/src/browser/preferences/test/mock-preference-proxy.ts +1 -2
- package/src/browser/preferences/test/mock-preference-service.ts +1 -4
- package/src/browser/quick-input/quick-command-service.ts +1 -1
- package/src/browser/request/browser-request-service.ts +4 -4
- package/src/browser/shell/application-shell.ts +7 -6
- package/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar-menu-adapters.tsx +5 -5
- package/src/browser/shell/tab-bars.ts +1 -1
- package/src/browser/shell/theia-dock-panel.ts +1 -1
- package/src/browser/status-bar/status-bar.tsx +3 -2
- package/src/browser/theming.ts +7 -6
- package/src/browser/tooltip-service.tsx +1 -1
- package/src/browser/tree/index.ts +0 -1
- package/src/browser/tree/tree-widget.tsx +4 -4
- package/src/browser/widgets/widget.ts +4 -4
- package/src/browser/window/default-secondary-window-service.ts +1 -2
- package/src/browser/window/default-window-service.spec.ts +1 -1
- package/src/browser/window/default-window-service.ts +1 -1
- package/src/browser/window/window-title-service.ts +1 -1
- package/src/{browser → common}/core-preferences.ts +16 -17
- package/src/common/index.ts +4 -0
- package/src/common/inversify-utils.ts +63 -0
- package/src/common/json-schema.ts +1 -0
- package/src/common/preferences/defaults-preference-provider.ts +91 -0
- package/src/common/preferences/index.ts +27 -0
- package/src/{browser → common}/preferences/injectable-preference-proxy.ts +3 -3
- package/src/{browser → common}/preferences/preference-language-override-service.ts +12 -29
- package/src/common/preferences/preference-provider-impl.ts +165 -0
- package/src/{browser → common}/preferences/preference-provider.spec.ts +6 -5
- package/src/common/preferences/preference-provider.ts +164 -0
- package/src/{browser → common}/preferences/preference-proxy.ts +15 -14
- package/src/common/preferences/preference-schema-service.ts +434 -0
- package/src/common/preferences/preference-schema.ts +156 -64
- package/src/common/preferences/preference-scope.ts +5 -13
- package/src/{browser → common}/preferences/preference-service.ts +71 -65
- package/src/{browser/tree → common}/tree-preference.ts +2 -4
- package/src/electron-browser/menu/electron-context-menu-renderer.ts +2 -1
- package/src/electron-browser/menu/electron-main-menu-factory.ts +2 -2
- package/src/electron-browser/menu/electron-menu-contribution.ts +9 -6
- package/src/electron-browser/window/electron-window-module.ts +1 -1
- package/src/electron-browser/window/electron-window-service.ts +1 -1
- package/src/{electron-browser/window → electron-common}/electron-window-preferences.ts +6 -6
- package/src/{browser/preferences/preference-scope.ts → electron-node/window/electron-window-module.ts} +7 -3
- package/src/node/backend-application-module.ts +28 -1
- package/src/node/backend-application.ts +1 -1
- package/lib/browser/core-preferences.d.ts.map +0 -1
- package/lib/browser/core-preferences.js.map +0 -1
- package/lib/browser/preferences/injectable-preference-proxy.d.ts.map +0 -1
- package/lib/browser/preferences/injectable-preference-proxy.js.map +0 -1
- package/lib/browser/preferences/preference-configurations.d.ts.map +0 -1
- package/lib/browser/preferences/preference-configurations.js.map +0 -1
- package/lib/browser/preferences/preference-language-override-service.d.ts.map +0 -1
- package/lib/browser/preferences/preference-language-override-service.js.map +0 -1
- package/lib/browser/preferences/preference-provider.d.ts.map +0 -1
- package/lib/browser/preferences/preference-provider.js.map +0 -1
- package/lib/browser/preferences/preference-provider.spec.d.ts.map +0 -1
- package/lib/browser/preferences/preference-provider.spec.js.map +0 -1
- package/lib/browser/preferences/preference-proxy.d.ts.map +0 -1
- package/lib/browser/preferences/preference-proxy.js.map +0 -1
- package/lib/browser/preferences/preference-scope.d.ts +0 -3
- package/lib/browser/preferences/preference-scope.d.ts.map +0 -1
- package/lib/browser/preferences/preference-scope.js.map +0 -1
- package/lib/browser/preferences/preference-service.d.ts.map +0 -1
- package/lib/browser/preferences/preference-service.js.map +0 -1
- package/lib/browser/supported-encodings.d.ts.map +0 -1
- package/lib/browser/supported-encodings.js.map +0 -1
- package/lib/browser/tree/tree-preference.d.ts.map +0 -1
- package/lib/browser/tree/tree-preference.js.map +0 -1
- package/lib/electron-browser/window/electron-window-preferences.d.ts.map +0 -1
- package/lib/electron-browser/window/electron-window-preferences.js.map +0 -1
- package/src/browser/preferences/preference-provider.ts +0 -277
- /package/lib/{browser → common}/preferences/preference-configurations.d.ts +0 -0
- /package/lib/{browser → common}/preferences/preference-configurations.js +0 -0
- /package/lib/{browser → common}/preferences/preference-provider.spec.d.ts +0 -0
- /package/lib/{browser → common}/supported-encodings.d.ts +0 -0
- /package/lib/{browser → common}/supported-encodings.js +0 -0
- /package/src/{browser → common}/preferences/preference-configurations.ts +0 -0
- /package/src/{browser → common}/supported-encodings.ts +0 -0
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
// *****************************************************************************
|
|
2
|
+
// Copyright (C) 2023 TypeFox and others.
|
|
3
|
+
//
|
|
4
|
+
// This program and the accompanying materials are made available under the
|
|
5
|
+
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
6
|
+
// http://www.eclipse.org/legal/epl-2.0.
|
|
7
|
+
//
|
|
8
|
+
// This Source Code may also be made available under the following Secondary
|
|
9
|
+
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
10
|
+
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
11
|
+
// with the GNU Classpath Exception which is available at
|
|
12
|
+
// https://www.gnu.org/software/classpath/license.html.
|
|
13
|
+
//
|
|
14
|
+
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
15
|
+
// *****************************************************************************
|
|
16
|
+
|
|
17
|
+
import { JSONExt, JSONObject, JSONValue } from '@lumino/coreutils';
|
|
18
|
+
import { Event } from '../event';
|
|
19
|
+
import { PreferenceScope } from '../preferences/preference-scope';
|
|
20
|
+
import { URI } from '../uri';
|
|
21
|
+
import { Disposable } from 'vscode-languageserver-protocol';
|
|
22
|
+
|
|
23
|
+
export interface PreferenceProviderDataChange {
|
|
24
|
+
/**
|
|
25
|
+
* The name of the changed preference.
|
|
26
|
+
*/
|
|
27
|
+
readonly preferenceName: string;
|
|
28
|
+
/**
|
|
29
|
+
* The new value of the changed preference.
|
|
30
|
+
*/
|
|
31
|
+
readonly newValue?: JSONValue;
|
|
32
|
+
/**
|
|
33
|
+
* The old value of the changed preference.
|
|
34
|
+
*/
|
|
35
|
+
readonly oldValue?: JSONValue;
|
|
36
|
+
/**
|
|
37
|
+
* The {@link PreferenceScope} of the changed preference.
|
|
38
|
+
*/
|
|
39
|
+
readonly scope: PreferenceScope;
|
|
40
|
+
/**
|
|
41
|
+
* URIs of the scopes in which this change applies.
|
|
42
|
+
*/
|
|
43
|
+
readonly domain?: string[];
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export namespace PreferenceProviderDataChange {
|
|
47
|
+
export function affects(change: PreferenceProviderDataChange, resourceUri?: string): boolean {
|
|
48
|
+
const resourcePath = resourceUri && new URI(resourceUri).path;
|
|
49
|
+
const domain = change.domain;
|
|
50
|
+
return !resourcePath || !domain || domain.some(uri => new URI(uri).path.relativity(resourcePath) >= 0);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export interface PreferenceResolveResult<T> {
|
|
55
|
+
configUri?: URI;
|
|
56
|
+
value?: T
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export interface PreferenceProviderDataChanges {
|
|
60
|
+
[preferenceName: string]: PreferenceProviderDataChange;
|
|
61
|
+
}
|
|
62
|
+
export const PreferenceProvider = Symbol('PreferenceProvider');
|
|
63
|
+
|
|
64
|
+
export interface PreferenceProvider extends Disposable {
|
|
65
|
+
readonly onDidPreferencesChanged: Event<PreferenceProviderDataChanges>;
|
|
66
|
+
ready: Promise<void>
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Whether t
|
|
70
|
+
* @param scope the scope to handle
|
|
71
|
+
*/
|
|
72
|
+
canHandleScope(scope: PreferenceScope): boolean;
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Retrieve the stored value for the given preference and resource URI.
|
|
76
|
+
*
|
|
77
|
+
* @param preferenceName the preference identifier.
|
|
78
|
+
* @param resourceUri the uri of the resource for which the preference is stored. This is used to retrieve
|
|
79
|
+
* a potentially different value for the same preference for different resources, for example `files.encoding`.
|
|
80
|
+
*
|
|
81
|
+
* @returns the value stored for the given preference and resourceUri if it exists, otherwise `undefined`.
|
|
82
|
+
*/
|
|
83
|
+
get<T>(preferenceName: string, resourceUri?: string): T | undefined;
|
|
84
|
+
/**
|
|
85
|
+
* Stores a new value for the given preference key in the provider.
|
|
86
|
+
* @param key the preference key (typically the name).
|
|
87
|
+
* @param value the new preference value.
|
|
88
|
+
* @param resourceUri the URI of the resource for which the preference is stored.
|
|
89
|
+
*
|
|
90
|
+
* @returns a promise that only resolves if all changes were delivered.
|
|
91
|
+
* If changes were made then implementation must either
|
|
92
|
+
* await on `this.emitPreferencesChangedEvent(...)` or
|
|
93
|
+
* `this.pendingChanges` if changes are fired indirectly.
|
|
94
|
+
*/
|
|
95
|
+
setPreference(key: string, value: JSONValue, resourceUri?: string): Promise<boolean>
|
|
96
|
+
/**
|
|
97
|
+
* Resolve the value for the given preference and resource URI.
|
|
98
|
+
*
|
|
99
|
+
* @param preferenceName the preference identifier.
|
|
100
|
+
* @param resourceUri the URI of the resource for which this provider should resolve the preference. This is used to retrieve
|
|
101
|
+
* a potentially different value for the same preference for different resources, for example `files.encoding`.
|
|
102
|
+
*
|
|
103
|
+
* @returns an object containing the value stored for the given preference and resourceUri if it exists,
|
|
104
|
+
* otherwise `undefined`.
|
|
105
|
+
*/
|
|
106
|
+
resolve<T>(preferenceName: string, resourceUri?: string): PreferenceResolveResult<T>;
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Retrieve the configuration URI for the given resource URI.
|
|
110
|
+
* @param resourceUri the uri of the resource or `undefined`.
|
|
111
|
+
* @param sectionName the section to return the URI for, e.g. `tasks` or `launch`. Defaults to settings.
|
|
112
|
+
*
|
|
113
|
+
* @returns the corresponding resource URI or `undefined` if there is no valid URI.
|
|
114
|
+
*/
|
|
115
|
+
getConfigUri?(resourceUri?: string, sectionName?: string): URI | undefined;
|
|
116
|
+
/**
|
|
117
|
+
* Retrieves the first valid configuration URI contained by the given resource.
|
|
118
|
+
* @param resourceUri the uri of the container resource or `undefined`.
|
|
119
|
+
*
|
|
120
|
+
* @returns the first valid configuration URI contained by the given resource `undefined`
|
|
121
|
+
* if there is no valid configuration URI at all.
|
|
122
|
+
*/
|
|
123
|
+
getContainingConfigUri?(resourceUri?: string, sectionName?: string): URI | undefined;
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Return a JSONObject with all preferences stored in this preference provider
|
|
127
|
+
*/
|
|
128
|
+
getPreferences(resourceUri?: string): JSONObject;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
export namespace PreferenceUtils {
|
|
132
|
+
export function merge(source: JSONValue | undefined, target: JSONValue): JSONValue {
|
|
133
|
+
if (source === undefined || !JSONExt.isObject(source)) {
|
|
134
|
+
return JSONExt.deepCopy(target);
|
|
135
|
+
}
|
|
136
|
+
if (JSONExt.isPrimitive(target)) {
|
|
137
|
+
return {};
|
|
138
|
+
}
|
|
139
|
+
for (const [key, value] of Object.entries(target)) {
|
|
140
|
+
if (key in source) {
|
|
141
|
+
const sourceValue = source[key];
|
|
142
|
+
if (JSONExt.isObject(sourceValue) && JSONExt.isObject(value)) {
|
|
143
|
+
merge(sourceValue, value);
|
|
144
|
+
continue;
|
|
145
|
+
} else if (JSONExt.isArray(sourceValue) && JSONExt.isArray(value)) {
|
|
146
|
+
source[key] = [...JSONExt.deepCopy(sourceValue), ...JSONExt.deepCopy(value)];
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
source[key] = JSONExt.deepCopy(value);
|
|
151
|
+
}
|
|
152
|
+
return source;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Handles deep equality with the possibility of `undefined`
|
|
157
|
+
*/
|
|
158
|
+
export function deepEqual(a: JSONValue | undefined, b: JSONValue | undefined): boolean {
|
|
159
|
+
if (a === b) { return true; }
|
|
160
|
+
if (a === undefined || b === undefined) { return false; }
|
|
161
|
+
return JSONExt.deepEqual(a, b);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
}
|
|
@@ -18,9 +18,10 @@
|
|
|
18
18
|
|
|
19
19
|
import { Disposable, Event, isObject, MaybePromise } from '../../common';
|
|
20
20
|
import { PreferenceService } from './preference-service';
|
|
21
|
-
import { PreferenceSchema } from './preference-contribution';
|
|
22
21
|
import { PreferenceScope } from './preference-scope';
|
|
23
|
-
import {
|
|
22
|
+
import { IJSONSchema } from '../../common/json-schema';
|
|
23
|
+
import { isThenable } from '../../common/promise-util';
|
|
24
|
+
import { OverridePreferenceName } from '../../common/preferences/preference-language-override-service';
|
|
24
25
|
|
|
25
26
|
/**
|
|
26
27
|
* It is worth explaining the type for `PreferenceChangeEvent`:
|
|
@@ -174,29 +175,29 @@ export interface PreferenceProxyOptions {
|
|
|
174
175
|
*
|
|
175
176
|
* @deprecated @since 1.23.0 use `PreferenceProxyFactory` instead.
|
|
176
177
|
*/
|
|
177
|
-
export function createPreferenceProxy<T>(preferences: PreferenceService, promisedSchema: MaybePromise<
|
|
178
|
+
export function createPreferenceProxy<T>(preferences: PreferenceService, promisedSchema: MaybePromise<IJSONSchema>, options?: PreferenceProxyOptions): PreferenceProxy<T> {
|
|
178
179
|
const opts = options || {};
|
|
179
180
|
const prefix = opts.prefix || '';
|
|
180
181
|
const style = opts.style || 'flat';
|
|
181
182
|
const isDeep = style === 'deep' || style === 'both';
|
|
182
183
|
const isFlat = style === 'both' || style === 'flat';
|
|
183
|
-
let schema:
|
|
184
|
-
if (
|
|
185
|
-
schema = promisedSchema;
|
|
184
|
+
let schema: IJSONSchema | undefined;
|
|
185
|
+
if (!isThenable(promisedSchema)) {
|
|
186
|
+
schema = promisedSchema as IJSONSchema;
|
|
186
187
|
} else {
|
|
187
|
-
promisedSchema.then(s => schema = s);
|
|
188
|
+
promisedSchema.then((s: IJSONSchema) => schema = s);
|
|
188
189
|
}
|
|
189
190
|
const onPreferenceChanged = (listener: (e: PreferenceChangeEvent<T>) => any, thisArgs?: any, disposables?: Disposable[]) => preferences.onPreferencesChanged(changes => {
|
|
190
191
|
if (schema) {
|
|
191
192
|
for (const key of Object.keys(changes)) {
|
|
192
193
|
const e = changes[key];
|
|
193
194
|
const overridden = preferences.overriddenPreferenceName(e.preferenceName);
|
|
194
|
-
const preferenceName
|
|
195
|
+
const preferenceName = overridden ? overridden.preferenceName : e.preferenceName;
|
|
195
196
|
if (preferenceName.startsWith(prefix) && (!opts.overrideIdentifier || overridden?.overrideIdentifier === opts.overrideIdentifier)) {
|
|
196
|
-
if (schema.properties[preferenceName]) {
|
|
197
|
+
if (schema.properties && schema.properties[preferenceName]) {
|
|
197
198
|
const { newValue, oldValue } = e;
|
|
198
199
|
listener({
|
|
199
|
-
newValue, oldValue, preferenceName,
|
|
200
|
+
newValue: newValue as T[keyof T], oldValue: oldValue as T[keyof T], preferenceName: preferenceName as keyof T,
|
|
200
201
|
affects: (resourceUri, overrideIdentifier) => {
|
|
201
202
|
if (overrideIdentifier !== overridden?.overrideIdentifier) {
|
|
202
203
|
return false;
|
|
@@ -223,7 +224,7 @@ export function createPreferenceProxy<T>(preferences: PreferenceService, promise
|
|
|
223
224
|
|
|
224
225
|
const ownKeys: () => string[] = () => {
|
|
225
226
|
const properties = [];
|
|
226
|
-
if (schema) {
|
|
227
|
+
if (schema && schema.properties) {
|
|
227
228
|
for (const p of Object.keys(schema.properties)) {
|
|
228
229
|
if (p.startsWith(prefix)) {
|
|
229
230
|
const idx = p.indexOf('.', prefix.length);
|
|
@@ -250,7 +251,7 @@ export function createPreferenceProxy<T>(preferences: PreferenceService, promise
|
|
|
250
251
|
if (style === 'deep' && property.indexOf('.') !== -1) {
|
|
251
252
|
return false;
|
|
252
253
|
}
|
|
253
|
-
if (schema) {
|
|
254
|
+
if (schema && schema.properties) {
|
|
254
255
|
const fullProperty = prefix ? prefix + property : property;
|
|
255
256
|
if (schema.properties[fullProperty]) {
|
|
256
257
|
preferences.set(fullProperty, value, PreferenceScope.Default);
|
|
@@ -279,7 +280,7 @@ export function createPreferenceProxy<T>(preferences: PreferenceService, promise
|
|
|
279
280
|
throw new Error(`unexpected property: ${String(property)}`);
|
|
280
281
|
}
|
|
281
282
|
const fullProperty = prefix ? prefix + property : property;
|
|
282
|
-
if (schema) {
|
|
283
|
+
if (schema && schema.properties) {
|
|
283
284
|
if (isFlat || property.indexOf('.') === -1) {
|
|
284
285
|
if (schema.properties[fullProperty]) {
|
|
285
286
|
let value;
|
|
@@ -311,7 +312,7 @@ export function createPreferenceProxy<T>(preferences: PreferenceService, promise
|
|
|
311
312
|
if (property === 'toJSON') {
|
|
312
313
|
return toJSON();
|
|
313
314
|
}
|
|
314
|
-
if (schema && isDeep) {
|
|
315
|
+
if (schema && schema.properties && isDeep) {
|
|
315
316
|
const newPrefix = fullProperty + '.';
|
|
316
317
|
for (const p of Object.keys(schema.properties)) {
|
|
317
318
|
if (p.startsWith(newPrefix)) {
|
|
@@ -0,0 +1,434 @@
|
|
|
1
|
+
// *****************************************************************************
|
|
2
|
+
// Copyright (C) 2025 STMicroelectronics and others.
|
|
3
|
+
//
|
|
4
|
+
// This program and the accompanying materials are made available under the
|
|
5
|
+
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
6
|
+
// http://www.eclipse.org/legal/epl-2.0.
|
|
7
|
+
//
|
|
8
|
+
// This Source Code may also be made available under the following Secondary
|
|
9
|
+
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
10
|
+
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
11
|
+
// with the GNU Classpath Exception which is available at
|
|
12
|
+
// https://www.gnu.org/software/classpath/license.html.
|
|
13
|
+
//
|
|
14
|
+
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
15
|
+
// *****************************************************************************
|
|
16
|
+
|
|
17
|
+
import { inject, injectable, named, postConstruct } from 'inversify';
|
|
18
|
+
import { Disposable } from '../disposable';
|
|
19
|
+
import { Emitter } from '../event';
|
|
20
|
+
import { IJSONSchema } from '../json-schema';
|
|
21
|
+
import { JSONObject, JSONValue } from '@lumino/coreutils';
|
|
22
|
+
import { PreferenceDataProperty, PreferenceSchema, PreferenceSchemaService, DefaultValueChangedEvent, PreferenceContribution } from './preference-schema';
|
|
23
|
+
import { PreferenceScope, ValidPreferenceScopes } from './preference-scope';
|
|
24
|
+
import { PreferenceUtils } from './preference-provider';
|
|
25
|
+
import { ContributionProvider } from '../contribution-provider';
|
|
26
|
+
import { Deferred } from '../promise-util';
|
|
27
|
+
|
|
28
|
+
const NO_OVERRIDE = {};
|
|
29
|
+
const OVERRIDE_PROPERTY = '\\[(.*)\\]$';
|
|
30
|
+
|
|
31
|
+
@injectable()
|
|
32
|
+
export class PreferenceSchemaServiceImpl implements PreferenceSchemaService {
|
|
33
|
+
// Storage structures
|
|
34
|
+
protected readonly schemas = new Set<PreferenceSchema>();
|
|
35
|
+
protected readonly properties = new Map<string, PreferenceDataProperty>();
|
|
36
|
+
/**
|
|
37
|
+
* This map stores default overrides. The primary map key is the base preference name.
|
|
38
|
+
* The preference name maps to a second map keyed by the override identifier or a special object value `NO_OVERRIDE',
|
|
39
|
+
* representing default overrides for the base property. The value in this second map is an array
|
|
40
|
+
* of entries in reverse order of their insertion. This is necessary becuaus multiple clients might register
|
|
41
|
+
* overrides for the same preference key/override combination. The elements in this array consist of a unique, generated
|
|
42
|
+
* identifier and the actual override value. This allows us to always return the last registerd override even
|
|
43
|
+
* when overrides are later removed.
|
|
44
|
+
*/
|
|
45
|
+
protected readonly defaultOverrides = new Map<string, Map<string | object, [number, JSONValue][]>>();
|
|
46
|
+
protected readonly _overrideIdentifiers = new Set<string>();
|
|
47
|
+
|
|
48
|
+
protected readonly jsonSchemas: IJSONSchema[] = [];
|
|
49
|
+
|
|
50
|
+
protected readonly _ready = new Deferred();
|
|
51
|
+
|
|
52
|
+
get ready(): Promise<void> {
|
|
53
|
+
return this._ready.promise;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
get overrideIdentifiers(): ReadonlySet<string> {
|
|
57
|
+
return this._overrideIdentifiers;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
getSchemaProperties(): ReadonlyMap<string, PreferenceDataProperty> {
|
|
61
|
+
return this.properties;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
protected nextSchemaTitle = 1;
|
|
65
|
+
protected nextOverrideValueId = 1;
|
|
66
|
+
|
|
67
|
+
// Event emitters
|
|
68
|
+
protected readonly defaultValueChangedEmitter = new Emitter<DefaultValueChangedEvent>();
|
|
69
|
+
protected readonly schemaChangedEmitter = new Emitter<void>();
|
|
70
|
+
|
|
71
|
+
// Public events
|
|
72
|
+
readonly onDidChangeDefaultValue = this.defaultValueChangedEmitter.event;
|
|
73
|
+
readonly onDidChangeSchema = this.schemaChangedEmitter.event;
|
|
74
|
+
|
|
75
|
+
@inject(ValidPreferenceScopes)
|
|
76
|
+
readonly validScopes: readonly PreferenceScope[];
|
|
77
|
+
|
|
78
|
+
@inject(ContributionProvider) @named(PreferenceContribution)
|
|
79
|
+
protected readonly preferenceContributions: ContributionProvider<PreferenceContribution>;
|
|
80
|
+
|
|
81
|
+
@postConstruct()
|
|
82
|
+
protected init(): void {
|
|
83
|
+
for (const scope of this.validScopes) {
|
|
84
|
+
this.jsonSchemas[scope] = {
|
|
85
|
+
type: 'object',
|
|
86
|
+
properties: {},
|
|
87
|
+
patternProperties: {},
|
|
88
|
+
additionalProperties: false
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
const promises: Promise<void>[] = [];
|
|
92
|
+
this.preferenceContributions.getContributions().forEach(contrib => {
|
|
93
|
+
if (contrib.schema) {
|
|
94
|
+
this.addSchema(contrib.schema);
|
|
95
|
+
}
|
|
96
|
+
if (contrib.initSchema) {
|
|
97
|
+
promises.push(contrib.initSchema(this));
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
Promise.all(promises).then(() => this._ready.resolve());
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
dispose(): void {
|
|
104
|
+
this.defaultValueChangedEmitter.dispose();
|
|
105
|
+
this.schemaChangedEmitter.dispose();
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
registerOverrideIdentifier(overrideIdentifier: string): Disposable {
|
|
109
|
+
if (!this._overrideIdentifiers.has(overrideIdentifier)) {
|
|
110
|
+
this.addOverrideToJsonSchema(overrideIdentifier);
|
|
111
|
+
this._overrideIdentifiers.add(overrideIdentifier);
|
|
112
|
+
this.schemaChangedEmitter.fire();
|
|
113
|
+
|
|
114
|
+
return Disposable.create(() => {
|
|
115
|
+
if (this._overrideIdentifiers.delete(overrideIdentifier)) {
|
|
116
|
+
this.schemaChangedEmitter.fire();
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
return Disposable.NULL;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
addSchema(schema: PreferenceSchema): Disposable {
|
|
124
|
+
this.schemas.add(schema);
|
|
125
|
+
|
|
126
|
+
for (const [key, property] of Object.entries(schema.properties)) {
|
|
127
|
+
if (this.properties.has(key)) {
|
|
128
|
+
throw new Error(`Property with id '${key}' already exists`);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
if (property.scope === undefined) {
|
|
132
|
+
property.scope = schema.scope;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
if (property.overridable === undefined) {
|
|
136
|
+
property.overridable = schema.defaultOverridable;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
this.properties.set(key, property);
|
|
140
|
+
this.setJSONSchemasProperty(key, property);
|
|
141
|
+
if (property.default !== undefined) {
|
|
142
|
+
this.defaultValueChangedEmitter.fire(this.changeFor(key, undefined, this.defaultOverrides.get(key), undefined, property.default!));
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
this.schemaChangedEmitter.fire();
|
|
148
|
+
|
|
149
|
+
return Disposable.create(() => {
|
|
150
|
+
if (this.schemas.delete(schema)) {
|
|
151
|
+
for (const [key, property] of Object.entries(schema.properties)) {
|
|
152
|
+
this.deleteFromJSONSchemas(key, property);
|
|
153
|
+
this.properties.delete(key);
|
|
154
|
+
const overrides = this.defaultOverrides.get(key);
|
|
155
|
+
|
|
156
|
+
const baseOverride = overrides?.get(NO_OVERRIDE);
|
|
157
|
+
if (baseOverride !== undefined) {
|
|
158
|
+
this.defaultValueChangedEmitter.fire(this.changeFor(key, undefined, overrides, baseOverride, undefined));
|
|
159
|
+
} else if (property.default !== undefined) {
|
|
160
|
+
this.defaultValueChangedEmitter.fire(this.changeFor(key, undefined, overrides, property.default, undefined));
|
|
161
|
+
}
|
|
162
|
+
if (overrides) {
|
|
163
|
+
for (const [overrideKey, value] of overrides) {
|
|
164
|
+
if (typeof overrideKey === 'string') {
|
|
165
|
+
this.defaultValueChangedEmitter.fire(this.changeFor(key, overrideKey, overrides, value[0][1], undefined));
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
this.schemaChangedEmitter.fire();
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
isValidInScope(preferenceName: string, scope: PreferenceScope): boolean {
|
|
177
|
+
const property = this.properties.get(preferenceName);
|
|
178
|
+
|
|
179
|
+
if (!property) {
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// A property is valid in a scope if:
|
|
184
|
+
// 1. It is included (undefined or true)
|
|
185
|
+
// 2. Its scope is not defined (valid in all scopes) or its scope includes the given scope
|
|
186
|
+
return (property.included !== false) &&
|
|
187
|
+
(property.scope === undefined || property.scope >= scope);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
getSchemaProperty(key: string): PreferenceDataProperty | undefined {
|
|
191
|
+
return this.properties.get(key);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
updateSchemaProperty(key: string, property: PreferenceDataProperty): void {
|
|
195
|
+
const existing = this.properties.get(key);
|
|
196
|
+
if (existing) {
|
|
197
|
+
// Update the property with new values
|
|
198
|
+
const updatedProperty = { ...existing, ...property };
|
|
199
|
+
this.properties.set(key, updatedProperty);
|
|
200
|
+
const hasNoBaseOverrideValue = this.defaultOverrides.get(key)?.get(NO_OVERRIDE) === undefined;
|
|
201
|
+
if (hasNoBaseOverrideValue && !PreferenceUtils.deepEqual(property.default, existing.default)) {
|
|
202
|
+
this.defaultValueChangedEmitter.fire(this.changeFor(key, undefined, this.defaultOverrides.get(key), undefined, property.default!));
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
this.setJSONSchemasProperty(key, updatedProperty);
|
|
206
|
+
this.schemaChangedEmitter.fire();
|
|
207
|
+
} else {
|
|
208
|
+
console.warn(`Trying to update non-existent property ${key}`);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
registerOverride(key: string, overrideIdentifier: string | undefined, value: JSONValue): Disposable {
|
|
213
|
+
const overrideId = overrideIdentifier || NO_OVERRIDE;
|
|
214
|
+
const property = this.properties.get(key);
|
|
215
|
+
if (!property) {
|
|
216
|
+
console.warn(`Trying to register default override for non-existent preference: ${key}`);
|
|
217
|
+
} else if (!property.overridable && overrideIdentifier) {
|
|
218
|
+
console.warn(`Trying to register default override for identifier ${overrideIdentifier} for non-overridable preference: ${key}`);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
let overrides = this.defaultOverrides.get(key);
|
|
222
|
+
if (!overrides) {
|
|
223
|
+
overrides = new Map();
|
|
224
|
+
this.defaultOverrides.set(key, overrides);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
const oldValue = this.getDefaultValue(key, overrideIdentifier);
|
|
228
|
+
|
|
229
|
+
const overrideValueId = this.nextOverrideValueId;
|
|
230
|
+
let override = overrides.get(overrideId);
|
|
231
|
+
if (!override) {
|
|
232
|
+
override = [];
|
|
233
|
+
overrides.set(overrideId, override);
|
|
234
|
+
}
|
|
235
|
+
override.unshift([overrideValueId, value]);
|
|
236
|
+
|
|
237
|
+
// Fire event only if the value actually changed
|
|
238
|
+
if (!PreferenceUtils.deepEqual(oldValue, value)) {
|
|
239
|
+
const evt = this.changeFor(key, overrideIdentifier, overrides, oldValue, value);
|
|
240
|
+
this.defaultValueChangedEmitter.fire(evt);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
if (property) {
|
|
244
|
+
this.setJSONSchemasProperty(key, property);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
return Disposable.create(() => {
|
|
248
|
+
this.removeOverride(key, overrideIdentifier, overrideValueId);
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
protected changeFor(key: string, overrideIdentifier: string | undefined,
|
|
253
|
+
overrides: Map<string | object, [number, JSONValue][]> | undefined, oldValue: JSONValue | undefined, newValue: JSONValue | undefined): DefaultValueChangedEvent {
|
|
254
|
+
const affectedOverrides = [];
|
|
255
|
+
if (!overrideIdentifier) {
|
|
256
|
+
for (const id of this._overrideIdentifiers) {
|
|
257
|
+
if (!overrides?.has(id)) {
|
|
258
|
+
affectedOverrides.push(id);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
return {
|
|
263
|
+
key,
|
|
264
|
+
overrideIdentifier: overrideIdentifier,
|
|
265
|
+
otherAffectedOverrides: affectedOverrides,
|
|
266
|
+
oldValue,
|
|
267
|
+
newValue
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
protected removeOverride(key: string, overrideIdentifier: string | undefined, overrideValueId: number): void {
|
|
272
|
+
const overrideId = overrideIdentifier || NO_OVERRIDE;
|
|
273
|
+
const overrides = this.defaultOverrides.get(key);
|
|
274
|
+
if (overrides) {
|
|
275
|
+
const values = overrides.get(overrideId);
|
|
276
|
+
if (values) {
|
|
277
|
+
const index = values.findIndex(v => v[0] === overrideValueId);
|
|
278
|
+
if (index) {
|
|
279
|
+
const oldValue = this.getDefaultValue(key, overrideIdentifier);
|
|
280
|
+
values.splice(index, 1);
|
|
281
|
+
const newValue = this.getDefaultValue(key, overrideIdentifier);
|
|
282
|
+
if (!PreferenceUtils.deepEqual(oldValue, newValue)) {
|
|
283
|
+
|
|
284
|
+
const affectedOverrides = [];
|
|
285
|
+
if (!overrideIdentifier) {
|
|
286
|
+
for (const id of this._overrideIdentifiers) {
|
|
287
|
+
if (!overrides.has(id)) {
|
|
288
|
+
affectedOverrides.push(id);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
this.defaultValueChangedEmitter.fire({
|
|
294
|
+
key,
|
|
295
|
+
overrideIdentifier,
|
|
296
|
+
otherAffectedOverrides: affectedOverrides,
|
|
297
|
+
oldValue,
|
|
298
|
+
newValue
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
if (values.length === 0) {
|
|
303
|
+
overrides.delete(overrideId);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
if (overrides.size === 0) {
|
|
307
|
+
this.defaultOverrides.delete(key);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
getDefaultValue(key: string, overrideIdentifier: string | undefined): JSONValue | undefined {
|
|
313
|
+
const overrideId = overrideIdentifier || NO_OVERRIDE;
|
|
314
|
+
const overrides = this.defaultOverrides.get(key);
|
|
315
|
+
if (overrides) {
|
|
316
|
+
const values = overrides.get(overrideId);
|
|
317
|
+
if (values) {
|
|
318
|
+
return values[0][1]; // there will be no empty values arrays in the data structure
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
const property = this.properties.get(key);
|
|
323
|
+
return property?.default;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
inspectDefaultValue(key: string, overrideIdentifier: string | undefined): JSONValue | undefined {
|
|
327
|
+
const overrideId = overrideIdentifier || NO_OVERRIDE;
|
|
328
|
+
const overrides = this.defaultOverrides.get(key);
|
|
329
|
+
if (overrides) {
|
|
330
|
+
const values = overrides.get(overrideId);
|
|
331
|
+
if (values) {
|
|
332
|
+
return values[0][1]; // there will be no empty values arrays in the data structure
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
if (!overrideIdentifier) {
|
|
337
|
+
const property = this.properties.get(key);
|
|
338
|
+
return property?.default;
|
|
339
|
+
}
|
|
340
|
+
return undefined;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
getJSONSchema(scope: PreferenceScope): IJSONSchema {
|
|
344
|
+
return this.jsonSchemas[scope];
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
private setJSONSchemasProperty(key: string, property: PreferenceDataProperty): void {
|
|
348
|
+
for (const scope of this.validScopes) {
|
|
349
|
+
if (this.isValidInScope(key, scope)) {
|
|
350
|
+
this.setJSONSchemaProperty(this.jsonSchemas[scope], key, property);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
private deleteFromJSONSchemas(key: string, property: PreferenceDataProperty): void {
|
|
355
|
+
for (const scope of this.validScopes) {
|
|
356
|
+
if (this.isValidInScope(key, scope)) {
|
|
357
|
+
const schema = this.jsonSchemas[scope];
|
|
358
|
+
for (const name of Object.keys(schema.properties!)) {
|
|
359
|
+
if (name.match(OVERRIDE_PROPERTY)) {
|
|
360
|
+
const value = schema.properties![name] as IJSONSchema;
|
|
361
|
+
delete value.properties![key];
|
|
362
|
+
} else {
|
|
363
|
+
delete schema.properties![key];
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
private setJSONSchemaProperty(schema: IJSONSchema, key: string, property: PreferenceDataProperty): void {
|
|
371
|
+
// Add property to the schema
|
|
372
|
+
const prop = { ...property, default: this.getDefaultValue(key, undefined) };
|
|
373
|
+
schema.properties![key] = prop;
|
|
374
|
+
delete prop['scope'];
|
|
375
|
+
delete prop['overridable'];
|
|
376
|
+
if (property.overridable) {
|
|
377
|
+
for (const overrideIdentifier of this._overrideIdentifiers) {
|
|
378
|
+
const overrideSchema: IJSONSchema = schema.properties![`[${overrideIdentifier}]`] || {
|
|
379
|
+
type: 'object',
|
|
380
|
+
properties: {},
|
|
381
|
+
patternProperties: {},
|
|
382
|
+
additionalProperties: false
|
|
383
|
+
};
|
|
384
|
+
schema.properties![`[${overrideIdentifier}]`] = overrideSchema;
|
|
385
|
+
overrideSchema.properties![key] = { ...property, default: this.getDefaultValue(key, overrideIdentifier) };
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
addOverrideToJsonSchema(overrideIdentifier: string): void {
|
|
391
|
+
for (const scope of this.validScopes) {
|
|
392
|
+
const schema = this.jsonSchemas[scope];
|
|
393
|
+
const overrideSchema: IJSONSchema = {
|
|
394
|
+
type: 'object',
|
|
395
|
+
properties: {},
|
|
396
|
+
patternProperties: {},
|
|
397
|
+
additionalProperties: false
|
|
398
|
+
};
|
|
399
|
+
schema.properties![`[${overrideIdentifier}]`] = overrideSchema;
|
|
400
|
+
for (const [key, property] of this.properties.entries()) {
|
|
401
|
+
if (property.overridable && this.isValidInScope(key, scope)) {
|
|
402
|
+
overrideSchema.properties![key] = { ...property, default: this.getDefaultValue(key, overrideIdentifier) };
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
getDefaultValues(): JSONObject {
|
|
409
|
+
const result: JSONObject = {};
|
|
410
|
+
|
|
411
|
+
for (const [key, property] of this.properties.entries()) {
|
|
412
|
+
if (this.isValidInScope(key, PreferenceScope.Default)) {
|
|
413
|
+
if (property.default !== undefined) {
|
|
414
|
+
result[key] = property.default;
|
|
415
|
+
}
|
|
416
|
+
const overrides = this.defaultOverrides.get(key);
|
|
417
|
+
if (overrides) {
|
|
418
|
+
for (const [overrideId, values] of overrides.entries()) {
|
|
419
|
+
if (overrideId === NO_OVERRIDE) {
|
|
420
|
+
result[key] = values[0][1];
|
|
421
|
+
} else {
|
|
422
|
+
const overrideKey = `[${overrideId}]`;
|
|
423
|
+
const target: JSONObject = result[overrideKey] as JSONObject || {};
|
|
424
|
+
target[key] = values[0][1];
|
|
425
|
+
result[overrideKey] = target;
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
return result;
|
|
433
|
+
}
|
|
434
|
+
}
|