@opensumi/ide-core-browser 2.21.8-rc-1670567192.0 → 2.21.8
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/components/actions/index.d.ts.map +1 -1
- package/lib/components/actions/index.js +22 -2
- package/lib/components/actions/index.js.map +1 -1
- package/lib/components/tree/tree.module.less +0 -1
- package/lib/contextkey/testing.d.ts +0 -1
- package/lib/contextkey/testing.d.ts.map +1 -1
- package/lib/contextkey/testing.js +1 -2
- package/lib/contextkey/testing.js.map +1 -1
- package/lib/menu/next/menu.contrib.interface.d.ts +2 -3
- package/lib/menu/next/menu.contrib.interface.d.ts.map +1 -1
- package/lib/menu/next/menu.contrib.interface.js.map +1 -1
- package/lib/preferences/preference-configurations.js +1 -1
- package/lib/preferences/preference-configurations.js.map +1 -1
- package/lib/react-providers/config-provider.d.ts +0 -4
- package/lib/react-providers/config-provider.d.ts.map +1 -1
- package/lib/react-providers/config-provider.js.map +1 -1
- package/lib/services/storage-service.d.ts.map +1 -1
- package/lib/services/storage-service.js +1 -7
- package/lib/services/storage-service.js.map +1 -1
- package/lib/utils/label.d.ts.map +1 -1
- package/lib/utils/label.js +9 -16
- package/lib/utils/label.js.map +1 -1
- package/package.json +6 -7
- package/src/application/application-state-service.ts +0 -54
- package/src/application/application.service.ts +0 -51
- package/src/application/index.ts +0 -2
- package/src/authentication/authentication.contribution.ts +0 -35
- package/src/authentication/authentication.service.ts +0 -517
- package/src/bootstrap/app.ts +0 -745
- package/src/bootstrap/app.view.tsx +0 -88
- package/src/bootstrap/connection.ts +0 -116
- package/src/bootstrap/index.ts +0 -3
- package/src/bootstrap/inner-providers.ts +0 -297
- package/src/bootstrap/lifecycle.service.ts +0 -19
- package/src/browser-module.ts +0 -24
- package/src/common/common.command.ts +0 -977
- package/src/common/common.contribution.ts +0 -343
- package/src/common/common.define.ts +0 -55
- package/src/common/common.module.ts +0 -33
- package/src/common/common.storage.ts +0 -22
- package/src/common/container-id.ts +0 -12
- package/src/common/index.ts +0 -4
- package/src/components/actions/index.tsx +0 -486
- package/src/components/actions/placements.ts +0 -47
- package/src/components/actions/styles.module.less +0 -144
- package/src/components/badge/index.tsx +0 -1
- package/src/components/index.ts +0 -26
- package/src/components/layout/box-panel.tsx +0 -88
- package/src/components/layout/default-layout.tsx +0 -61
- package/src/components/layout/index.ts +0 -4
- package/src/components/layout/layout.ts +0 -80
- package/src/components/layout/split-panel.service.ts +0 -56
- package/src/components/layout/split-panel.tsx +0 -296
- package/src/components/layout/styles.module.less +0 -21
- package/src/components/loading/index.ts +0 -1
- package/src/components/loading/loading.less +0 -14
- package/src/components/loading/loading.view.tsx +0 -7
- package/src/components/loading/media/loading-dark.svg +0 -52
- package/src/components/loading/media/loading-hc.svg +0 -52
- package/src/components/loading/media/loading.svg +0 -52
- package/src/components/popover/styles.module.less +0 -81
- package/src/components/portal/index.tsx +0 -13
- package/src/components/progressbar/index.tsx +0 -16
- package/src/components/progressbar/styles.module.less +0 -31
- package/src/components/recycle-tree/index.ts +0 -1
- package/src/components/recycle-tree/recycle-tree.view.tsx +0 -368
- package/src/components/resize/resize.module.less +0 -78
- package/src/components/resize/resize.tsx +0 -663
- package/src/components/scroll/index.tsx +0 -386
- package/src/components/scroll/scroll.module.less +0 -108
- package/src/components/scrollbar/index.ts +0 -1
- package/src/components/scrollbar/scrollbar.less +0 -36
- package/src/components/scrollbar/scrollbar.view.ts +0 -8
- package/src/components/select/index.tsx +0 -12
- package/src/components/select/styles.less +0 -6
- package/src/components/tree/index.ts +0 -3
- package/src/components/tree/tree-node.view.tsx +0 -546
- package/src/components/tree/tree.module.less +0 -297
- package/src/components/tree/tree.view.tsx +0 -486
- package/src/context-key.ts +0 -48
- package/src/contextkey/dialog.ts +0 -3
- package/src/contextkey/explorer.ts +0 -26
- package/src/contextkey/index.ts +0 -6
- package/src/contextkey/outline.ts +0 -4
- package/src/contextkey/resource.ts +0 -61
- package/src/contextkey/terminal.ts +0 -7
- package/src/contextkey/testing.ts +0 -9
- package/src/contextkey/workspace.ts +0 -7
- package/src/core-preferences.ts +0 -318
- package/src/dom/index.ts +0 -176
- package/src/encoding-registry.ts +0 -83
- package/src/extensions/extensions-point.service.ts +0 -78
- package/src/extensions/index.ts +0 -3
- package/src/extensions/schema/browserViews.ts +0 -96
- package/src/extensions/schema/menu.ts +0 -245
- package/src/extensions/schema/opensumiExtensionPackageSchema.ts +0 -12
- package/src/extensions/schema/toolbar.ts +0 -338
- package/src/extensions/schema/vscodeExtensionPackageSchema.ts +0 -330
- package/src/fs/index.ts +0 -12
- package/src/hash-calculate/hash-calculate.contribution.ts +0 -19
- package/src/index.ts +0 -42
- package/src/keybinding/index.ts +0 -1
- package/src/keybinding/keybinding.ts +0 -908
- package/src/keyboard/index.ts +0 -3
- package/src/keyboard/keyboard-layout-provider.ts +0 -412
- package/src/keyboard/keyboard-layout-service.ts +0 -449
- package/src/keyboard/keys.ts +0 -748
- package/src/keyboard/layouts/_.contribution.ts +0 -24
- package/src/keyboard/layouts/cz.win.ts +0 -168
- package/src/keyboard/layouts/de-swiss.win.ts +0 -168
- package/src/keyboard/layouts/de.darwin.ts +0 -131
- package/src/keyboard/layouts/de.linux.ts +0 -186
- package/src/keyboard/layouts/de.win.ts +0 -168
- package/src/keyboard/layouts/dk.win.ts +0 -168
- package/src/keyboard/layouts/dvorak.darwin.ts +0 -131
- package/src/keyboard/layouts/en-belgian.win.ts +0 -168
- package/src/keyboard/layouts/en-ext.darwin.ts +0 -131
- package/src/keyboard/layouts/en-in.win.ts +0 -168
- package/src/keyboard/layouts/en-intl.darwin.ts +0 -131
- package/src/keyboard/layouts/en-intl.win.ts +0 -168
- package/src/keyboard/layouts/en-uk.darwin.ts +0 -131
- package/src/keyboard/layouts/en-uk.win.ts +0 -168
- package/src/keyboard/layouts/en.darwin.ts +0 -139
- package/src/keyboard/layouts/en.linux.ts +0 -186
- package/src/keyboard/layouts/en.win.ts +0 -173
- package/src/keyboard/layouts/es-latin.win.ts +0 -168
- package/src/keyboard/layouts/es.darwin.ts +0 -131
- package/src/keyboard/layouts/es.linux.ts +0 -186
- package/src/keyboard/layouts/es.win.ts +0 -168
- package/src/keyboard/layouts/fr.darwin.ts +0 -131
- package/src/keyboard/layouts/fr.linux.ts +0 -186
- package/src/keyboard/layouts/fr.win.ts +0 -168
- package/src/keyboard/layouts/hu.win.ts +0 -168
- package/src/keyboard/layouts/it.darwin.ts +0 -131
- package/src/keyboard/layouts/it.win.ts +0 -168
- package/src/keyboard/layouts/jp-roman.darwin.ts +0 -131
- package/src/keyboard/layouts/jp.darwin.ts +0 -131
- package/src/keyboard/layouts/ko.darwin.ts +0 -131
- package/src/keyboard/layouts/layout.contribution.darwin.ts +0 -23
- package/src/keyboard/layouts/layout.contribution.linux.ts +0 -12
- package/src/keyboard/layouts/layout.contribution.ts +0 -9
- package/src/keyboard/layouts/layout.contribution.win.ts +0 -29
- package/src/keyboard/layouts/no.win.ts +0 -168
- package/src/keyboard/layouts/pl.darwin.ts +0 -131
- package/src/keyboard/layouts/pl.win.ts +0 -168
- package/src/keyboard/layouts/pt-br.win.ts +0 -169
- package/src/keyboard/layouts/pt.darwin.ts +0 -131
- package/src/keyboard/layouts/pt.win.ts +0 -168
- package/src/keyboard/layouts/ru.darwin.ts +0 -131
- package/src/keyboard/layouts/ru.linux.ts +0 -186
- package/src/keyboard/layouts/ru.win.ts +0 -168
- package/src/keyboard/layouts/sv.darwin.ts +0 -131
- package/src/keyboard/layouts/sv.win.ts +0 -168
- package/src/keyboard/layouts/thai.win.ts +0 -168
- package/src/keyboard/layouts/tr.win.ts +0 -168
- package/src/keyboard/layouts/zh-hans.darwin.ts +0 -131
- package/src/layout/accordion/tab-bar-toolbar.tsx +0 -59
- package/src/layout/accordion/view-context-key.registry.ts +0 -34
- package/src/layout/constants.ts +0 -7
- package/src/layout/index.ts +0 -5
- package/src/layout/layout-hooks.ts +0 -68
- package/src/layout/layout-state.ts +0 -107
- package/src/layout/layout.interface.ts +0 -101
- package/src/layout/layout.ts +0 -80
- package/src/layout/view-id.ts +0 -18
- package/src/logger/browser-logger.ts +0 -51
- package/src/logger/index.ts +0 -1
- package/src/markdown/index.tsx +0 -62
- package/src/menu/next/base.ts +0 -513
- package/src/menu/next/ctxmenu-service.ts +0 -188
- package/src/menu/next/index.ts +0 -10
- package/src/menu/next/menu-id.ts +0 -86
- package/src/menu/next/menu-service.ts +0 -252
- package/src/menu/next/menu-util.ts +0 -77
- package/src/menu/next/menu.contrib.interface.ts +0 -79
- package/src/menu/next/menu.interface.ts +0 -253
- package/src/menu/next/menubar-service.ts +0 -211
- package/src/menu/next/renderer/ctxmenu/base.ts +0 -18
- package/src/menu/next/renderer/ctxmenu/browser.ts +0 -45
- package/src/menu/next/renderer/ctxmenu/electron.ts +0 -207
- package/src/menu/next/toolbar-action.service.ts +0 -132
- package/src/monaco/index.ts +0 -128
- package/src/opener/command-opener.ts +0 -42
- package/src/opener/default-opener.ts +0 -31
- package/src/opener/http-opener.ts +0 -25
- package/src/opener/index.ts +0 -19
- package/src/opener/opener.contribution.ts +0 -57
- package/src/opener/opener.service.ts +0 -66
- package/src/preferences/early-preferences.ts +0 -117
- package/src/preferences/index.ts +0 -9
- package/src/preferences/preference-configurations.ts +0 -77
- package/src/preferences/preference-contribution.ts +0 -401
- package/src/preferences/preference-provider.ts +0 -414
- package/src/preferences/preference-proxy.ts +0 -292
- package/src/preferences/preference-scope.ts +0 -3
- package/src/preferences/preference-service.ts +0 -571
- package/src/preferences/settings.ts +0 -53
- package/src/preferences/types.ts +0 -111
- package/src/progress/index.ts +0 -58
- package/src/progress/progress-bar.tsx +0 -22
- package/src/progress/progress-indicator.ts +0 -90
- package/src/progress/progress.module.less +0 -46
- package/src/progress/progress.service.tsx +0 -429
- package/src/quick-open/index.ts +0 -655
- package/src/quick-open/recent-files.ts +0 -68
- package/src/raw-context-key.ts +0 -116
- package/src/react-hooks/event.tsx +0 -80
- package/src/react-hooks/hot-key.tsx +0 -58
- package/src/react-hooks/index.ts +0 -3
- package/src/react-hooks/injectable-hooks.tsx +0 -35
- package/src/react-hooks/portal-hooks.tsx +0 -38
- package/src/react-providers/config-provider.tsx +0 -263
- package/src/react-providers/index.tsx +0 -2
- package/src/react-providers/slot.module.less +0 -19
- package/src/react-providers/slot.tsx +0 -242
- package/src/services/clipboard.service.ts +0 -97
- package/src/services/credentials-service.ts +0 -91
- package/src/services/crypto-service.ts +0 -23
- package/src/services/external-uri.service.ts +0 -68
- package/src/services/index.ts +0 -7
- package/src/services/label-service.ts +0 -386
- package/src/services/status-bar-service.ts +0 -108
- package/src/services/storage-service.ts +0 -197
- package/src/style/codicons/README.md +0 -22
- package/src/style/codicons/codicon-animations.css +0 -15
- package/src/style/codicons/generator.js +0 -15
- package/src/style/entry.less +0 -25
- package/src/style/icon/fileicons/file-default.svg +0 -1
- package/src/style/icon/fileicons/folder-default.svg +0 -1
- package/src/style/icon/fileicons.less +0 -20
- package/src/style/icon/icon.ts +0 -543
- package/src/style/icon/ide-iconfont.ts +0 -13
- package/src/style/icon/index.less +0 -54
- package/src/style/icon/seti.woff +0 -0
- package/src/style/icon/symbol-icons/boolean-dark.svg +0 -3
- package/src/style/icon/symbol-icons/boolean-light.svg +0 -3
- package/src/style/icon/symbol-icons/class-dark.svg +0 -3
- package/src/style/icon/symbol-icons/class-light.svg +0 -3
- package/src/style/icon/symbol-icons/constant-dark.svg +0 -4
- package/src/style/icon/symbol-icons/constant-light.svg +0 -4
- package/src/style/icon/symbol-icons/enumerator-dark.svg +0 -3
- package/src/style/icon/symbol-icons/enumerator-item-dark.svg +0 -3
- package/src/style/icon/symbol-icons/enumerator-item-light.svg +0 -3
- package/src/style/icon/symbol-icons/enumerator-light.svg +0 -3
- package/src/style/icon/symbol-icons/event-dark.svg +0 -3
- package/src/style/icon/symbol-icons/event-light.svg +0 -3
- package/src/style/icon/symbol-icons/field-dark.svg +0 -3
- package/src/style/icon/symbol-icons/field-light.svg +0 -3
- package/src/style/icon/symbol-icons/file-dark.svg +0 -3
- package/src/style/icon/symbol-icons/file-light.svg +0 -3
- package/src/style/icon/symbol-icons/indexer-dark.svg +0 -3
- package/src/style/icon/symbol-icons/indexer-light.svg +0 -3
- package/src/style/icon/symbol-icons/interface-dark.svg +0 -3
- package/src/style/icon/symbol-icons/interface-light.svg +0 -3
- package/src/style/icon/symbol-icons/keyword-dark.svg +0 -3
- package/src/style/icon/symbol-icons/keyword-light.svg +0 -3
- package/src/style/icon/symbol-icons/method-dark.svg +0 -3
- package/src/style/icon/symbol-icons/method-light.svg +0 -3
- package/src/style/icon/symbol-icons/namespace-dark.svg +0 -3
- package/src/style/icon/symbol-icons/namespace-light.svg +0 -3
- package/src/style/icon/symbol-icons/numeric-dark.svg +0 -3
- package/src/style/icon/symbol-icons/numeric-light.svg +0 -3
- package/src/style/icon/symbol-icons/operator-dark.svg +0 -3
- package/src/style/icon/symbol-icons/operator-light.svg +0 -3
- package/src/style/icon/symbol-icons/property-dark.svg +0 -3
- package/src/style/icon/symbol-icons/property-light.svg +0 -3
- package/src/style/icon/symbol-icons/snippet-dark.svg +0 -3
- package/src/style/icon/symbol-icons/snippet-light.svg +0 -3
- package/src/style/icon/symbol-icons/string-dark.svg +0 -3
- package/src/style/icon/symbol-icons/string-light.svg +0 -3
- package/src/style/icon/symbol-icons/structure-dark.svg +0 -3
- package/src/style/icon/symbol-icons/structure-light.svg +0 -3
- package/src/style/icon/symbol-icons/symbol-icons.css +0 -284
- package/src/style/icon/symbol-icons/template-dark.svg +0 -3
- package/src/style/icon/symbol-icons/template-light.svg +0 -3
- package/src/style/icon/symbol-icons/variable-dark.svg +0 -3
- package/src/style/icon/symbol-icons/variable-light.svg +0 -3
- package/src/style/icon.less +0 -8
- package/src/style/index.less +0 -14
- package/src/style/monaco-override.less +0 -116
- package/src/style/normalize.less +0 -92
- package/src/style/octicons/octicons-cdn.css +0 -720
- package/src/style/octicons/octicons.css +0 -714
- package/src/style/octicons/octicons.html +0 -1882
- package/src/style/octicons/octicons.svg +0 -582
- package/src/style/octicons/octicons.ttf +0 -0
- package/src/style/override.less +0 -97
- package/src/style/toolbar.less +0 -199
- package/src/style/utilities.less +0 -8
- package/src/style/variable.less +0 -8
- package/src/terminal/index.ts +0 -7
- package/src/toolbar/components/auto-complete.tsx +0 -0
- package/src/toolbar/components/button.tsx +0 -440
- package/src/toolbar/components/index.ts +0 -2
- package/src/toolbar/components/select.tsx +0 -189
- package/src/toolbar/index.ts +0 -3
- package/src/toolbar/toolbar.popover.registry.ts +0 -32
- package/src/toolbar/toolbar.registry.ts +0 -352
- package/src/toolbar/toolbar.tsx +0 -710
- package/src/toolbar/types.ts +0 -383
- package/src/tree/index.ts +0 -3
- package/src/tree/tree-expansion.ts +0 -25
- package/src/tree/tree-selection.ts +0 -89
- package/src/tree/tree.ts +0 -294
- package/src/utils/create-overlay.tsx +0 -53
- package/src/utils/electron.ts +0 -92
- package/src/utils/env.ts +0 -26
- package/src/utils/icon.ts +0 -13
- package/src/utils/index.ts +0 -7
- package/src/utils/json.ts +0 -251
- package/src/utils/label.tsx +0 -36
- package/src/utils/parse.ts +0 -72
- package/src/utils/react-hooks.ts +0 -118
- package/src/variable/index.ts +0 -1
- package/src/variable/variable.ts +0 -84
- package/src/window/index.ts +0 -34
- package/src/window/window.service.ts +0 -100
|
@@ -1,414 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@opensumi/di';
|
|
2
|
-
import {
|
|
3
|
-
IDisposable,
|
|
4
|
-
DisposableCollection,
|
|
5
|
-
Emitter,
|
|
6
|
-
Event,
|
|
7
|
-
URI,
|
|
8
|
-
Deferred,
|
|
9
|
-
isEmptyObject,
|
|
10
|
-
FileStat,
|
|
11
|
-
} from '@opensumi/ide-core-common';
|
|
12
|
-
import { PreferenceScope } from '@opensumi/ide-core-common/lib/preferences/preference-scope';
|
|
13
|
-
|
|
14
|
-
import { JSONUtils, JSONValue } from '../utils';
|
|
15
|
-
|
|
16
|
-
import { getExternalPreferenceProvider, getAllExternalProviders } from './early-preferences';
|
|
17
|
-
import { PreferenceResolveResult } from './types';
|
|
18
|
-
export interface IResolvedPreferences {
|
|
19
|
-
default: { [key: string]: any };
|
|
20
|
-
languageSpecific: {
|
|
21
|
-
[languageId: string]: { [key: string]: any };
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
export interface PreferenceProviderDataChange {
|
|
25
|
-
readonly preferenceName: string;
|
|
26
|
-
readonly newValue?: any;
|
|
27
|
-
readonly oldValue?: any;
|
|
28
|
-
readonly scope: PreferenceScope;
|
|
29
|
-
readonly domain?: string[];
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export interface PreferenceProviderDataChanges {
|
|
33
|
-
default: {
|
|
34
|
-
[preferenceName: string]: PreferenceProviderDataChange;
|
|
35
|
-
};
|
|
36
|
-
languageSpecific: ILanguagePreferenceProviderDataChanges;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export interface ILanguagePreferenceProviderDataChanges {
|
|
40
|
-
[languageId: string]: {
|
|
41
|
-
[preferenceName: string]: PreferenceProviderDataChange;
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
function transformReverse(delegates: {
|
|
46
|
-
[delegated: string]: {
|
|
47
|
-
delegateTo: string;
|
|
48
|
-
transform?: (delegateValue: any) => any;
|
|
49
|
-
};
|
|
50
|
-
}): {
|
|
51
|
-
[delegated: string]: {
|
|
52
|
-
delegated: string;
|
|
53
|
-
delegateTo: string;
|
|
54
|
-
transform?: (delegateValue: any) => any;
|
|
55
|
-
};
|
|
56
|
-
} {
|
|
57
|
-
const res = {};
|
|
58
|
-
for (const key of Object.keys(delegates)) {
|
|
59
|
-
res[delegates[key].delegateTo] = {
|
|
60
|
-
delegated: key,
|
|
61
|
-
...delegates[key],
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
return res;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
@Injectable()
|
|
68
|
-
export abstract class PreferenceProvider implements IDisposable {
|
|
69
|
-
public readonly name: string;
|
|
70
|
-
|
|
71
|
-
private readonly onDidPreferencesChangedEmitter = new Emitter<PreferenceProviderDataChanges>();
|
|
72
|
-
public readonly onDidPreferencesChanged: Event<PreferenceProviderDataChanges> =
|
|
73
|
-
this.onDidPreferencesChangedEmitter.event;
|
|
74
|
-
|
|
75
|
-
protected readonly toDispose = new DisposableCollection();
|
|
76
|
-
|
|
77
|
-
protected readonly _ready = new Deferred<void>();
|
|
78
|
-
|
|
79
|
-
public resource: Promise<FileStat | void>;
|
|
80
|
-
|
|
81
|
-
private _scope: PreferenceScope;
|
|
82
|
-
|
|
83
|
-
// preferenceDelegate 原则, delegate值优先,不改变原有 delegateTo 的行为
|
|
84
|
-
// 1. 当修改 delegate 设置值发生改变时,同时发出 delegate 和 delegateTo 的 change 事件。
|
|
85
|
-
// 2. 当尝试获取 delegateTo 的值时,会尝试先获取 delegate 的值,如果没有值,继续原来的逻辑。
|
|
86
|
-
// 3. 当尝试修改 delegateTo 的值时,删除 delegate 的值
|
|
87
|
-
// 4. 当尝试获取 delegate 的值时,如果 delegate 没有值, 尝试获取 delegateTo 的值
|
|
88
|
-
// 5. schema 只会检测改变后 delegatedTo 的值
|
|
89
|
-
// 6. 不对语言特定的设置生效
|
|
90
|
-
static PreferenceDelegates: {
|
|
91
|
-
[delegated: string]: {
|
|
92
|
-
delegateTo: string;
|
|
93
|
-
transform?: (delegatedValue: any) => any;
|
|
94
|
-
transformFrom?: (delegatedToValue: any) => any;
|
|
95
|
-
};
|
|
96
|
-
} = {
|
|
97
|
-
'workbench.colorTheme': {
|
|
98
|
-
delegateTo: 'general.theme',
|
|
99
|
-
},
|
|
100
|
-
};
|
|
101
|
-
|
|
102
|
-
static PreferenceDelegatesReverse: {
|
|
103
|
-
[delegated: string]: {
|
|
104
|
-
delegated: string;
|
|
105
|
-
delegateTo: string;
|
|
106
|
-
transform?: (delegatedValue: any) => any;
|
|
107
|
-
transformFrom?: (delegatedToValue: any) => any;
|
|
108
|
-
};
|
|
109
|
-
} = transformReverse(PreferenceProvider.PreferenceDelegates);
|
|
110
|
-
|
|
111
|
-
constructor() {
|
|
112
|
-
this.toDispose.push(this.onDidPreferencesChangedEmitter);
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
public asScope(scope: PreferenceScope) {
|
|
116
|
-
if (typeof this._scope !== 'undefined') {
|
|
117
|
-
return;
|
|
118
|
-
}
|
|
119
|
-
this._scope = scope;
|
|
120
|
-
// 如果 external provider 有监听器,监听
|
|
121
|
-
getAllExternalProviders().forEach(([preferenceName, provider]) => {
|
|
122
|
-
if (provider.onDidChange) {
|
|
123
|
-
provider.onDidChange((e) => {
|
|
124
|
-
if (e.scope === this._scope) {
|
|
125
|
-
this.emitPreferencesChangedEvent(
|
|
126
|
-
[
|
|
127
|
-
{
|
|
128
|
-
preferenceName,
|
|
129
|
-
scope: e.scope,
|
|
130
|
-
newValue: e.newValue,
|
|
131
|
-
oldValue: e.oldValue,
|
|
132
|
-
},
|
|
133
|
-
],
|
|
134
|
-
true,
|
|
135
|
-
);
|
|
136
|
-
}
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
});
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
public dispose(): void {
|
|
143
|
-
this.toDispose.dispose();
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
* 处理事件监听中接收到的Event数据对象
|
|
148
|
-
* 以便后续接收到数据后能确认来自那个配置项的值
|
|
149
|
-
*/
|
|
150
|
-
protected emitPreferencesChangedEvent(
|
|
151
|
-
changes: PreferenceProviderDataChanges | PreferenceProviderDataChange[],
|
|
152
|
-
noFilterExternal?: boolean,
|
|
153
|
-
): boolean {
|
|
154
|
-
let prefChanges: PreferenceProviderDataChanges;
|
|
155
|
-
if (Array.isArray(changes)) {
|
|
156
|
-
prefChanges = { default: {}, languageSpecific: {} };
|
|
157
|
-
for (const change of changes) {
|
|
158
|
-
prefChanges.default[change.preferenceName] = change;
|
|
159
|
-
}
|
|
160
|
-
} else {
|
|
161
|
-
prefChanges = changes;
|
|
162
|
-
}
|
|
163
|
-
if (typeof this._scope !== 'undefined') {
|
|
164
|
-
const preferenceNames = Object.keys(prefChanges.default);
|
|
165
|
-
// 只对scope preference provider做处理
|
|
166
|
-
for (const preferenceName of preferenceNames) {
|
|
167
|
-
const change = prefChanges.default[preferenceName];
|
|
168
|
-
if (PreferenceProvider.PreferenceDelegates[change.preferenceName]) {
|
|
169
|
-
const delegate = PreferenceProvider.PreferenceDelegates[change.preferenceName];
|
|
170
|
-
if (this.get(delegate.delegateTo) !== undefined && this.get(change.preferenceName) === undefined) {
|
|
171
|
-
// 这种情况不发出 delegateTo 的改变
|
|
172
|
-
} else {
|
|
173
|
-
prefChanges.default[delegate.delegateTo] = {
|
|
174
|
-
...change,
|
|
175
|
-
oldValue: undefined,
|
|
176
|
-
newValue:
|
|
177
|
-
change.newValue !== undefined
|
|
178
|
-
? delegate.transform
|
|
179
|
-
? delegate.transform(change.newValue)
|
|
180
|
-
: change.newValue
|
|
181
|
-
: undefined,
|
|
182
|
-
preferenceName: delegate.delegateTo,
|
|
183
|
-
};
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
if (!noFilterExternal && !!getExternalPreferenceProvider(preferenceName)) {
|
|
187
|
-
// 过滤externalProvider管理的preference
|
|
188
|
-
delete prefChanges.default[preferenceName];
|
|
189
|
-
}
|
|
190
|
-
if (change.oldValue === change.newValue) {
|
|
191
|
-
delete prefChanges.default[preferenceName];
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
if (prefChanges && !isEmptyObject(prefChanges)) {
|
|
196
|
-
this.onDidPreferencesChangedEmitter.fire(prefChanges);
|
|
197
|
-
return true;
|
|
198
|
-
}
|
|
199
|
-
return false;
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
// @final 不要 override 这个
|
|
203
|
-
public get<T>(preferenceName: string, resourceUri?: string, language?: string): T | undefined {
|
|
204
|
-
if (PreferenceProvider.PreferenceDelegatesReverse[preferenceName]) {
|
|
205
|
-
const res = this.getDelegateToValueFromDelegated(preferenceName);
|
|
206
|
-
if (res !== undefined) {
|
|
207
|
-
return res;
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
const value = this.getWithoutDelegate<T>(preferenceName, resourceUri, language);
|
|
211
|
-
if (value === undefined && PreferenceProvider.PreferenceDelegates[preferenceName]) {
|
|
212
|
-
return this.getDelegatedValueFromDelegateTo(preferenceName);
|
|
213
|
-
} else {
|
|
214
|
-
return value;
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
public getWithoutDelegate<T>(preferenceName: string, resourceUri?: string, language?: string): T | undefined {
|
|
219
|
-
if (typeof this._scope !== 'undefined') {
|
|
220
|
-
const externalProvider = getExternalPreferenceProvider(preferenceName);
|
|
221
|
-
if (externalProvider) {
|
|
222
|
-
return externalProvider.get(this._scope);
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
return this.doGet<T>(preferenceName, resourceUri, language);
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
// 从delegateTo 获取 delegated
|
|
229
|
-
private getDelegatedValueFromDelegateTo(delegatedPreferenceName: string) {
|
|
230
|
-
const delegate = PreferenceProvider.PreferenceDelegates[delegatedPreferenceName];
|
|
231
|
-
const value = this.getWithoutDelegate(delegate!.delegateTo);
|
|
232
|
-
if (delegate.transformFrom) {
|
|
233
|
-
return delegate.transformFrom(value);
|
|
234
|
-
} else {
|
|
235
|
-
return value;
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
// 从delegate 获取 delegateTo
|
|
240
|
-
private getDelegateToValueFromDelegated(delegateToPreferenceName: string) {
|
|
241
|
-
const delegate = PreferenceProvider.PreferenceDelegatesReverse[delegateToPreferenceName];
|
|
242
|
-
const value = this.getWithoutDelegate(delegate!.delegated);
|
|
243
|
-
if (delegate.transform) {
|
|
244
|
-
return delegate.transform(value);
|
|
245
|
-
} else {
|
|
246
|
-
return value;
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
protected doGet<T>(preferenceName: string, resourceUri?: string, language?: string): T | undefined {
|
|
251
|
-
return this.doResolve<T>(preferenceName, resourceUri, language).value;
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
// @final 不要 override 这个
|
|
255
|
-
public resolve<T>(preferenceName: string, resourceUri?: string, language?: string): PreferenceResolveResult<T> {
|
|
256
|
-
if (PreferenceProvider.PreferenceDelegatesReverse[preferenceName]) {
|
|
257
|
-
const res = this.getDelegateToValueFromDelegated(preferenceName);
|
|
258
|
-
if (res !== undefined) {
|
|
259
|
-
return { value: res, scope: this._scope }; // FIXME: 这里好像scope有点问题,暂时不影响
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
if (typeof this._scope !== 'undefined') {
|
|
263
|
-
const externalProvider = getExternalPreferenceProvider(preferenceName);
|
|
264
|
-
if (externalProvider) {
|
|
265
|
-
return {
|
|
266
|
-
value: externalProvider.get(this._scope),
|
|
267
|
-
scope: this._scope,
|
|
268
|
-
};
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
const res = this.doResolve<T>(preferenceName, resourceUri, language);
|
|
272
|
-
if (res.value === undefined && PreferenceProvider.PreferenceDelegates[preferenceName]) {
|
|
273
|
-
return { value: this.getDelegatedValueFromDelegateTo(preferenceName), scope: this._scope }; // FIXME: 这里好像scope有点问题,暂时不影响
|
|
274
|
-
} else {
|
|
275
|
-
return res;
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
protected doResolve<T>(preferenceName: string, resourceUri?: string, language?: string): PreferenceResolveResult<T> {
|
|
280
|
-
const preferences = this.getPreferences(resourceUri, language);
|
|
281
|
-
if (!preferences) {
|
|
282
|
-
return {};
|
|
283
|
-
}
|
|
284
|
-
const value = preferences[preferenceName];
|
|
285
|
-
if (value !== undefined) {
|
|
286
|
-
return {
|
|
287
|
-
value,
|
|
288
|
-
configUri: this.getConfigUri(resourceUri),
|
|
289
|
-
};
|
|
290
|
-
}
|
|
291
|
-
return {};
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
/**
|
|
295
|
-
* 获取制定资源或语言的所有配置,当返回值为undefined时代表无应资源或语言配置
|
|
296
|
-
*
|
|
297
|
-
* @abstract
|
|
298
|
-
* @param {string} [resourceUri] 资源路径
|
|
299
|
-
* @param {string} [language] 语言标识符
|
|
300
|
-
* @returns {({ [p: string]: any } | undefined)}
|
|
301
|
-
* @memberof PreferenceProvider
|
|
302
|
-
*/
|
|
303
|
-
public abstract getPreferences(resourceUri?: string, language?: string): { [p: string]: any } | undefined;
|
|
304
|
-
|
|
305
|
-
/**
|
|
306
|
-
* 获取制定资源或语言的所有语言配置,当返回值为undefined时代表无对应资源或语言配置
|
|
307
|
-
*
|
|
308
|
-
* @abstract
|
|
309
|
-
* @param {string} [resourceUri] 资源路径
|
|
310
|
-
* @param {string} [language] 语言标识符
|
|
311
|
-
* @returns {({ [language: string]: {[p: string]: any} } | undefined)}
|
|
312
|
-
* @memberof PreferenceProvider
|
|
313
|
-
*/
|
|
314
|
-
public abstract getLanguagePreferences(
|
|
315
|
-
resourceUri?: string,
|
|
316
|
-
language?: string,
|
|
317
|
-
): { [language: string]: { [p: string]: any } } | undefined;
|
|
318
|
-
|
|
319
|
-
public async setPreference(
|
|
320
|
-
preferenceName: string,
|
|
321
|
-
value: any,
|
|
322
|
-
resourceUri?: string,
|
|
323
|
-
language?: string,
|
|
324
|
-
): Promise<boolean> {
|
|
325
|
-
// 对于我们 workbench.colorTheme -> general.theme 这种托管,
|
|
326
|
-
// 修改 workbench.colorTheme 为 'themeA' 的时候,get('general.theme'),会首先查看 workbench.colorTheme,
|
|
327
|
-
// 如果有值,则采用 workbench.colorTheme, 而不管配置文件中是否 general.theme 有值,
|
|
328
|
-
// 换言之,在 workbench.colorTheme 有值的情况下,general.theme 无论怎么修改都是无效的,
|
|
329
|
-
// 因此如果 setPreference('general.theme', 'themeA' ) 的话,必须先把 workbench.colorTheme 置空才能生效。
|
|
330
|
-
//
|
|
331
|
-
// 这种情况下,插件进程的 vscode.workspace.onDidConfigurationChange 会触发两次事件变化
|
|
332
|
-
// 一个为 general.theme, 一个为workbench.colorTheme
|
|
333
|
-
if (PreferenceProvider.PreferenceDelegatesReverse[preferenceName]) {
|
|
334
|
-
// 将delegate置空
|
|
335
|
-
const delegate = PreferenceProvider.PreferenceDelegatesReverse[preferenceName];
|
|
336
|
-
await this.setPreference(delegate.delegated, undefined);
|
|
337
|
-
}
|
|
338
|
-
if (typeof this._scope !== 'undefined') {
|
|
339
|
-
const externalProvider = getExternalPreferenceProvider(preferenceName);
|
|
340
|
-
if (externalProvider) {
|
|
341
|
-
try {
|
|
342
|
-
const oldValue = externalProvider.get(this._scope);
|
|
343
|
-
await externalProvider.set(value, this._scope);
|
|
344
|
-
// 如果外部provider没有监听器,帮助他发送改变事件
|
|
345
|
-
if (!externalProvider.onDidChange) {
|
|
346
|
-
this.emitPreferencesChangedEvent(
|
|
347
|
-
[
|
|
348
|
-
{
|
|
349
|
-
preferenceName,
|
|
350
|
-
scope: this._scope,
|
|
351
|
-
oldValue,
|
|
352
|
-
newValue: externalProvider.get(this._scope),
|
|
353
|
-
},
|
|
354
|
-
],
|
|
355
|
-
true,
|
|
356
|
-
);
|
|
357
|
-
}
|
|
358
|
-
return true;
|
|
359
|
-
} catch (e) {
|
|
360
|
-
return false;
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
return await this.doSetPreference(preferenceName, value, resourceUri, language);
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
protected abstract doSetPreference(
|
|
368
|
-
preferenceName: string,
|
|
369
|
-
value: any,
|
|
370
|
-
resourceUri?: string,
|
|
371
|
-
language?: string,
|
|
372
|
-
): Promise<boolean>;
|
|
373
|
-
|
|
374
|
-
/**
|
|
375
|
-
* 返回promise,当 preference provider 已经可以提供配置时返回resolved
|
|
376
|
-
*/
|
|
377
|
-
get ready() {
|
|
378
|
-
return this._ready.promise;
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
/**
|
|
382
|
-
* 默认返回undefined
|
|
383
|
-
*/
|
|
384
|
-
public getDomain(): string[] | undefined {
|
|
385
|
-
return undefined;
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
/**
|
|
389
|
-
* 默认返回undefined
|
|
390
|
-
*/
|
|
391
|
-
public getConfigUri(resourceUri?: string): URI | undefined {
|
|
392
|
-
return undefined;
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
public static merge(source: JSONValue | undefined, target: JSONValue): JSONValue {
|
|
396
|
-
if (source === undefined || !JSONUtils.isObject(source)) {
|
|
397
|
-
return JSONUtils.deepCopy(target);
|
|
398
|
-
}
|
|
399
|
-
if (JSONUtils.isPrimitive(target)) {
|
|
400
|
-
return {};
|
|
401
|
-
}
|
|
402
|
-
for (const key of Object.keys(target)) {
|
|
403
|
-
const value = (target as any)[key];
|
|
404
|
-
if (key in source) {
|
|
405
|
-
if (JSONUtils.isObject(source[key]) && JSONUtils.isObject(value)) {
|
|
406
|
-
this.merge(source[key], value);
|
|
407
|
-
continue;
|
|
408
|
-
}
|
|
409
|
-
}
|
|
410
|
-
source[key] = JSONUtils.deepCopy(value);
|
|
411
|
-
}
|
|
412
|
-
return source;
|
|
413
|
-
}
|
|
414
|
-
}
|
|
@@ -1,292 +0,0 @@
|
|
|
1
|
-
import { Disposable, Event, isObject, isUndefined, PreferenceScope } from '@opensumi/ide-core-common';
|
|
2
|
-
|
|
3
|
-
import { PreferenceSchema } from './preference-contribution';
|
|
4
|
-
import { PreferenceService } from './types';
|
|
5
|
-
|
|
6
|
-
export interface PreferenceChangeEvent<T> {
|
|
7
|
-
readonly preferenceName: keyof T;
|
|
8
|
-
readonly newValue?: T[keyof T];
|
|
9
|
-
readonly oldValue?: T[keyof T];
|
|
10
|
-
affects(resourceUri?: string, overrideIdentifier?: string): boolean;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export interface PreferenceProxyOptions {
|
|
14
|
-
/**
|
|
15
|
-
* 所有配置的默认前缀
|
|
16
|
-
*/
|
|
17
|
-
prefix?: string;
|
|
18
|
-
/**
|
|
19
|
-
* 获取或设置配置的默认资源路径
|
|
20
|
-
*/
|
|
21
|
-
resourceUri?: string;
|
|
22
|
-
/**
|
|
23
|
-
* 对齐VSCode实现,overrideIdentifier主要用于实现针对不同编辑器设置不同配置的能力
|
|
24
|
-
* 与原有的language设定一致
|
|
25
|
-
*
|
|
26
|
-
* 如 [markdown].editor.autoIndent、[json].editor.autoIndent 及 editor.autoIndent 等
|
|
27
|
-
*/
|
|
28
|
-
overrideIdentifier?: string;
|
|
29
|
-
/**
|
|
30
|
-
* 用来指代获取一个配置时是否为“平面含义”上的获取
|
|
31
|
-
*
|
|
32
|
-
* 如:
|
|
33
|
-
* a.b.c 在flat模式下为单个配置的值
|
|
34
|
-
* deep模式下则可以为 a 配置下的 b 配置下的 c 的值
|
|
35
|
-
* both指代同时在两种配置模式下检索值
|
|
36
|
-
*/
|
|
37
|
-
style?: 'flat' | 'deep' | 'both';
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export interface PreferenceEventEmitter<T> {
|
|
41
|
-
readonly onPreferenceChanged: Event<PreferenceChangeEvent<T>>;
|
|
42
|
-
readonly ready: Promise<void>;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
export interface PreferenceRetrieval<T> {
|
|
46
|
-
get<K extends keyof T>(preferenceName: K, defaultValue?: T[K], resourceUri?: string): T[K];
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
export type PreferenceProxy<T> = Readonly<T> & Disposable & PreferenceEventEmitter<T> & PreferenceRetrieval<T>;
|
|
50
|
-
|
|
51
|
-
export function createPreferenceProxy<T>(
|
|
52
|
-
preferences: PreferenceService,
|
|
53
|
-
schema: PreferenceSchema,
|
|
54
|
-
options?: PreferenceProxyOptions,
|
|
55
|
-
): PreferenceProxy<T> {
|
|
56
|
-
const opts = options || {};
|
|
57
|
-
const prefix = opts.prefix || '';
|
|
58
|
-
const style = opts.style || 'flat';
|
|
59
|
-
const isDeep = style === 'deep' || style === 'both';
|
|
60
|
-
const isFlat = style === 'both' || style === 'flat';
|
|
61
|
-
const onPreferenceChanged = (
|
|
62
|
-
listener: (e: PreferenceChangeEvent<T>) => any,
|
|
63
|
-
thisArgs?: any,
|
|
64
|
-
disposables?: Disposable[],
|
|
65
|
-
) => {
|
|
66
|
-
const disposer = new Disposable();
|
|
67
|
-
disposer.addDispose(
|
|
68
|
-
preferences.onPreferencesChanged(
|
|
69
|
-
(changes) => {
|
|
70
|
-
for (const key of Object.keys(changes)) {
|
|
71
|
-
const e = changes[key];
|
|
72
|
-
const preferenceName: any = e.preferenceName;
|
|
73
|
-
if (preferenceName.startsWith(prefix)) {
|
|
74
|
-
if (schema.properties[preferenceName]) {
|
|
75
|
-
if (opts.resourceUri) {
|
|
76
|
-
if (e.affects(opts.resourceUri)) {
|
|
77
|
-
if (
|
|
78
|
-
opts.overrideIdentifier &&
|
|
79
|
-
!preferences.hasLanguageSpecific(preferenceName, opts.overrideIdentifier, opts.resourceUri)
|
|
80
|
-
) {
|
|
81
|
-
continue;
|
|
82
|
-
}
|
|
83
|
-
listener(e as any);
|
|
84
|
-
}
|
|
85
|
-
} else {
|
|
86
|
-
listener(e as any);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
},
|
|
92
|
-
thisArgs,
|
|
93
|
-
disposables,
|
|
94
|
-
),
|
|
95
|
-
);
|
|
96
|
-
// 添加语言相关 changes 变更
|
|
97
|
-
if (opts.overrideIdentifier) {
|
|
98
|
-
disposer.addDispose(
|
|
99
|
-
preferences.onLanguagePreferencesChanged(
|
|
100
|
-
(event) => {
|
|
101
|
-
if (event.overrideIdentifier === opts.overrideIdentifier) {
|
|
102
|
-
for (const key of Object.keys(event.changes)) {
|
|
103
|
-
const e = event.changes[key];
|
|
104
|
-
const preferenceName: any = e.preferenceName;
|
|
105
|
-
if (preferenceName.startsWith(prefix)) {
|
|
106
|
-
if (schema.properties[preferenceName]) {
|
|
107
|
-
if (opts.resourceUri) {
|
|
108
|
-
if (e.affects(opts.resourceUri)) {
|
|
109
|
-
listener(e as any);
|
|
110
|
-
}
|
|
111
|
-
} else {
|
|
112
|
-
listener(e as any);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
},
|
|
119
|
-
thisArgs,
|
|
120
|
-
disposables,
|
|
121
|
-
),
|
|
122
|
-
);
|
|
123
|
-
}
|
|
124
|
-
return disposer;
|
|
125
|
-
};
|
|
126
|
-
|
|
127
|
-
const unsupportedOperation = (_: any, __: string) => {
|
|
128
|
-
throw new Error('Unsupported operation');
|
|
129
|
-
};
|
|
130
|
-
|
|
131
|
-
const getValue: PreferenceRetrieval<any>['get'] = (
|
|
132
|
-
preferenceName: any,
|
|
133
|
-
defaultValue,
|
|
134
|
-
resourceUri,
|
|
135
|
-
overrideIdentifier?: string,
|
|
136
|
-
) =>
|
|
137
|
-
preferences.get(
|
|
138
|
-
preferenceName,
|
|
139
|
-
defaultValue,
|
|
140
|
-
resourceUri || opts.resourceUri,
|
|
141
|
-
overrideIdentifier || opts.overrideIdentifier,
|
|
142
|
-
);
|
|
143
|
-
|
|
144
|
-
const ownKeys: () => string[] = () => {
|
|
145
|
-
const properties: string[] = [];
|
|
146
|
-
for (const p of Object.keys(schema.properties)) {
|
|
147
|
-
if (p.startsWith(prefix)) {
|
|
148
|
-
const idx = p.indexOf('.', prefix.length);
|
|
149
|
-
if (idx !== -1 && isDeep) {
|
|
150
|
-
const pre = p.substr(prefix.length, idx - prefix.length);
|
|
151
|
-
if (properties.indexOf(pre) === -1) {
|
|
152
|
-
properties.push(pre);
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
const prop = p.substr(prefix.length);
|
|
156
|
-
if (isFlat || prop.indexOf('.') === -1) {
|
|
157
|
-
properties.push(prop);
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
return properties;
|
|
162
|
-
};
|
|
163
|
-
|
|
164
|
-
const set: (target: any, prop: string, value: any, receiver: any) => boolean = (
|
|
165
|
-
_,
|
|
166
|
-
property: string | symbol | number,
|
|
167
|
-
value: any,
|
|
168
|
-
) => {
|
|
169
|
-
if (typeof property !== 'string') {
|
|
170
|
-
throw new Error(`unexpected property: ${String(property)}`);
|
|
171
|
-
}
|
|
172
|
-
if (style === 'deep' && property.indexOf('.') !== -1) {
|
|
173
|
-
return false;
|
|
174
|
-
}
|
|
175
|
-
const fullProperty = prefix ? prefix + property : property;
|
|
176
|
-
if (schema.properties[fullProperty]) {
|
|
177
|
-
preferences.set(fullProperty, value, PreferenceScope.Default);
|
|
178
|
-
return true;
|
|
179
|
-
}
|
|
180
|
-
const newPrefix = fullProperty + '.';
|
|
181
|
-
for (const p of Object.keys(schema.properties)) {
|
|
182
|
-
if (p.startsWith(newPrefix)) {
|
|
183
|
-
const subProxy: { [k: string]: any } = createPreferenceProxy(preferences, schema, {
|
|
184
|
-
prefix: newPrefix,
|
|
185
|
-
resourceUri: opts.resourceUri,
|
|
186
|
-
overrideIdentifier: opts.overrideIdentifier,
|
|
187
|
-
style,
|
|
188
|
-
});
|
|
189
|
-
for (const k of Object.keys(value)) {
|
|
190
|
-
subProxy[k] = value[k];
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
return false;
|
|
195
|
-
};
|
|
196
|
-
|
|
197
|
-
const get: (target: any, prop: string) => any = (_, property: string | symbol | number) => {
|
|
198
|
-
if (typeof property !== 'string') {
|
|
199
|
-
throw new Error(`unexpected property: ${String(property)}`);
|
|
200
|
-
}
|
|
201
|
-
const fullProperty = prefix ? prefix + property : property;
|
|
202
|
-
if (isFlat || property.indexOf('.') === -1) {
|
|
203
|
-
if (schema.properties[fullProperty]) {
|
|
204
|
-
return preferences.get(fullProperty, undefined, opts.resourceUri, opts.overrideIdentifier);
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
if (property === 'onPreferenceChanged') {
|
|
208
|
-
return onPreferenceChanged;
|
|
209
|
-
}
|
|
210
|
-
if (property === 'dispose') {
|
|
211
|
-
return () => {
|
|
212
|
-
/* do nothing */
|
|
213
|
-
};
|
|
214
|
-
}
|
|
215
|
-
if (property === 'ready') {
|
|
216
|
-
return preferences.ready;
|
|
217
|
-
}
|
|
218
|
-
if (property === 'get') {
|
|
219
|
-
return getValue;
|
|
220
|
-
}
|
|
221
|
-
if (property === 'toJSON') {
|
|
222
|
-
return toJSON();
|
|
223
|
-
}
|
|
224
|
-
if (isDeep) {
|
|
225
|
-
const newPrefix = fullProperty + '.';
|
|
226
|
-
for (const p of Object.keys(schema.properties)) {
|
|
227
|
-
// 这里实际上要求 Configuration 在注册的时候声明全量配置名
|
|
228
|
-
// 如,获取 a.b, 则要求 Configuration 声明时必须为 a.b.c
|
|
229
|
-
if (p.startsWith(newPrefix)) {
|
|
230
|
-
return createPreferenceProxy(preferences, schema, {
|
|
231
|
-
prefix: newPrefix,
|
|
232
|
-
resourceUri: opts.resourceUri,
|
|
233
|
-
overrideIdentifier: opts.overrideIdentifier,
|
|
234
|
-
style,
|
|
235
|
-
});
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
// 升级 Monaco 0.20.0 版本后,Monaco 中的ConfigurationService会尝试通过配置全称获取配置值
|
|
240
|
-
// 如,直接获取 a.b.c.d 配置值
|
|
241
|
-
// 下面的逻辑兼容了通过 a.b 获取 a.b.c, a.b.c.d 的方式
|
|
242
|
-
let value;
|
|
243
|
-
let parentSegment = fullProperty;
|
|
244
|
-
const segments: string[] = [];
|
|
245
|
-
for (let index; parentSegment && isUndefined(value); ) {
|
|
246
|
-
index = parentSegment.lastIndexOf('.');
|
|
247
|
-
// 查找到对应值后退出查询
|
|
248
|
-
segments.push(parentSegment.substring(index + 1));
|
|
249
|
-
parentSegment = parentSegment.substring(0, index);
|
|
250
|
-
if (parentSegment in schema.properties) {
|
|
251
|
-
value = get(_, parentSegment);
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
let segment;
|
|
256
|
-
while (isObject(value) && (segment = segments.pop())) {
|
|
257
|
-
// 进一步遍历获取配置值
|
|
258
|
-
value = value[segment];
|
|
259
|
-
}
|
|
260
|
-
return segments.length ? undefined : value;
|
|
261
|
-
}
|
|
262
|
-
return undefined;
|
|
263
|
-
};
|
|
264
|
-
|
|
265
|
-
const toJSON = () => {
|
|
266
|
-
const result: any = {};
|
|
267
|
-
for (const k of ownKeys()) {
|
|
268
|
-
result[k] = get(undefined, k);
|
|
269
|
-
}
|
|
270
|
-
return result;
|
|
271
|
-
};
|
|
272
|
-
|
|
273
|
-
return new Proxy(
|
|
274
|
-
{},
|
|
275
|
-
{
|
|
276
|
-
get,
|
|
277
|
-
ownKeys,
|
|
278
|
-
getOwnPropertyDescriptor: (_, property: string) => {
|
|
279
|
-
if (ownKeys().indexOf(property) !== -1) {
|
|
280
|
-
return {
|
|
281
|
-
enumerable: true,
|
|
282
|
-
configurable: true,
|
|
283
|
-
};
|
|
284
|
-
}
|
|
285
|
-
return {};
|
|
286
|
-
},
|
|
287
|
-
set,
|
|
288
|
-
deleteProperty: unsupportedOperation,
|
|
289
|
-
defineProperty: unsupportedOperation,
|
|
290
|
-
},
|
|
291
|
-
);
|
|
292
|
-
}
|