@theia/core 1.53.0-next.4 → 1.53.0-next.55
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/README.md +7 -7
- package/i18n/nls.cs.json +582 -552
- package/i18n/nls.de.json +582 -552
- package/i18n/nls.es.json +582 -552
- package/i18n/nls.fr.json +582 -552
- package/i18n/nls.hu.json +582 -552
- package/i18n/nls.it.json +582 -552
- package/i18n/nls.ja.json +582 -552
- package/i18n/nls.json +582 -552
- package/i18n/nls.ko.json +582 -0
- package/i18n/nls.pl.json +582 -552
- package/i18n/nls.pt-br.json +582 -552
- package/i18n/nls.ru.json +582 -552
- package/i18n/nls.tr.json +582 -0
- package/i18n/nls.zh-cn.json +582 -552
- package/i18n/nls.zh-tw.json +582 -0
- package/lib/browser/authentication-service.d.ts +15 -14
- package/lib/browser/authentication-service.d.ts.map +1 -1
- package/lib/browser/authentication-service.js +5 -5
- package/lib/browser/authentication-service.js.map +1 -1
- package/lib/browser/catalog.json +6889 -0
- package/lib/browser/common-frontend-contribution.js +3 -3
- package/lib/browser/common-styling-participants.js +166 -166
- package/lib/browser/context-key-service.d.ts +3 -2
- package/lib/browser/context-key-service.d.ts.map +1 -1
- package/lib/browser/context-key-service.js.map +1 -1
- package/lib/browser/core-preferences.d.ts.map +1 -1
- package/lib/browser/core-preferences.js +9 -0
- package/lib/browser/core-preferences.js.map +1 -1
- package/lib/browser/frontend-application-module.d.ts.map +1 -1
- package/lib/browser/frontend-application-module.js.map +1 -1
- package/lib/browser/json-schema-store.d.ts +0 -3
- package/lib/browser/json-schema-store.d.ts.map +1 -1
- package/lib/browser/json-schema-store.js +2 -12
- package/lib/browser/json-schema-store.js.map +1 -1
- package/lib/browser/open-with-service.d.ts +13 -1
- package/lib/browser/open-with-service.d.ts.map +1 -1
- package/lib/browser/open-with-service.js +48 -9
- package/lib/browser/open-with-service.js.map +1 -1
- package/lib/browser/opener-service.d.ts +8 -0
- package/lib/browser/opener-service.d.ts.map +1 -1
- package/lib/browser/opener-service.js +18 -3
- package/lib/browser/opener-service.js.map +1 -1
- package/lib/browser/progress-location-service.spec.js +7 -7
- package/lib/browser/saveable-service.d.ts.map +1 -1
- package/lib/browser/saveable-service.js +6 -2
- package/lib/browser/saveable-service.js.map +1 -1
- package/lib/browser/saveable.d.ts +17 -1
- package/lib/browser/saveable.d.ts.map +1 -1
- package/lib/browser/saveable.js +62 -1
- package/lib/browser/saveable.js.map +1 -1
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-menu-adapters.d.ts +5 -4
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-menu-adapters.d.ts.map +1 -1
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-menu-adapters.js +2 -1
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-menu-adapters.js.map +1 -1
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-registry.d.ts +6 -16
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-registry.d.ts.map +1 -1
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-registry.js +12 -29
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-registry.js.map +1 -1
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-types.d.ts +43 -78
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-types.d.ts.map +1 -1
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-types.js +8 -39
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-types.js.map +1 -1
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar.d.ts +10 -10
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar.d.ts.map +1 -1
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar.js +43 -32
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar.js.map +1 -1
- package/lib/browser/storage-service.js +3 -3
- package/lib/browser/tree/tree.spec.js +75 -75
- package/lib/browser/view-container.d.ts +2 -2
- package/lib/browser/view-container.d.ts.map +1 -1
- package/lib/browser/view-container.js.map +1 -1
- package/lib/browser/widget-open-handler.d.ts +4 -1
- package/lib/browser/widget-open-handler.d.ts.map +1 -1
- package/lib/browser/widget-open-handler.js.map +1 -1
- package/lib/browser/widgets/extractable-widget.js +1 -1
- package/lib/browser/widgets/extractable-widget.js.map +1 -1
- package/lib/browser/widgets/index.d.ts +1 -0
- package/lib/browser/widgets/index.d.ts.map +1 -1
- package/lib/browser/widgets/index.js +1 -0
- package/lib/browser/widgets/index.js.map +1 -1
- package/lib/browser/widgets/split-widget.d.ts +45 -0
- package/lib/browser/widgets/split-widget.d.ts.map +1 -0
- package/lib/browser/widgets/split-widget.js +126 -0
- package/lib/browser/widgets/split-widget.js.map +1 -0
- package/lib/common/event.d.ts +2 -0
- package/lib/common/event.d.ts.map +1 -1
- package/lib/common/event.js +4 -0
- package/lib/common/event.js.map +1 -1
- package/lib/common/glob.d.ts +4 -4
- package/lib/common/json-schema.d.ts +2 -0
- package/lib/common/json-schema.d.ts.map +1 -1
- package/lib/common/menu/menu-types.d.ts.map +1 -1
- package/lib/common/menu/menu-types.js.map +1 -1
- package/lib/electron-browser/electron-uri-handler.d.ts +6 -0
- package/lib/electron-browser/electron-uri-handler.d.ts.map +1 -0
- package/lib/electron-browser/electron-uri-handler.js +49 -0
- package/lib/electron-browser/electron-uri-handler.js.map +1 -0
- package/lib/electron-browser/menu/electron-main-menu-factory.d.ts +1 -1
- package/lib/electron-browser/menu/electron-main-menu-factory.d.ts.map +1 -1
- package/lib/electron-browser/menu/electron-main-menu-factory.js +6 -6
- package/lib/electron-browser/menu/electron-main-menu-factory.js.map +1 -1
- package/lib/electron-browser/preload.d.ts.map +1 -1
- package/lib/electron-browser/preload.js +12 -0
- package/lib/electron-browser/preload.js.map +1 -1
- package/lib/electron-browser/window/electron-window-module.d.ts.map +1 -1
- package/lib/electron-browser/window/electron-window-module.js +3 -0
- package/lib/electron-browser/window/electron-window-module.js.map +1 -1
- package/lib/electron-browser/window/external-app-open-handler.js +1 -1
- package/lib/electron-browser/window/external-app-open-handler.js.map +1 -1
- package/lib/electron-common/electron-api.d.ts +2 -0
- package/lib/electron-common/electron-api.d.ts.map +1 -1
- package/lib/electron-common/electron-api.js +2 -1
- package/lib/electron-common/electron-api.js.map +1 -1
- package/lib/electron-main/electron-api-main.d.ts +2 -0
- package/lib/electron-main/electron-api-main.d.ts.map +1 -1
- package/lib/electron-main/electron-api-main.js +27 -3
- package/lib/electron-main/electron-api-main.js.map +1 -1
- package/lib/electron-main/electron-main-application.d.ts +5 -3
- package/lib/electron-main/electron-main-application.d.ts.map +1 -1
- package/lib/electron-main/electron-main-application.js +57 -14
- package/lib/electron-main/electron-main-application.js.map +1 -1
- package/lib/electron-main/theia-electron-window.d.ts +1 -0
- package/lib/electron-main/theia-electron-window.d.ts.map +1 -1
- package/lib/electron-main/theia-electron-window.js +3 -0
- package/lib/electron-main/theia-electron-window.js.map +1 -1
- package/lib/node/i18n/theia-localization-contribution.d.ts.map +1 -1
- package/lib/node/i18n/theia-localization-contribution.js +12 -8
- package/lib/node/i18n/theia-localization-contribution.js.map +1 -1
- package/lib/node/process-utils.spec.js +8 -8
- package/package.json +10 -8
- package/shared/ajv/index.d.ts +2 -2
- package/shared/markdown-it.d.ts +2 -2
- package/shared/markdown-it.js +1 -1
- package/shared/reflect-metadata/index.d.ts +1 -1
- package/shared/reflect-metadata/index.js +1 -1
- package/shared/vscode-languageserver-types/index.d.ts +1 -1
- package/src/browser/about-dialog.tsx +137 -137
- package/src/browser/authentication-service.ts +467 -468
- package/src/browser/breadcrumbs/breadcrumb-popup-container.ts +101 -101
- package/src/browser/breadcrumbs/breadcrumb-renderer.tsx +41 -41
- package/src/browser/breadcrumbs/breadcrumbs-constants.ts +79 -79
- package/src/browser/breadcrumbs/breadcrumbs-renderer.tsx +185 -185
- package/src/browser/breadcrumbs/breadcrumbs-service.ts +108 -108
- package/src/browser/breadcrumbs/index.ts +21 -21
- package/src/browser/browser-clipboard-service.ts +122 -122
- package/src/browser/browser.ts +239 -239
- package/src/browser/clipboard-service.ts +23 -23
- package/src/browser/color-application-contribution.ts +110 -110
- package/src/browser/color-registry.ts +60 -60
- package/src/browser/command-open-handler.ts +54 -54
- package/src/browser/common-frontend-contribution.ts +2680 -2680
- package/src/browser/common-styling-participants.ts +361 -361
- package/src/browser/connection-status-service.spec.ts +200 -200
- package/src/browser/connection-status-service.ts +216 -216
- package/src/browser/context-key-service.ts +142 -142
- package/src/browser/context-menu-renderer.ts +124 -124
- package/src/browser/core-preferences.ts +343 -334
- package/src/browser/credentials-service.ts +106 -106
- package/src/browser/decoration-style.ts +65 -65
- package/src/browser/decorations-service.ts +209 -209
- package/src/browser/dialogs/react-dialog.tsx +56 -56
- package/src/browser/dialogs.ts +534 -534
- package/src/browser/diff-uris.ts +117 -117
- package/src/browser/encoding-registry.ts +97 -97
- package/src/browser/endpoint.spec.ts +148 -148
- package/src/browser/endpoint.ts +136 -136
- package/src/browser/external-uri-service.ts +79 -79
- package/src/browser/file-icons-js.d.ts +20 -20
- package/src/browser/frontend-application-bindings.ts +62 -62
- package/src/browser/frontend-application-config-provider.spec.ts +45 -45
- package/src/browser/frontend-application-config-provider.ts +50 -50
- package/src/browser/frontend-application-contribution.ts +110 -110
- package/src/browser/frontend-application-module.ts +474 -475
- package/src/browser/frontend-application-state.ts +74 -74
- package/src/browser/frontend-application.ts +326 -326
- package/src/browser/hover-service.ts +218 -218
- package/src/browser/http-open-handler.ts +49 -49
- package/src/browser/i18n/i18n-frontend-module.ts +27 -27
- package/src/browser/i18n/language-quick-pick-service.ts +130 -130
- package/src/browser/icon-registry.ts +87 -87
- package/src/browser/icon-theme-contribution.ts +64 -64
- package/src/browser/icon-theme-service.ts +217 -217
- package/src/browser/icons/CollapseAll.svg +7 -7
- package/src/browser/icons/CollapseAll_inverse.svg +7 -7
- package/src/browser/icons/Refresh.svg +7 -7
- package/src/browser/icons/Refresh_inverse.svg +7 -7
- package/src/browser/icons/add-inverse.svg +4 -4
- package/src/browser/icons/add.svg +4 -4
- package/src/browser/icons/arrow-down-bright.svg +6 -6
- package/src/browser/icons/arrow-down-dark.svg +6 -6
- package/src/browser/icons/arrow-up-bright.svg +6 -6
- package/src/browser/icons/arrow-up-dark.svg +6 -6
- package/src/browser/icons/case-sensitive-dark.svg +16 -16
- package/src/browser/icons/case-sensitive.svg +16 -16
- package/src/browser/icons/chevron-right-dark.svg +5 -5
- package/src/browser/icons/chevron-right-light.svg +6 -6
- package/src/browser/icons/circle-bright.svg +7 -7
- package/src/browser/icons/circle-dark.svg +7 -7
- package/src/browser/icons/clear-search-results-dark.svg +7 -7
- package/src/browser/icons/clear-search-results.svg +7 -7
- package/src/browser/icons/close-all-bright.svg +7 -7
- package/src/browser/icons/close-all-dark.svg +7 -7
- package/src/browser/icons/close-bright.svg +7 -7
- package/src/browser/icons/close-dark.svg +7 -7
- package/src/browser/icons/collapse.svg +4 -4
- package/src/browser/icons/edit-json-dark.svg +6 -6
- package/src/browser/icons/edit-json.svg +6 -6
- package/src/browser/icons/expand.svg +4 -4
- package/src/browser/icons/loading-dark.svg +6 -6
- package/src/browser/icons/loading-light.svg +6 -6
- package/src/browser/icons/open-change-bright.svg +3 -3
- package/src/browser/icons/open-change-dark.svg +4 -4
- package/src/browser/icons/open-file-bright.svg +4 -4
- package/src/browser/icons/open-file-dark.svg +4 -4
- package/src/browser/icons/preview-bright.svg +3 -3
- package/src/browser/icons/preview-dark.svg +3 -3
- package/src/browser/icons/regex-dark.svg +10 -10
- package/src/browser/icons/regex.svg +10 -10
- package/src/browser/icons/remove-all-inverse.svg +4 -4
- package/src/browser/icons/remove-all.svg +4 -4
- package/src/browser/icons/replace-all-inverse.svg +13 -13
- package/src/browser/icons/replace-all.svg +13 -13
- package/src/browser/icons/replace-inverse.svg +15 -15
- package/src/browser/icons/replace.svg +15 -15
- package/src/browser/icons/whole-word-dark.svg +19 -19
- package/src/browser/icons/whole-word.svg +19 -19
- package/src/browser/index.ts +50 -50
- package/src/browser/json-schema-store.ts +118 -127
- package/src/browser/keybinding.spec.ts +554 -554
- package/src/browser/keybinding.ts +759 -759
- package/src/browser/keyboard/browser-keyboard-frontend-contribution.ts +108 -108
- package/src/browser/keyboard/browser-keyboard-layout-provider.spec.ts +171 -171
- package/src/browser/keyboard/browser-keyboard-layout-provider.ts +469 -469
- package/src/browser/keyboard/browser-keyboard-module.ts +30 -30
- package/src/browser/keyboard/index.ts +20 -20
- package/src/browser/keyboard/keyboard-layout-service.spec.ts +121 -121
- package/src/browser/keyboard/keyboard-layout-service.ts +455 -455
- package/src/browser/keyboard/keys.spec.ts +258 -258
- package/src/browser/keyboard/keys.ts +20 -20
- package/src/browser/keys.ts +21 -21
- package/src/browser/label-parser.spec.ts +165 -165
- package/src/browser/label-parser.ts +108 -108
- package/src/browser/label-provider.spec.ts +62 -62
- package/src/browser/label-provider.ts +385 -385
- package/src/browser/language-icon-provider.ts +55 -55
- package/src/browser/language-service.ts +77 -77
- package/src/browser/logger-frontend-module.ts +65 -65
- package/src/browser/markdown-rendering/markdown-renderer.ts +98 -98
- package/src/browser/menu/browser-context-menu-renderer.ts +48 -48
- package/src/browser/menu/browser-menu-module.ts +28 -28
- package/src/browser/menu/browser-menu-plugin.ts +491 -491
- package/src/browser/menu/context-menu-context.ts +41 -41
- package/src/browser/messaging/connection-source.ts +26 -26
- package/src/browser/messaging/frontend-id-provider.ts +37 -37
- package/src/browser/messaging/index.ts +18 -18
- package/src/browser/messaging/messaging-frontend-module.ts +41 -41
- package/src/browser/messaging/service-connection-provider.ts +140 -140
- package/src/browser/messaging/ws-connection-provider.ts +49 -49
- package/src/browser/messaging/ws-connection-source.ts +230 -230
- package/src/browser/mime-service.ts +30 -30
- package/src/browser/navigatable-types.ts +81 -81
- package/src/browser/navigatable.ts +39 -39
- package/src/browser/open-with-service.ts +140 -93
- package/src/browser/opener-service.spec.ts +49 -49
- package/src/browser/opener-service.ts +169 -146
- package/src/browser/performance/frontend-stopwatch.ts +65 -65
- package/src/browser/performance/index.ts +18 -18
- package/src/browser/performance/measurement-frontend-bindings.ts +31 -31
- package/src/browser/preferences/index.ts +23 -23
- package/src/browser/preferences/injectable-preference-proxy.ts +283 -283
- package/src/browser/preferences/preference-configurations.ts +82 -82
- package/src/browser/preferences/preference-contribution.ts +436 -436
- package/src/browser/preferences/preference-language-override-service.ts +111 -111
- package/src/browser/preferences/preference-provider.spec.ts +36 -36
- package/src/browser/preferences/preference-provider.ts +277 -277
- package/src/browser/preferences/preference-proxy.spec.ts +367 -367
- package/src/browser/preferences/preference-proxy.ts +367 -367
- package/src/browser/preferences/preference-schema-provider.spec.ts +130 -130
- package/src/browser/preferences/preference-scope.ts +18 -18
- package/src/browser/preferences/preference-service.spec.ts +613 -613
- package/src/browser/preferences/preference-service.ts +594 -594
- package/src/browser/preferences/preference-validation-service.spec.ts +334 -334
- package/src/browser/preferences/preference-validation-service.ts +358 -358
- package/src/browser/preferences/test/index.ts +19 -19
- package/src/browser/preferences/test/mock-preference-provider.ts +50 -50
- package/src/browser/preferences/test/mock-preference-proxy.ts +48 -48
- package/src/browser/preferences/test/mock-preference-service.ts +63 -63
- package/src/browser/preload/i18n-preload-contribution.ts +50 -50
- package/src/browser/preload/os-preload-contribution.ts +37 -37
- package/src/browser/preload/preload-module.ts +45 -45
- package/src/browser/preload/preloader.ts +37 -37
- package/src/browser/preload/theme-preload-contribution.ts +31 -31
- package/src/browser/progress-bar-factory.ts +29 -29
- package/src/browser/progress-bar.ts +76 -76
- package/src/browser/progress-client.ts +53 -53
- package/src/browser/progress-location-service.spec.ts +50 -50
- package/src/browser/progress-location-service.ts +96 -96
- package/src/browser/progress-status-bar-item.ts +83 -83
- package/src/browser/quick-input/index.ts +23 -23
- package/src/browser/quick-input/quick-access.ts +75 -75
- package/src/browser/quick-input/quick-command-frontend-contribution.ts +89 -89
- package/src/browser/quick-input/quick-command-service.ts +246 -246
- package/src/browser/quick-input/quick-help-service.ts +87 -87
- package/src/browser/quick-input/quick-input-frontend-contribution.ts +33 -33
- package/src/browser/quick-input/quick-input-service.spec.ts +176 -176
- package/src/browser/quick-input/quick-input-service.ts +17 -17
- package/src/browser/quick-input/quick-pick-service-impl.ts +69 -69
- package/src/browser/quick-input/quick-view-service.ts +83 -83
- package/src/browser/request/browser-request-module.ts +23 -23
- package/src/browser/request/browser-request-service.ts +172 -172
- package/src/browser/resource-context-key.ts +77 -77
- package/src/browser/saveable-service.ts +332 -328
- package/src/browser/saveable.ts +395 -327
- package/src/browser/secondary-window-handler.ts +211 -211
- package/src/browser/shell/additional-views-menu-widget.tsx +71 -71
- package/src/browser/shell/application-shell-mouse-tracker.ts +103 -103
- package/src/browser/shell/application-shell.ts +2271 -2271
- package/src/browser/shell/current-widget-command-adapter.ts +57 -57
- package/src/browser/shell/index.ts +23 -23
- package/src/browser/shell/shell-layout-restorer.ts +399 -399
- package/src/browser/shell/side-panel-handler.ts +794 -794
- package/src/browser/shell/side-panel-toolbar.ts +111 -111
- package/src/browser/shell/sidebar-bottom-menu-widget.tsx +39 -39
- package/src/browser/shell/sidebar-menu-widget.tsx +183 -183
- package/src/browser/shell/sidebar-top-menu-widget.tsx +26 -26
- package/src/browser/shell/split-panels.ts +191 -191
- package/src/browser/shell/tab-bar-decorator.ts +106 -106
- package/src/browser/shell/tab-bar-toolbar/index.ts +19 -19
- package/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar-menu-adapters.ts +31 -31
- package/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar-registry.ts +242 -256
- package/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar-types.ts +149 -207
- package/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar.spec.ts +62 -62
- package/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar.tsx +443 -428
- package/src/browser/shell/tab-bars.spec.ts +63 -63
- package/src/browser/shell/tab-bars.ts +1468 -1468
- package/src/browser/shell/theia-dock-panel.ts +265 -265
- package/src/browser/shell/view-column-service.ts +125 -125
- package/src/browser/shell/view-contribution.ts +178 -178
- package/src/browser/source-tree/index.ts +19 -19
- package/src/browser/source-tree/source-tree-widget.tsx +107 -107
- package/src/browser/source-tree/source-tree.ts +146 -146
- package/src/browser/source-tree/tree-source.ts +73 -73
- package/src/browser/status-bar/index.ts +29 -29
- package/src/browser/status-bar/status-bar-types.ts +97 -97
- package/src/browser/status-bar/status-bar-view-model.ts +209 -209
- package/src/browser/status-bar/status-bar.tsx +189 -189
- package/src/browser/storage-service.spec.ts +76 -76
- package/src/browser/storage-service.ts +129 -129
- package/src/browser/style/about.css +36 -36
- package/src/browser/style/alert-messages.css +62 -62
- package/src/browser/style/ansi.css +88 -88
- package/src/browser/style/breadcrumbs.css +130 -130
- package/src/browser/style/dialog.css +126 -126
- package/src/browser/style/dockpanel.css +76 -76
- package/src/browser/style/hover-service.css +101 -101
- package/src/browser/style/icons.css +61 -61
- package/src/browser/style/index.css +353 -351
- package/src/browser/style/materialcolors.css +278 -278
- package/src/browser/style/menus.css +230 -230
- package/src/browser/style/notification.css +39 -39
- package/src/browser/style/os.css +87 -87
- package/src/browser/style/progress-bar.css +43 -43
- package/src/browser/style/quick-title-bar.css +45 -45
- package/src/browser/style/scrollbars.css +172 -172
- package/src/browser/style/search-box.css +123 -123
- package/src/browser/style/select-component.css +107 -107
- package/src/browser/style/sidepanel.css +367 -367
- package/src/browser/style/split-widget.css +38 -0
- package/src/browser/style/status-bar.css +127 -127
- package/src/browser/style/tabs.css +647 -658
- package/src/browser/style/tooltip.css +28 -28
- package/src/browser/style/tree-decorators.css +81 -81
- package/src/browser/style/tree.css +232 -232
- package/src/browser/style/view-container.css +187 -194
- package/src/browser/style/widget.css +19 -19
- package/src/browser/styling-service.ts +96 -96
- package/src/browser/supported-encodings.ts +262 -262
- package/src/browser/test/jsdom.ts +69 -69
- package/src/browser/test/mock-connection-status-service.ts +33 -33
- package/src/browser/test/mock-env-variables-server.ts +47 -47
- package/src/browser/test/mock-opener-service.ts +34 -34
- package/src/browser/test/mock-storage-service.ts +49 -49
- package/src/browser/theming.ts +206 -206
- package/src/browser/tooltip-service.tsx +96 -96
- package/src/browser/tree/fuzzy-search.spec.ts +99 -99
- package/src/browser/tree/fuzzy-search.ts +136 -136
- package/src/browser/tree/index.ts +29 -29
- package/src/browser/tree/search-box-debounce.ts +96 -96
- package/src/browser/tree/search-box.ts +355 -355
- package/src/browser/tree/test/mock-selectable-tree-model.ts +109 -109
- package/src/browser/tree/test/mock-tree-model.ts +136 -136
- package/src/browser/tree/test/tree-test-container.ts +50 -50
- package/src/browser/tree/tree-compression/compressed-tree-expansion-service.ts +46 -46
- package/src/browser/tree/tree-compression/compressed-tree-model.ts +88 -88
- package/src/browser/tree/tree-compression/compressed-tree-widget.tsx +203 -203
- package/src/browser/tree/tree-compression/index.ts +20 -20
- package/src/browser/tree/tree-compression/tree-compression-service.ts +125 -125
- package/src/browser/tree/tree-compression/tree-compression.css +28 -28
- package/src/browser/tree/tree-consistency.spec.ts +105 -105
- package/src/browser/tree/tree-container.spec.ts +45 -45
- package/src/browser/tree/tree-container.ts +155 -155
- package/src/browser/tree/tree-decorator.spec.ts +162 -162
- package/src/browser/tree/tree-decorator.ts +238 -238
- package/src/browser/tree/tree-expansion.spec.ts +173 -173
- package/src/browser/tree/tree-expansion.ts +165 -165
- package/src/browser/tree/tree-focus-service.ts +55 -55
- package/src/browser/tree/tree-iterator.spec.ts +170 -170
- package/src/browser/tree/tree-iterator.ts +256 -256
- package/src/browser/tree/tree-label-provider.ts +40 -40
- package/src/browser/tree/tree-model.ts +562 -562
- package/src/browser/tree/tree-navigation.ts +58 -58
- package/src/browser/tree/tree-preference.ts +50 -50
- package/src/browser/tree/tree-search.ts +128 -128
- package/src/browser/tree/tree-selectable.spec.ts +152 -152
- package/src/browser/tree/tree-selection-impl.ts +176 -176
- package/src/browser/tree/tree-selection-state.spec.ts +462 -462
- package/src/browser/tree/tree-selection-state.ts +245 -245
- package/src/browser/tree/tree-selection.ts +159 -159
- package/src/browser/tree/tree-view-welcome-widget.tsx +263 -263
- package/src/browser/tree/tree-widget-selection.ts +45 -45
- package/src/browser/tree/tree-widget.tsx +1591 -1591
- package/src/browser/tree/tree.spec.ts +241 -241
- package/src/browser/tree/tree.ts +425 -425
- package/src/browser/undo-redo-handler.ts +85 -85
- package/src/browser/user-working-directory-provider.ts +77 -77
- package/src/browser/view-container.ts +1640 -1640
- package/src/browser/widget-decoration.ts +358 -358
- package/src/browser/widget-manager.spec.ts +102 -102
- package/src/browser/widget-manager.ts +318 -318
- package/src/browser/widget-open-handler.ts +168 -165
- package/src/browser/widgets/alert-message.tsx +56 -56
- package/src/browser/widgets/enhanced-preview-widget.ts +27 -27
- package/src/browser/widgets/extractable-widget.ts +33 -33
- package/src/browser/widgets/index.ts +21 -20
- package/src/browser/widgets/previewable-widget.ts +31 -31
- package/src/browser/widgets/react-renderer.tsx +53 -53
- package/src/browser/widgets/react-widget.tsx +51 -51
- package/src/browser/widgets/select-component.tsx +367 -367
- package/src/browser/widgets/split-widget.ts +163 -0
- package/src/browser/widgets/widget.ts +406 -406
- package/src/browser/window/browser-window-module.ts +32 -32
- package/src/browser/window/default-secondary-window-service.ts +189 -189
- package/src/browser/window/default-window-service.spec.ts +78 -78
- package/src/browser/window/default-window-service.ts +171 -171
- package/src/browser/window/secondary-window-service.ts +39 -39
- package/src/browser/window/test/mock-window-service.ts +29 -29
- package/src/browser/window/window-service.ts +78 -78
- package/src/browser/window/window-title-service.ts +107 -107
- package/src/browser/window/window-title-updater.ts +95 -95
- package/src/browser/window-contribution.ts +64 -64
- package/src/browser-only/frontend-only-application-module.ts +116 -116
- package/src/browser-only/i18n/i18n-frontend-only-module.ts +37 -37
- package/src/browser-only/logger-frontend-only-module.ts +63 -63
- package/src/browser-only/messaging/frontend-only-service-connection-provider.ts +39 -39
- package/src/browser-only/messaging/messaging-frontend-only-module.ts +42 -42
- package/src/browser-only/preload/frontend-only-preload-module.ts +49 -49
- package/src/common/accessibility.ts +33 -33
- package/src/common/application-error.spec.ts +27 -27
- package/src/common/application-error.ts +76 -76
- package/src/common/application-protocol.ts +42 -42
- package/src/common/array-utils.ts +129 -129
- package/src/common/buffer.ts +228 -228
- package/src/common/cancellation.ts +163 -163
- package/src/common/char-code.ts +438 -438
- package/src/common/collections.ts +125 -125
- package/src/common/color.ts +103 -103
- package/src/common/command.spec.ts +208 -208
- package/src/common/command.ts +489 -489
- package/src/common/contribution-filter/contribution-filter-registry.ts +79 -79
- package/src/common/contribution-filter/contribution-filter.ts +64 -64
- package/src/common/contribution-filter/filter.ts +23 -23
- package/src/common/contribution-filter/index.ts +19 -19
- package/src/common/contribution-provider.ts +96 -96
- package/src/common/disposable.spec.ts +94 -94
- package/src/common/disposable.ts +188 -188
- package/src/common/encoding-service.ts +380 -380
- package/src/common/encodings.ts +24 -24
- package/src/common/env-variables/env-variables-protocol.ts +38 -38
- package/src/common/env-variables/index.ts +17 -17
- package/src/common/event.spec.ts +32 -32
- package/src/common/event.ts +493 -487
- package/src/common/file-uri.ts +61 -61
- package/src/common/frontend-application-state.ts +38 -38
- package/src/common/glob.ts +741 -741
- package/src/common/hash.ts +85 -85
- package/src/common/i18n/localization-server.ts +25 -25
- package/src/common/i18n/localization.ts +80 -80
- package/src/common/i18n/nls.metadata.json +34112 -34112
- package/src/common/index.ts +51 -51
- package/src/common/json-schema.ts +108 -106
- package/src/common/key-store.ts +26 -26
- package/src/common/keybinding.ts +152 -152
- package/src/common/keyboard/keyboard-layout-provider.ts +51 -51
- package/src/common/keys.ts +694 -694
- package/src/common/label-protocol.ts +35 -35
- package/src/common/logger-protocol.ts +119 -119
- package/src/common/logger-watcher.ts +48 -48
- package/src/common/logger.spec.ts +46 -46
- package/src/common/logger.ts +389 -389
- package/src/common/lsp-types.ts +34 -34
- package/src/common/markdown-rendering/icon-utilities.ts +30 -30
- package/src/common/markdown-rendering/index.ts +18 -18
- package/src/common/markdown-rendering/markdown-string.ts +152 -152
- package/src/common/menu/action-menu-node.ts +65 -65
- package/src/common/menu/composite-menu-node.spec.ts +67 -67
- package/src/common/menu/composite-menu-node.ts +114 -114
- package/src/common/menu/index.ts +21 -21
- package/src/common/menu/menu-adapter.ts +103 -103
- package/src/common/menu/menu-model-registry.ts +374 -374
- package/src/common/menu/menu-types.ts +220 -219
- package/src/common/menu/menu.spec.ts +101 -101
- package/src/common/message-rpc/channel.spec.ts +88 -88
- package/src/common/message-rpc/channel.ts +300 -300
- package/src/common/message-rpc/index.ts +22 -22
- package/src/common/message-rpc/message-buffer.ts +105 -105
- package/src/common/message-rpc/msg-pack-extension-manager.ts +70 -70
- package/src/common/message-rpc/rpc-message-encoder.spec.ts +65 -65
- package/src/common/message-rpc/rpc-message-encoder.ts +190 -190
- package/src/common/message-rpc/rpc-protocol.ts +255 -255
- package/src/common/message-rpc/uint8-array-message-buffer.spec.ts +41 -41
- package/src/common/message-rpc/uint8-array-message-buffer.ts +213 -213
- package/src/common/message-service-protocol.ts +148 -148
- package/src/common/message-service.ts +226 -226
- package/src/common/messaging/connection-error-handler.ts +73 -73
- package/src/common/messaging/connection-management.ts +43 -43
- package/src/common/messaging/handler.ts +26 -26
- package/src/common/messaging/index.ts +19 -19
- package/src/common/messaging/proxy-factory.spec.ts +108 -108
- package/src/common/messaging/proxy-factory.ts +336 -336
- package/src/common/messaging/socket-write-buffer.ts +52 -52
- package/src/common/messaging/web-socket-channel.ts +76 -76
- package/src/common/nls.ts +151 -151
- package/src/common/numbers.ts +21 -21
- package/src/common/objects.spec.ts +112 -112
- package/src/common/objects.ts +123 -123
- package/src/common/os.ts +82 -82
- package/src/common/path.spec.ts +415 -415
- package/src/common/path.ts +334 -334
- package/src/common/paths.ts +250 -250
- package/src/common/performance/index.ts +19 -19
- package/src/common/performance/measurement-protocol.ts +104 -104
- package/src/common/performance/measurement.ts +130 -130
- package/src/common/performance/stopwatch.ts +183 -183
- package/src/common/preferences/preference-schema.ts +101 -101
- package/src/common/preferences/preference-scope.spec.ts +48 -48
- package/src/common/preferences/preference-scope.ts +68 -68
- package/src/common/prioritizeable.ts +58 -58
- package/src/common/progress-service-protocol.ts +35 -35
- package/src/common/progress-service.ts +82 -82
- package/src/common/promise-util.spec.ts +102 -102
- package/src/common/promise-util.ts +143 -143
- package/src/common/quick-pick-service.ts +353 -353
- package/src/common/reference.spec.ts +145 -145
- package/src/common/reference.ts +230 -230
- package/src/common/resource.ts +430 -430
- package/src/common/selection-command-handler.ts +101 -101
- package/src/common/selection-service.spec.ts +43 -43
- package/src/common/selection-service.ts +49 -49
- package/src/common/selection.ts +50 -50
- package/src/common/severity.ts +111 -111
- package/src/common/stream.ts +718 -718
- package/src/common/strings.ts +231 -231
- package/src/common/telemetry.ts +45 -45
- package/src/common/ternary-search-tree.ts +417 -417
- package/src/common/test/expect.ts +34 -34
- package/src/common/test/mock-logger.ts +118 -118
- package/src/common/test/mock-menu.ts +35 -35
- package/src/common/test/mock-resource-provider.ts +33 -33
- package/src/common/theme.ts +68 -68
- package/src/common/types.spec.ts +86 -86
- package/src/common/types.ts +140 -140
- package/src/common/uri-command-handler.spec.ts +90 -90
- package/src/common/uri-command-handler.ts +148 -148
- package/src/common/uri.spec.ts +278 -278
- package/src/common/uri.ts +279 -279
- package/src/common/uuid.ts +45 -45
- package/src/common/version.ts +17 -17
- package/src/common/view-column.ts +33 -33
- package/src/common/window.ts +34 -34
- package/src/electron-browser/electron-clipboard-service.ts +32 -32
- package/src/electron-browser/electron-uri-handler.ts +42 -0
- package/src/electron-browser/keyboard/electron-keyboard-layout-change-notifier.ts +39 -39
- package/src/electron-browser/keyboard/electron-keyboard-module.ts +28 -28
- package/src/electron-browser/menu/electron-context-menu-renderer.ts +122 -122
- package/src/electron-browser/menu/electron-main-menu-factory.ts +339 -338
- package/src/electron-browser/menu/electron-menu-contribution.ts +506 -506
- package/src/electron-browser/menu/electron-menu-module.ts +40 -40
- package/src/electron-browser/menu/electron-menu-style.css +110 -110
- package/src/electron-browser/messaging/electron-frontend-id-provider.ts +25 -25
- package/src/electron-browser/messaging/electron-ipc-connection-source.ts +65 -65
- package/src/electron-browser/messaging/electron-local-ws-connection-source.ts +45 -45
- package/src/electron-browser/messaging/electron-messaging-frontend-module.ts +78 -78
- package/src/electron-browser/messaging/electron-ws-connection-source.ts +38 -38
- package/src/electron-browser/preload.ts +264 -249
- package/src/electron-browser/request/electron-browser-request-module.ts +26 -26
- package/src/electron-browser/token/electron-token-frontend-module.ts +22 -22
- package/src/electron-browser/window/electron-frontend-application-state.ts +26 -26
- package/src/electron-browser/window/electron-secondary-window-service.ts +35 -35
- package/src/electron-browser/window/electron-window-module.ts +48 -45
- package/src/electron-browser/window/electron-window-preferences.ts +76 -76
- package/src/electron-browser/window/electron-window-service.ts +109 -109
- package/src/electron-browser/window/external-app-open-handler.ts +42 -42
- package/src/electron-common/electron-api.ts +157 -154
- package/src/electron-common/electron-main-window-service.ts +24 -24
- package/src/electron-common/electron-token.ts +27 -27
- package/src/electron-main/electron-api-main.ts +373 -347
- package/src/electron-main/electron-main-application-module.ts +65 -65
- package/src/electron-main/electron-main-application.ts +860 -818
- package/src/electron-main/electron-main-constants.ts +23 -23
- package/src/electron-main/electron-main-window-service-impl.ts +44 -44
- package/src/electron-main/electron-security-token-service.ts +36 -36
- package/src/electron-main/event-utils.ts +36 -36
- package/src/electron-main/messaging/electron-connection-handler.ts +21 -21
- package/src/electron-main/messaging/electron-messaging-contribution.ts +143 -143
- package/src/electron-main/messaging/electron-messaging-service.ts +35 -35
- package/src/electron-main/theia-electron-window.ts +219 -214
- package/src/electron-node/cli/electron-backend-cli-module.ts +24 -24
- package/src/electron-node/cli/electron-cli-contribution.ts +35 -35
- package/src/electron-node/hosting/electron-backend-hosting-module.ts +24 -24
- package/src/electron-node/hosting/electron-ws-origin-validator.ts +37 -37
- package/src/electron-node/keyboard/electron-backend-keyboard-module.ts +30 -30
- package/src/electron-node/keyboard/electron-keyboard-layout-provider.ts +35 -35
- package/src/electron-node/request/electron-backend-request-module.ts +23 -23
- package/src/electron-node/request/electron-backend-request-service.ts +78 -78
- package/src/electron-node/token/electron-token-backend-contribution.ts +48 -48
- package/src/electron-node/token/electron-token-backend-module.ts +28 -28
- package/src/electron-node/token/electron-token-validator.ts +93 -93
- package/src/node/application-server.ts +59 -59
- package/src/node/backend-application-config-provider.spec.ts +29 -29
- package/src/node/backend-application-config-provider.ts +48 -48
- package/src/node/backend-application-module.ts +139 -139
- package/src/node/backend-application.ts +374 -374
- package/src/node/cli.spec.ts +94 -94
- package/src/node/cli.ts +63 -63
- package/src/node/console-logger-server.spec.ts +59 -59
- package/src/node/console-logger-server.ts +76 -76
- package/src/node/debug.ts +30 -30
- package/src/node/dynamic-require.ts +56 -56
- package/src/node/env-variables/env-variables-server.ts +123 -123
- package/src/node/env-variables/index.ts +17 -17
- package/src/node/environment-utils.spec.ts +92 -92
- package/src/node/environment-utils.ts +66 -66
- package/src/node/file-uri.spec.ts +76 -76
- package/src/node/filesystem-locking.ts +77 -77
- package/src/node/hosting/backend-application-hosts.ts +60 -60
- package/src/node/hosting/backend-hosting-module.ts +26 -26
- package/src/node/hosting/ws-origin-validator.ts +36 -36
- package/src/node/i18n/i18n-backend-module.ts +42 -42
- package/src/node/i18n/localization-contribution.ts +112 -112
- package/src/node/i18n/localization-provider.ts +125 -125
- package/src/node/i18n/localization-server.ts +52 -52
- package/src/node/i18n/theia-localization-contribution.ts +40 -36
- package/src/node/index.ts +22 -22
- package/src/node/key-store-server.ts +162 -162
- package/src/node/logger-backend-module.ts +88 -88
- package/src/node/logger-cli-contribution.spec.ts +245 -245
- package/src/node/logger-cli-contribution.ts +168 -168
- package/src/node/main.ts +33 -33
- package/src/node/messaging/binary-message-pipe.ts +168 -168
- package/src/node/messaging/connection-container-module.ts +96 -96
- package/src/node/messaging/default-messaging-service.ts +129 -129
- package/src/node/messaging/frontend-connection-service.ts +24 -24
- package/src/node/messaging/index.ts +19 -19
- package/src/node/messaging/ipc-bootstrap.ts +27 -27
- package/src/node/messaging/ipc-channel.ts +77 -77
- package/src/node/messaging/ipc-connection-provider.ts +107 -107
- package/src/node/messaging/ipc-protocol.ts +76 -76
- package/src/node/messaging/messaging-backend-module.ts +52 -52
- package/src/node/messaging/messaging-listeners.ts +52 -52
- package/src/node/messaging/messaging-service.ts +46 -46
- package/src/node/messaging/test/test-web-socket-channel.ts +61 -61
- package/src/node/messaging/websocket-endpoint.ts +79 -79
- package/src/node/messaging/websocket-frontend-connection-service.ts +186 -186
- package/src/node/os-backend-provider.ts +25 -25
- package/src/node/performance/index.ts +18 -18
- package/src/node/performance/measurement-backend-bindings.ts +35 -35
- package/src/node/performance/node-stopwatch.ts +40 -40
- package/src/node/process-utils.spec.ts +48 -48
- package/src/node/process-utils.ts +102 -102
- package/src/node/remote/backend-remote-service.ts +25 -25
- package/src/node/remote/remote-cli-contribution.ts +34 -34
- package/src/node/remote/remote-copy-contribution.ts +45 -45
- package/src/node/request/backend-request-facade.ts +39 -39
- package/src/node/request/backend-request-module.ts +25 -25
- package/src/node/request/proxy-cli-contribution.ts +65 -65
- package/src/node/ws-request-validators.ts +56 -56
- package/src/typings/native-keymap.d.ts +108 -108
- package/i18n/nls.pt-pt.json +0 -552
|
@@ -1,358 +1,358 @@
|
|
|
1
|
-
// *****************************************************************************
|
|
2
|
-
// Copyright (C) 2022 Ericsson 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 { PreferenceItem } from '../../common/preferences/preference-schema';
|
|
18
|
-
import { JSONObject, JSONValue } from '../../../shared/@phosphor/coreutils';
|
|
19
|
-
import { PreferenceSchemaProvider } from './preference-contribution';
|
|
20
|
-
import { PreferenceLanguageOverrideService } from './preference-language-override-service';
|
|
21
|
-
import { inject, injectable } from '../../../shared/inversify';
|
|
22
|
-
import { IJSONSchema, JsonType } from '../../common/json-schema';
|
|
23
|
-
import { deepClone, unreachable } from '../../common';
|
|
24
|
-
import { PreferenceProvider } from './preference-provider';
|
|
25
|
-
|
|
26
|
-
export interface PreferenceValidator<T> {
|
|
27
|
-
name: string;
|
|
28
|
-
validate(value: unknown): T;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export interface ValidatablePreference extends IJSONSchema, Pick<PreferenceItem, 'defaultValue'> { }
|
|
32
|
-
export type ValueValidator = (value: JSONValue) => JSONValue;
|
|
33
|
-
|
|
34
|
-
export interface PreferenceValidationResult<T extends JSONValue> {
|
|
35
|
-
original: JSONValue | undefined;
|
|
36
|
-
valid: T;
|
|
37
|
-
messages: string[];
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
type ValidatablePreferenceTuple = ValidatablePreference & ({ items: ValidatablePreference[] } | { prefixItems: ValidatablePreference[] });
|
|
41
|
-
|
|
42
|
-
@injectable()
|
|
43
|
-
export class PreferenceValidationService {
|
|
44
|
-
@inject(PreferenceSchemaProvider) protected readonly schemaProvider: PreferenceSchemaProvider;
|
|
45
|
-
@inject(PreferenceLanguageOverrideService) protected readonly languageOverrideService: PreferenceLanguageOverrideService;
|
|
46
|
-
|
|
47
|
-
validateOptions(options: Record<string, JSONValue>): Record<string, JSONValue> {
|
|
48
|
-
const valid: Record<string, JSONValue> = {};
|
|
49
|
-
let problemsDetected = false;
|
|
50
|
-
for (const [preferenceName, value] of Object.entries(options)) {
|
|
51
|
-
const validValue = this.validateByName(preferenceName, value);
|
|
52
|
-
if (validValue !== value) {
|
|
53
|
-
problemsDetected = true;
|
|
54
|
-
}
|
|
55
|
-
valid[preferenceName] = validValue;
|
|
56
|
-
}
|
|
57
|
-
return problemsDetected ? valid : options;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
validateByName(preferenceName: string, value: JSONValue): JSONValue {
|
|
61
|
-
const validValue = this.doValidateByName(preferenceName, value);
|
|
62
|
-
// If value is undefined, it means the preference wasn't set, not that a bad value was set.
|
|
63
|
-
if (validValue !== value && value !== undefined) {
|
|
64
|
-
console.warn(`While validating options, found impermissible value for ${preferenceName}. Using valid value`, validValue, 'instead of configured value', value);
|
|
65
|
-
}
|
|
66
|
-
return validValue;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
protected doValidateByName(preferenceName: string, value: JSONValue): JSONValue {
|
|
70
|
-
const schema = this.getSchema(preferenceName);
|
|
71
|
-
return this.validateBySchema(preferenceName, value, schema);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
validateBySchema(key: string, value: JSONValue, schema: ValidatablePreference | undefined): JSONValue {
|
|
75
|
-
try {
|
|
76
|
-
if (!schema) {
|
|
77
|
-
console.warn('Request to validate preference with no schema registered:', key);
|
|
78
|
-
return value;
|
|
79
|
-
}
|
|
80
|
-
if (schema.const !== undefined) {
|
|
81
|
-
return this.validateConst(key, value, schema as ValidatablePreference & { const: JSONValue });
|
|
82
|
-
}
|
|
83
|
-
if (Array.isArray(schema.enum)) {
|
|
84
|
-
return this.validateEnum(key, value, schema as ValidatablePreference & { enum: JSONValue[] });
|
|
85
|
-
}
|
|
86
|
-
if (Array.isArray(schema.anyOf)) {
|
|
87
|
-
return this.validateAnyOf(key, value, schema as ValidatablePreference & { anyOf: ValidatablePreference[] });
|
|
88
|
-
}
|
|
89
|
-
if (Array.isArray(schema.oneOf)) {
|
|
90
|
-
return this.validateOneOf(key, value, schema as ValidatablePreference & { oneOf: ValidatablePreference[] });
|
|
91
|
-
}
|
|
92
|
-
if (schema.type === undefined) {
|
|
93
|
-
console.warn('Request to validate preference with no type information:', key);
|
|
94
|
-
return value;
|
|
95
|
-
}
|
|
96
|
-
if (Array.isArray(schema.type)) {
|
|
97
|
-
return this.validateMultiple(key, value, schema as ValidatablePreference & { type: JsonType[] });
|
|
98
|
-
}
|
|
99
|
-
switch (schema.type) {
|
|
100
|
-
case 'array':
|
|
101
|
-
return this.validateArray(key, value, schema);
|
|
102
|
-
case 'boolean':
|
|
103
|
-
return this.validateBoolean(key, value, schema);
|
|
104
|
-
case 'integer':
|
|
105
|
-
return this.validateInteger(key, value, schema);
|
|
106
|
-
case 'null':
|
|
107
|
-
return null; // eslint-disable-line no-null/no-null
|
|
108
|
-
case 'number':
|
|
109
|
-
return this.validateNumber(key, value, schema);
|
|
110
|
-
case 'object':
|
|
111
|
-
return this.validateObject(key, value, schema);
|
|
112
|
-
case 'string':
|
|
113
|
-
return this.validateString(key, value, schema);
|
|
114
|
-
default:
|
|
115
|
-
unreachable(schema.type, `Request to validate preference with unknown type in schema: ${key}`);
|
|
116
|
-
}
|
|
117
|
-
} catch (e) {
|
|
118
|
-
console.error('Encountered an error while validating', key, 'with value', value, 'against schema', schema, e);
|
|
119
|
-
return value;
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
protected getSchema(name: string): ValidatablePreference | undefined {
|
|
124
|
-
const combinedSchema = this.schemaProvider.getCombinedSchema().properties;
|
|
125
|
-
if (combinedSchema[name]) {
|
|
126
|
-
return combinedSchema[name];
|
|
127
|
-
}
|
|
128
|
-
const baseName = this.languageOverrideService.overriddenPreferenceName(name)?.preferenceName;
|
|
129
|
-
return baseName !== undefined ? combinedSchema[baseName] : undefined;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
protected validateMultiple(key: string, value: JSONValue, schema: ValidatablePreference & { type: JsonType[] }): JSONValue {
|
|
133
|
-
const validation: ValidatablePreference = deepClone(schema);
|
|
134
|
-
const candidate = this.mapValidators(key, value, (function* (this: PreferenceValidationService): Iterable<ValueValidator> {
|
|
135
|
-
for (const type of schema.type) {
|
|
136
|
-
validation.type = type as JsonType;
|
|
137
|
-
yield toValidate => this.validateBySchema(key, toValidate, validation);
|
|
138
|
-
}
|
|
139
|
-
}).bind(this)());
|
|
140
|
-
if (candidate !== value && (schema.default !== undefined || schema.defaultValue !== undefined)) {
|
|
141
|
-
const configuredDefault = this.getDefaultFromSchema(schema);
|
|
142
|
-
return this.validateMultiple(key, configuredDefault, { ...schema, default: undefined, defaultValue: undefined });
|
|
143
|
-
}
|
|
144
|
-
return candidate;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
protected validateAnyOf(key: string, value: JSONValue, schema: ValidatablePreference & { anyOf: ValidatablePreference[] }): JSONValue {
|
|
148
|
-
const candidate = this.mapValidators(key, value, (function* (this: PreferenceValidationService): Iterable<ValueValidator> {
|
|
149
|
-
for (const option of schema.anyOf) {
|
|
150
|
-
yield toValidate => this.validateBySchema(key, toValidate, option);
|
|
151
|
-
}
|
|
152
|
-
}).bind(this)());
|
|
153
|
-
if (candidate !== value && (schema.default !== undefined || schema.defaultValue !== undefined)) {
|
|
154
|
-
const configuredDefault = this.getDefaultFromSchema(schema);
|
|
155
|
-
return this.validateAnyOf(key, configuredDefault, { ...schema, default: undefined, defaultValue: undefined });
|
|
156
|
-
}
|
|
157
|
-
return candidate;
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
protected validateOneOf(key: string, value: JSONValue, schema: ValidatablePreference & { oneOf: ValidatablePreference[] }): JSONValue {
|
|
161
|
-
let passed = false;
|
|
162
|
-
for (const subSchema of schema.oneOf) {
|
|
163
|
-
const validValue = this.validateBySchema(key, value, subSchema);
|
|
164
|
-
if (!passed && validValue === value) {
|
|
165
|
-
passed = true;
|
|
166
|
-
} else if (passed && validValue === value) {
|
|
167
|
-
passed = false;
|
|
168
|
-
break;
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
if (passed) {
|
|
172
|
-
return value;
|
|
173
|
-
}
|
|
174
|
-
if (schema.default !== undefined || schema.defaultValue !== undefined) {
|
|
175
|
-
const configuredDefault = this.getDefaultFromSchema(schema);
|
|
176
|
-
return this.validateOneOf(key, configuredDefault, { ...schema, default: undefined, defaultValue: undefined });
|
|
177
|
-
}
|
|
178
|
-
console.log(`While validating ${key}, failed to find a valid value or default value. Using configured value ${value}.`);
|
|
179
|
-
return value;
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
protected mapValidators(key: string, value: JSONValue, validators: Iterable<(value: JSONValue) => JSONValue>): JSONValue {
|
|
183
|
-
const candidates = [];
|
|
184
|
-
for (const validator of validators) {
|
|
185
|
-
const candidate = validator(value);
|
|
186
|
-
if (candidate === value) {
|
|
187
|
-
return candidate;
|
|
188
|
-
}
|
|
189
|
-
candidates.push(candidate);
|
|
190
|
-
}
|
|
191
|
-
return candidates[0];
|
|
192
|
-
}
|
|
193
|
-
protected validateArray(key: string, value: JSONValue, schema: ValidatablePreference): JSONValue[] {
|
|
194
|
-
const candidate = Array.isArray(value) ? value : this.getDefaultFromSchema(schema);
|
|
195
|
-
if (!Array.isArray(candidate)) {
|
|
196
|
-
return [];
|
|
197
|
-
}
|
|
198
|
-
if (!schema.items && !schema.prefixItems) {
|
|
199
|
-
console.warn('Requested validation of array without item specification:', key);
|
|
200
|
-
return candidate;
|
|
201
|
-
}
|
|
202
|
-
if (Array.isArray(schema.items) || Array.isArray(schema.prefixItems)) {
|
|
203
|
-
return this.validateTuple(key, value, schema as ValidatablePreferenceTuple);
|
|
204
|
-
}
|
|
205
|
-
const itemSchema = schema.items!;
|
|
206
|
-
const valid = candidate.filter(item => this.validateBySchema(key, item, itemSchema) === item);
|
|
207
|
-
return valid.length === candidate.length ? candidate : valid;
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
protected validateTuple(key: string, value: JSONValue, schema: ValidatablePreferenceTuple): JSONValue[] {
|
|
211
|
-
const defaultValue = this.getDefaultFromSchema(schema);
|
|
212
|
-
const maybeCandidate = Array.isArray(value) ? value : defaultValue;
|
|
213
|
-
// If we find that the provided value is not valid, we immediately bail and try the default value instead.
|
|
214
|
-
const shouldTryDefault = Array.isArray(schema.defaultValue ?? schema.default) && !PreferenceProvider.deepEqual(defaultValue, maybeCandidate);
|
|
215
|
-
const tryDefault = () => this.validateTuple(key, defaultValue, schema);
|
|
216
|
-
const candidate = Array.isArray(maybeCandidate) ? maybeCandidate : [];
|
|
217
|
-
// Only `prefixItems` is officially part of the JSON Schema spec, but `items` as array was part of a draft and was used by VSCode.
|
|
218
|
-
const tuple = (schema.prefixItems ?? schema.items) as Required<ValidatablePreference>['prefixItems'];
|
|
219
|
-
const lengthIsWrong = candidate.length < tuple.length || (candidate.length > tuple.length && !schema.additionalItems);
|
|
220
|
-
if (lengthIsWrong && shouldTryDefault) { return tryDefault(); }
|
|
221
|
-
let valid = true;
|
|
222
|
-
const validItems: JSONValue[] = [];
|
|
223
|
-
for (const [index, subschema] of tuple.entries()) {
|
|
224
|
-
const targetItem = candidate[index];
|
|
225
|
-
const validatedItem = targetItem === undefined ? this.getDefaultFromSchema(subschema) : this.validateBySchema(key, targetItem, subschema);
|
|
226
|
-
valid &&= validatedItem === targetItem;
|
|
227
|
-
if (!valid && shouldTryDefault) { return tryDefault(); }
|
|
228
|
-
validItems.push(validatedItem);
|
|
229
|
-
};
|
|
230
|
-
if (candidate.length > tuple.length) {
|
|
231
|
-
if (!schema.additionalItems) {
|
|
232
|
-
return validItems;
|
|
233
|
-
} else if (schema.additionalItems === true && !valid) {
|
|
234
|
-
validItems.push(...candidate.slice(tuple.length));
|
|
235
|
-
return validItems;
|
|
236
|
-
} else if (schema.additionalItems !== true) {
|
|
237
|
-
const applicableSchema = schema.additionalItems;
|
|
238
|
-
for (let i = tuple.length; i < candidate.length; i++) {
|
|
239
|
-
const targetItem = candidate[i];
|
|
240
|
-
const validatedItem = this.validateBySchema(key, targetItem, applicableSchema);
|
|
241
|
-
if (validatedItem === targetItem) {
|
|
242
|
-
validItems.push(targetItem);
|
|
243
|
-
} else {
|
|
244
|
-
valid = false;
|
|
245
|
-
if (shouldTryDefault) { return tryDefault(); }
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
return valid ? candidate : validItems;
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
protected validateConst(key: string, value: JSONValue, schema: ValidatablePreference & { const: JSONValue }): JSONValue {
|
|
254
|
-
if (PreferenceProvider.deepEqual(value, schema.const)) {
|
|
255
|
-
return value;
|
|
256
|
-
}
|
|
257
|
-
return schema.const;
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
protected validateEnum(key: string, value: JSONValue, schema: ValidatablePreference & { enum: JSONValue[] }): JSONValue {
|
|
261
|
-
const options = schema.enum;
|
|
262
|
-
if (options.some(option => PreferenceProvider.deepEqual(option, value))) {
|
|
263
|
-
return value;
|
|
264
|
-
}
|
|
265
|
-
const configuredDefault = this.getDefaultFromSchema(schema);
|
|
266
|
-
if (options.some(option => PreferenceProvider.deepEqual(option, configuredDefault))) {
|
|
267
|
-
return configuredDefault;
|
|
268
|
-
}
|
|
269
|
-
return options[0];
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
protected validateBoolean(key: string, value: JSONValue, schema: ValidatablePreference): boolean {
|
|
273
|
-
if (value === true || value === false) {
|
|
274
|
-
return value;
|
|
275
|
-
}
|
|
276
|
-
if (value === 'true') {
|
|
277
|
-
return true;
|
|
278
|
-
}
|
|
279
|
-
if (value === 'false') {
|
|
280
|
-
return false;
|
|
281
|
-
}
|
|
282
|
-
return Boolean(this.getDefaultFromSchema(schema));
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
protected validateInteger(key: string, value: JSONValue, schema: ValidatablePreference): number {
|
|
286
|
-
return Math.round(this.validateNumber(key, value, schema));
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
protected validateNumber(key: string, value: JSONValue, schema: ValidatablePreference): number {
|
|
290
|
-
let validated = Number(value);
|
|
291
|
-
if (isNaN(validated)) {
|
|
292
|
-
const configuredDefault = Number(this.getDefaultFromSchema(schema));
|
|
293
|
-
validated = isNaN(configuredDefault) ? 0 : configuredDefault;
|
|
294
|
-
}
|
|
295
|
-
if (schema.minimum !== undefined) {
|
|
296
|
-
validated = Math.max(validated, schema.minimum);
|
|
297
|
-
}
|
|
298
|
-
if (schema.maximum !== undefined) {
|
|
299
|
-
validated = Math.min(validated, schema.maximum);
|
|
300
|
-
}
|
|
301
|
-
return validated;
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
protected validateObject(key: string, value: JSONValue, schema: ValidatablePreference): JSONObject {
|
|
305
|
-
if (this.objectMatchesSchema(key, value, schema)) {
|
|
306
|
-
return value;
|
|
307
|
-
}
|
|
308
|
-
const configuredDefault = this.getDefaultFromSchema(schema);
|
|
309
|
-
if (this.objectMatchesSchema(key, configuredDefault, schema)) {
|
|
310
|
-
return configuredDefault;
|
|
311
|
-
}
|
|
312
|
-
return {};
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
// This evaluates most of the fields that commonly appear on PreferenceItem, but it could be improved to evaluate all possible JSON schema specifications.
|
|
316
|
-
protected objectMatchesSchema(key: string, value: JSONValue, schema: ValidatablePreference): value is JSONObject {
|
|
317
|
-
if (!value || typeof value !== 'object') {
|
|
318
|
-
return false;
|
|
319
|
-
}
|
|
320
|
-
if (schema.required && schema.required.some(requiredField => !(requiredField in value))) {
|
|
321
|
-
return false;
|
|
322
|
-
}
|
|
323
|
-
if (schema.additionalProperties === false && schema.properties && Object.keys(value).some(fieldKey => !(fieldKey in schema.properties!))) {
|
|
324
|
-
return false;
|
|
325
|
-
}
|
|
326
|
-
const additionalPropertyValidator = schema.additionalProperties !== true && !!schema.additionalProperties && schema.additionalProperties as IJSONSchema;
|
|
327
|
-
for (const [fieldKey, fieldValue] of Object.entries(value)) {
|
|
328
|
-
const fieldLabel = `${key}#${fieldKey}`;
|
|
329
|
-
if (schema.properties && fieldKey in schema.properties) {
|
|
330
|
-
const valid = this.validateBySchema(fieldLabel, fieldValue, schema.properties[fieldKey]);
|
|
331
|
-
if (valid !== fieldValue) {
|
|
332
|
-
return false;
|
|
333
|
-
}
|
|
334
|
-
} else if (additionalPropertyValidator) {
|
|
335
|
-
const valid = this.validateBySchema(fieldLabel, fieldValue, additionalPropertyValidator);
|
|
336
|
-
if (valid !== fieldValue) {
|
|
337
|
-
return false;
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
return true;
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
protected validateString(key: string, value: JSONValue, schema: ValidatablePreference): string {
|
|
345
|
-
if (typeof value === 'string') {
|
|
346
|
-
return value;
|
|
347
|
-
}
|
|
348
|
-
if (value instanceof String) {
|
|
349
|
-
return value.toString();
|
|
350
|
-
}
|
|
351
|
-
const configuredDefault = this.getDefaultFromSchema(schema);
|
|
352
|
-
return (configuredDefault ?? '').toString();
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
protected getDefaultFromSchema(schema: ValidatablePreference): JSONValue {
|
|
356
|
-
return this.schemaProvider.getDefaultValue(schema as PreferenceItem);
|
|
357
|
-
}
|
|
358
|
-
}
|
|
1
|
+
// *****************************************************************************
|
|
2
|
+
// Copyright (C) 2022 Ericsson 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 { PreferenceItem } from '../../common/preferences/preference-schema';
|
|
18
|
+
import { JSONObject, JSONValue } from '../../../shared/@phosphor/coreutils';
|
|
19
|
+
import { PreferenceSchemaProvider } from './preference-contribution';
|
|
20
|
+
import { PreferenceLanguageOverrideService } from './preference-language-override-service';
|
|
21
|
+
import { inject, injectable } from '../../../shared/inversify';
|
|
22
|
+
import { IJSONSchema, JsonType } from '../../common/json-schema';
|
|
23
|
+
import { deepClone, unreachable } from '../../common';
|
|
24
|
+
import { PreferenceProvider } from './preference-provider';
|
|
25
|
+
|
|
26
|
+
export interface PreferenceValidator<T> {
|
|
27
|
+
name: string;
|
|
28
|
+
validate(value: unknown): T;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface ValidatablePreference extends IJSONSchema, Pick<PreferenceItem, 'defaultValue'> { }
|
|
32
|
+
export type ValueValidator = (value: JSONValue) => JSONValue;
|
|
33
|
+
|
|
34
|
+
export interface PreferenceValidationResult<T extends JSONValue> {
|
|
35
|
+
original: JSONValue | undefined;
|
|
36
|
+
valid: T;
|
|
37
|
+
messages: string[];
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
type ValidatablePreferenceTuple = ValidatablePreference & ({ items: ValidatablePreference[] } | { prefixItems: ValidatablePreference[] });
|
|
41
|
+
|
|
42
|
+
@injectable()
|
|
43
|
+
export class PreferenceValidationService {
|
|
44
|
+
@inject(PreferenceSchemaProvider) protected readonly schemaProvider: PreferenceSchemaProvider;
|
|
45
|
+
@inject(PreferenceLanguageOverrideService) protected readonly languageOverrideService: PreferenceLanguageOverrideService;
|
|
46
|
+
|
|
47
|
+
validateOptions(options: Record<string, JSONValue>): Record<string, JSONValue> {
|
|
48
|
+
const valid: Record<string, JSONValue> = {};
|
|
49
|
+
let problemsDetected = false;
|
|
50
|
+
for (const [preferenceName, value] of Object.entries(options)) {
|
|
51
|
+
const validValue = this.validateByName(preferenceName, value);
|
|
52
|
+
if (validValue !== value) {
|
|
53
|
+
problemsDetected = true;
|
|
54
|
+
}
|
|
55
|
+
valid[preferenceName] = validValue;
|
|
56
|
+
}
|
|
57
|
+
return problemsDetected ? valid : options;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
validateByName(preferenceName: string, value: JSONValue): JSONValue {
|
|
61
|
+
const validValue = this.doValidateByName(preferenceName, value);
|
|
62
|
+
// If value is undefined, it means the preference wasn't set, not that a bad value was set.
|
|
63
|
+
if (validValue !== value && value !== undefined) {
|
|
64
|
+
console.warn(`While validating options, found impermissible value for ${preferenceName}. Using valid value`, validValue, 'instead of configured value', value);
|
|
65
|
+
}
|
|
66
|
+
return validValue;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
protected doValidateByName(preferenceName: string, value: JSONValue): JSONValue {
|
|
70
|
+
const schema = this.getSchema(preferenceName);
|
|
71
|
+
return this.validateBySchema(preferenceName, value, schema);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
validateBySchema(key: string, value: JSONValue, schema: ValidatablePreference | undefined): JSONValue {
|
|
75
|
+
try {
|
|
76
|
+
if (!schema) {
|
|
77
|
+
console.warn('Request to validate preference with no schema registered:', key);
|
|
78
|
+
return value;
|
|
79
|
+
}
|
|
80
|
+
if (schema.const !== undefined) {
|
|
81
|
+
return this.validateConst(key, value, schema as ValidatablePreference & { const: JSONValue });
|
|
82
|
+
}
|
|
83
|
+
if (Array.isArray(schema.enum)) {
|
|
84
|
+
return this.validateEnum(key, value, schema as ValidatablePreference & { enum: JSONValue[] });
|
|
85
|
+
}
|
|
86
|
+
if (Array.isArray(schema.anyOf)) {
|
|
87
|
+
return this.validateAnyOf(key, value, schema as ValidatablePreference & { anyOf: ValidatablePreference[] });
|
|
88
|
+
}
|
|
89
|
+
if (Array.isArray(schema.oneOf)) {
|
|
90
|
+
return this.validateOneOf(key, value, schema as ValidatablePreference & { oneOf: ValidatablePreference[] });
|
|
91
|
+
}
|
|
92
|
+
if (schema.type === undefined) {
|
|
93
|
+
console.warn('Request to validate preference with no type information:', key);
|
|
94
|
+
return value;
|
|
95
|
+
}
|
|
96
|
+
if (Array.isArray(schema.type)) {
|
|
97
|
+
return this.validateMultiple(key, value, schema as ValidatablePreference & { type: JsonType[] });
|
|
98
|
+
}
|
|
99
|
+
switch (schema.type) {
|
|
100
|
+
case 'array':
|
|
101
|
+
return this.validateArray(key, value, schema);
|
|
102
|
+
case 'boolean':
|
|
103
|
+
return this.validateBoolean(key, value, schema);
|
|
104
|
+
case 'integer':
|
|
105
|
+
return this.validateInteger(key, value, schema);
|
|
106
|
+
case 'null':
|
|
107
|
+
return null; // eslint-disable-line no-null/no-null
|
|
108
|
+
case 'number':
|
|
109
|
+
return this.validateNumber(key, value, schema);
|
|
110
|
+
case 'object':
|
|
111
|
+
return this.validateObject(key, value, schema);
|
|
112
|
+
case 'string':
|
|
113
|
+
return this.validateString(key, value, schema);
|
|
114
|
+
default:
|
|
115
|
+
unreachable(schema.type, `Request to validate preference with unknown type in schema: ${key}`);
|
|
116
|
+
}
|
|
117
|
+
} catch (e) {
|
|
118
|
+
console.error('Encountered an error while validating', key, 'with value', value, 'against schema', schema, e);
|
|
119
|
+
return value;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
protected getSchema(name: string): ValidatablePreference | undefined {
|
|
124
|
+
const combinedSchema = this.schemaProvider.getCombinedSchema().properties;
|
|
125
|
+
if (combinedSchema[name]) {
|
|
126
|
+
return combinedSchema[name];
|
|
127
|
+
}
|
|
128
|
+
const baseName = this.languageOverrideService.overriddenPreferenceName(name)?.preferenceName;
|
|
129
|
+
return baseName !== undefined ? combinedSchema[baseName] : undefined;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
protected validateMultiple(key: string, value: JSONValue, schema: ValidatablePreference & { type: JsonType[] }): JSONValue {
|
|
133
|
+
const validation: ValidatablePreference = deepClone(schema);
|
|
134
|
+
const candidate = this.mapValidators(key, value, (function* (this: PreferenceValidationService): Iterable<ValueValidator> {
|
|
135
|
+
for (const type of schema.type) {
|
|
136
|
+
validation.type = type as JsonType;
|
|
137
|
+
yield toValidate => this.validateBySchema(key, toValidate, validation);
|
|
138
|
+
}
|
|
139
|
+
}).bind(this)());
|
|
140
|
+
if (candidate !== value && (schema.default !== undefined || schema.defaultValue !== undefined)) {
|
|
141
|
+
const configuredDefault = this.getDefaultFromSchema(schema);
|
|
142
|
+
return this.validateMultiple(key, configuredDefault, { ...schema, default: undefined, defaultValue: undefined });
|
|
143
|
+
}
|
|
144
|
+
return candidate;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
protected validateAnyOf(key: string, value: JSONValue, schema: ValidatablePreference & { anyOf: ValidatablePreference[] }): JSONValue {
|
|
148
|
+
const candidate = this.mapValidators(key, value, (function* (this: PreferenceValidationService): Iterable<ValueValidator> {
|
|
149
|
+
for (const option of schema.anyOf) {
|
|
150
|
+
yield toValidate => this.validateBySchema(key, toValidate, option);
|
|
151
|
+
}
|
|
152
|
+
}).bind(this)());
|
|
153
|
+
if (candidate !== value && (schema.default !== undefined || schema.defaultValue !== undefined)) {
|
|
154
|
+
const configuredDefault = this.getDefaultFromSchema(schema);
|
|
155
|
+
return this.validateAnyOf(key, configuredDefault, { ...schema, default: undefined, defaultValue: undefined });
|
|
156
|
+
}
|
|
157
|
+
return candidate;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
protected validateOneOf(key: string, value: JSONValue, schema: ValidatablePreference & { oneOf: ValidatablePreference[] }): JSONValue {
|
|
161
|
+
let passed = false;
|
|
162
|
+
for (const subSchema of schema.oneOf) {
|
|
163
|
+
const validValue = this.validateBySchema(key, value, subSchema);
|
|
164
|
+
if (!passed && validValue === value) {
|
|
165
|
+
passed = true;
|
|
166
|
+
} else if (passed && validValue === value) {
|
|
167
|
+
passed = false;
|
|
168
|
+
break;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
if (passed) {
|
|
172
|
+
return value;
|
|
173
|
+
}
|
|
174
|
+
if (schema.default !== undefined || schema.defaultValue !== undefined) {
|
|
175
|
+
const configuredDefault = this.getDefaultFromSchema(schema);
|
|
176
|
+
return this.validateOneOf(key, configuredDefault, { ...schema, default: undefined, defaultValue: undefined });
|
|
177
|
+
}
|
|
178
|
+
console.log(`While validating ${key}, failed to find a valid value or default value. Using configured value ${value}.`);
|
|
179
|
+
return value;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
protected mapValidators(key: string, value: JSONValue, validators: Iterable<(value: JSONValue) => JSONValue>): JSONValue {
|
|
183
|
+
const candidates = [];
|
|
184
|
+
for (const validator of validators) {
|
|
185
|
+
const candidate = validator(value);
|
|
186
|
+
if (candidate === value) {
|
|
187
|
+
return candidate;
|
|
188
|
+
}
|
|
189
|
+
candidates.push(candidate);
|
|
190
|
+
}
|
|
191
|
+
return candidates[0];
|
|
192
|
+
}
|
|
193
|
+
protected validateArray(key: string, value: JSONValue, schema: ValidatablePreference): JSONValue[] {
|
|
194
|
+
const candidate = Array.isArray(value) ? value : this.getDefaultFromSchema(schema);
|
|
195
|
+
if (!Array.isArray(candidate)) {
|
|
196
|
+
return [];
|
|
197
|
+
}
|
|
198
|
+
if (!schema.items && !schema.prefixItems) {
|
|
199
|
+
console.warn('Requested validation of array without item specification:', key);
|
|
200
|
+
return candidate;
|
|
201
|
+
}
|
|
202
|
+
if (Array.isArray(schema.items) || Array.isArray(schema.prefixItems)) {
|
|
203
|
+
return this.validateTuple(key, value, schema as ValidatablePreferenceTuple);
|
|
204
|
+
}
|
|
205
|
+
const itemSchema = schema.items!;
|
|
206
|
+
const valid = candidate.filter(item => this.validateBySchema(key, item, itemSchema) === item);
|
|
207
|
+
return valid.length === candidate.length ? candidate : valid;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
protected validateTuple(key: string, value: JSONValue, schema: ValidatablePreferenceTuple): JSONValue[] {
|
|
211
|
+
const defaultValue = this.getDefaultFromSchema(schema);
|
|
212
|
+
const maybeCandidate = Array.isArray(value) ? value : defaultValue;
|
|
213
|
+
// If we find that the provided value is not valid, we immediately bail and try the default value instead.
|
|
214
|
+
const shouldTryDefault = Array.isArray(schema.defaultValue ?? schema.default) && !PreferenceProvider.deepEqual(defaultValue, maybeCandidate);
|
|
215
|
+
const tryDefault = () => this.validateTuple(key, defaultValue, schema);
|
|
216
|
+
const candidate = Array.isArray(maybeCandidate) ? maybeCandidate : [];
|
|
217
|
+
// Only `prefixItems` is officially part of the JSON Schema spec, but `items` as array was part of a draft and was used by VSCode.
|
|
218
|
+
const tuple = (schema.prefixItems ?? schema.items) as Required<ValidatablePreference>['prefixItems'];
|
|
219
|
+
const lengthIsWrong = candidate.length < tuple.length || (candidate.length > tuple.length && !schema.additionalItems);
|
|
220
|
+
if (lengthIsWrong && shouldTryDefault) { return tryDefault(); }
|
|
221
|
+
let valid = true;
|
|
222
|
+
const validItems: JSONValue[] = [];
|
|
223
|
+
for (const [index, subschema] of tuple.entries()) {
|
|
224
|
+
const targetItem = candidate[index];
|
|
225
|
+
const validatedItem = targetItem === undefined ? this.getDefaultFromSchema(subschema) : this.validateBySchema(key, targetItem, subschema);
|
|
226
|
+
valid &&= validatedItem === targetItem;
|
|
227
|
+
if (!valid && shouldTryDefault) { return tryDefault(); }
|
|
228
|
+
validItems.push(validatedItem);
|
|
229
|
+
};
|
|
230
|
+
if (candidate.length > tuple.length) {
|
|
231
|
+
if (!schema.additionalItems) {
|
|
232
|
+
return validItems;
|
|
233
|
+
} else if (schema.additionalItems === true && !valid) {
|
|
234
|
+
validItems.push(...candidate.slice(tuple.length));
|
|
235
|
+
return validItems;
|
|
236
|
+
} else if (schema.additionalItems !== true) {
|
|
237
|
+
const applicableSchema = schema.additionalItems;
|
|
238
|
+
for (let i = tuple.length; i < candidate.length; i++) {
|
|
239
|
+
const targetItem = candidate[i];
|
|
240
|
+
const validatedItem = this.validateBySchema(key, targetItem, applicableSchema);
|
|
241
|
+
if (validatedItem === targetItem) {
|
|
242
|
+
validItems.push(targetItem);
|
|
243
|
+
} else {
|
|
244
|
+
valid = false;
|
|
245
|
+
if (shouldTryDefault) { return tryDefault(); }
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
return valid ? candidate : validItems;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
protected validateConst(key: string, value: JSONValue, schema: ValidatablePreference & { const: JSONValue }): JSONValue {
|
|
254
|
+
if (PreferenceProvider.deepEqual(value, schema.const)) {
|
|
255
|
+
return value;
|
|
256
|
+
}
|
|
257
|
+
return schema.const;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
protected validateEnum(key: string, value: JSONValue, schema: ValidatablePreference & { enum: JSONValue[] }): JSONValue {
|
|
261
|
+
const options = schema.enum;
|
|
262
|
+
if (options.some(option => PreferenceProvider.deepEqual(option, value))) {
|
|
263
|
+
return value;
|
|
264
|
+
}
|
|
265
|
+
const configuredDefault = this.getDefaultFromSchema(schema);
|
|
266
|
+
if (options.some(option => PreferenceProvider.deepEqual(option, configuredDefault))) {
|
|
267
|
+
return configuredDefault;
|
|
268
|
+
}
|
|
269
|
+
return options[0];
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
protected validateBoolean(key: string, value: JSONValue, schema: ValidatablePreference): boolean {
|
|
273
|
+
if (value === true || value === false) {
|
|
274
|
+
return value;
|
|
275
|
+
}
|
|
276
|
+
if (value === 'true') {
|
|
277
|
+
return true;
|
|
278
|
+
}
|
|
279
|
+
if (value === 'false') {
|
|
280
|
+
return false;
|
|
281
|
+
}
|
|
282
|
+
return Boolean(this.getDefaultFromSchema(schema));
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
protected validateInteger(key: string, value: JSONValue, schema: ValidatablePreference): number {
|
|
286
|
+
return Math.round(this.validateNumber(key, value, schema));
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
protected validateNumber(key: string, value: JSONValue, schema: ValidatablePreference): number {
|
|
290
|
+
let validated = Number(value);
|
|
291
|
+
if (isNaN(validated)) {
|
|
292
|
+
const configuredDefault = Number(this.getDefaultFromSchema(schema));
|
|
293
|
+
validated = isNaN(configuredDefault) ? 0 : configuredDefault;
|
|
294
|
+
}
|
|
295
|
+
if (schema.minimum !== undefined) {
|
|
296
|
+
validated = Math.max(validated, schema.minimum);
|
|
297
|
+
}
|
|
298
|
+
if (schema.maximum !== undefined) {
|
|
299
|
+
validated = Math.min(validated, schema.maximum);
|
|
300
|
+
}
|
|
301
|
+
return validated;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
protected validateObject(key: string, value: JSONValue, schema: ValidatablePreference): JSONObject {
|
|
305
|
+
if (this.objectMatchesSchema(key, value, schema)) {
|
|
306
|
+
return value;
|
|
307
|
+
}
|
|
308
|
+
const configuredDefault = this.getDefaultFromSchema(schema);
|
|
309
|
+
if (this.objectMatchesSchema(key, configuredDefault, schema)) {
|
|
310
|
+
return configuredDefault;
|
|
311
|
+
}
|
|
312
|
+
return {};
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
// This evaluates most of the fields that commonly appear on PreferenceItem, but it could be improved to evaluate all possible JSON schema specifications.
|
|
316
|
+
protected objectMatchesSchema(key: string, value: JSONValue, schema: ValidatablePreference): value is JSONObject {
|
|
317
|
+
if (!value || typeof value !== 'object') {
|
|
318
|
+
return false;
|
|
319
|
+
}
|
|
320
|
+
if (schema.required && schema.required.some(requiredField => !(requiredField in value))) {
|
|
321
|
+
return false;
|
|
322
|
+
}
|
|
323
|
+
if (schema.additionalProperties === false && schema.properties && Object.keys(value).some(fieldKey => !(fieldKey in schema.properties!))) {
|
|
324
|
+
return false;
|
|
325
|
+
}
|
|
326
|
+
const additionalPropertyValidator = schema.additionalProperties !== true && !!schema.additionalProperties && schema.additionalProperties as IJSONSchema;
|
|
327
|
+
for (const [fieldKey, fieldValue] of Object.entries(value)) {
|
|
328
|
+
const fieldLabel = `${key}#${fieldKey}`;
|
|
329
|
+
if (schema.properties && fieldKey in schema.properties) {
|
|
330
|
+
const valid = this.validateBySchema(fieldLabel, fieldValue, schema.properties[fieldKey]);
|
|
331
|
+
if (valid !== fieldValue) {
|
|
332
|
+
return false;
|
|
333
|
+
}
|
|
334
|
+
} else if (additionalPropertyValidator) {
|
|
335
|
+
const valid = this.validateBySchema(fieldLabel, fieldValue, additionalPropertyValidator);
|
|
336
|
+
if (valid !== fieldValue) {
|
|
337
|
+
return false;
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
return true;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
protected validateString(key: string, value: JSONValue, schema: ValidatablePreference): string {
|
|
345
|
+
if (typeof value === 'string') {
|
|
346
|
+
return value;
|
|
347
|
+
}
|
|
348
|
+
if (value instanceof String) {
|
|
349
|
+
return value.toString();
|
|
350
|
+
}
|
|
351
|
+
const configuredDefault = this.getDefaultFromSchema(schema);
|
|
352
|
+
return (configuredDefault ?? '').toString();
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
protected getDefaultFromSchema(schema: ValidatablePreference): JSONValue {
|
|
356
|
+
return this.schemaProvider.getDefaultValue(schema as PreferenceItem);
|
|
357
|
+
}
|
|
358
|
+
}
|