@theia/core 1.65.0-next.6 → 1.65.1

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.
Files changed (440) hide show
  1. package/README.md +6 -6
  2. package/i18n/nls.cs.json +117 -15
  3. package/i18n/nls.de.json +117 -15
  4. package/i18n/nls.es.json +117 -15
  5. package/i18n/nls.fr.json +117 -15
  6. package/i18n/nls.hu.json +117 -15
  7. package/i18n/nls.it.json +117 -15
  8. package/i18n/nls.ja.json +117 -15
  9. package/i18n/nls.json +121 -19
  10. package/i18n/nls.ko.json +117 -15
  11. package/i18n/nls.pl.json +117 -15
  12. package/i18n/nls.pt-br.json +117 -15
  13. package/i18n/nls.ru.json +117 -15
  14. package/i18n/nls.tr.json +117 -15
  15. package/i18n/nls.zh-cn.json +117 -15
  16. package/i18n/nls.zh-tw.json +117 -15
  17. package/lib/browser/breadcrumbs/breadcrumbs-renderer.d.ts +1 -1
  18. package/lib/browser/breadcrumbs/breadcrumbs-renderer.d.ts.map +1 -1
  19. package/lib/browser/breadcrumbs/breadcrumbs-renderer.js +1 -1
  20. package/lib/browser/breadcrumbs/breadcrumbs-renderer.js.map +1 -1
  21. package/lib/browser/catalog.json +227 -32
  22. package/lib/browser/common-frontend-contribution.d.ts +2 -3
  23. package/lib/browser/common-frontend-contribution.d.ts.map +1 -1
  24. package/lib/browser/common-frontend-contribution.js +3 -4
  25. package/lib/browser/common-frontend-contribution.js.map +1 -1
  26. package/lib/browser/dialogs/react-dialog.d.ts.map +1 -1
  27. package/lib/browser/dialogs/react-dialog.js +1 -0
  28. package/lib/browser/dialogs/react-dialog.js.map +1 -1
  29. package/lib/browser/encoding-registry.d.ts +1 -1
  30. package/lib/browser/encoding-registry.d.ts.map +1 -1
  31. package/lib/browser/encoding-registry.js +1 -1
  32. package/lib/browser/encoding-registry.js.map +1 -1
  33. package/lib/browser/frontend-application-bindings.d.ts.map +1 -1
  34. package/lib/browser/frontend-application-bindings.js +10 -17
  35. package/lib/browser/frontend-application-bindings.js.map +1 -1
  36. package/lib/browser/frontend-application-module.d.ts.map +1 -1
  37. package/lib/browser/frontend-application-module.js +10 -6
  38. package/lib/browser/frontend-application-module.js.map +1 -1
  39. package/lib/browser/frontend-application.d.ts +1 -1
  40. package/lib/browser/frontend-application.d.ts.map +1 -1
  41. package/lib/browser/frontend-application.js +1 -1
  42. package/lib/browser/frontend-application.js.map +1 -1
  43. package/lib/browser/hover-service.d.ts +1 -2
  44. package/lib/browser/hover-service.d.ts.map +1 -1
  45. package/lib/browser/hover-service.js +1 -2
  46. package/lib/browser/hover-service.js.map +1 -1
  47. package/lib/browser/icon-theme-service.d.ts +3 -2
  48. package/lib/browser/icon-theme-service.d.ts.map +1 -1
  49. package/lib/browser/icon-theme-service.js +4 -3
  50. package/lib/browser/icon-theme-service.js.map +1 -1
  51. package/lib/browser/index.d.ts +0 -1
  52. package/lib/browser/index.d.ts.map +1 -1
  53. package/lib/browser/index.js +0 -1
  54. package/lib/browser/index.js.map +1 -1
  55. package/lib/browser/json-schema-store.d.ts +2 -0
  56. package/lib/browser/json-schema-store.d.ts.map +1 -1
  57. package/lib/browser/json-schema-store.js +10 -3
  58. package/lib/browser/json-schema-store.js.map +1 -1
  59. package/lib/browser/keybinding.d.ts +1 -1
  60. package/lib/browser/keybinding.d.ts.map +1 -1
  61. package/lib/browser/keybinding.js +1 -1
  62. package/lib/browser/keybinding.js.map +1 -1
  63. package/lib/browser/keybinding.spec.js +1 -1
  64. package/lib/browser/keybinding.spec.js.map +1 -1
  65. package/lib/browser/menu/browser-menu-plugin.d.ts +3 -3
  66. package/lib/browser/menu/browser-menu-plugin.d.ts.map +1 -1
  67. package/lib/browser/menu/browser-menu-plugin.js +4 -5
  68. package/lib/browser/menu/browser-menu-plugin.js.map +1 -1
  69. package/lib/browser/open-with-service.d.ts +1 -1
  70. package/lib/browser/open-with-service.d.ts.map +1 -1
  71. package/lib/browser/open-with-service.js +3 -3
  72. package/lib/browser/open-with-service.js.map +1 -1
  73. package/lib/browser/opener-service.d.ts +1 -2
  74. package/lib/browser/opener-service.d.ts.map +1 -1
  75. package/lib/browser/opener-service.js.map +1 -1
  76. package/lib/browser/preferences/frontend-config-preference-contributions.d.ts +6 -0
  77. package/lib/browser/preferences/frontend-config-preference-contributions.d.ts.map +1 -0
  78. package/lib/browser/preferences/frontend-config-preference-contributions.js +60 -0
  79. package/lib/browser/preferences/frontend-config-preference-contributions.js.map +1 -0
  80. package/lib/browser/preferences/index.d.ts +0 -5
  81. package/lib/browser/preferences/index.d.ts.map +1 -1
  82. package/lib/browser/preferences/index.js +0 -5
  83. package/lib/browser/preferences/index.js.map +1 -1
  84. package/lib/browser/preferences/preference-contribution.d.ts +0 -96
  85. package/lib/browser/preferences/preference-contribution.d.ts.map +1 -1
  86. package/lib/browser/preferences/preference-contribution.js +14 -355
  87. package/lib/browser/preferences/preference-contribution.js.map +1 -1
  88. package/lib/browser/preferences/preference-proxy.spec.js +25 -17
  89. package/lib/browser/preferences/preference-proxy.spec.js.map +1 -1
  90. package/lib/browser/preferences/preference-schema-provider.spec.js +21 -34
  91. package/lib/browser/preferences/preference-schema-provider.spec.js.map +1 -1
  92. package/lib/browser/preferences/preference-service.spec.js +57 -80
  93. package/lib/browser/preferences/preference-service.spec.js.map +1 -1
  94. package/lib/browser/preferences/preference-validation-service.d.ts +24 -26
  95. package/lib/browser/preferences/preference-validation-service.d.ts.map +1 -1
  96. package/lib/browser/preferences/preference-validation-service.js +40 -20
  97. package/lib/browser/preferences/preference-validation-service.js.map +1 -1
  98. package/lib/browser/preferences/preference-validation-service.spec.js +10 -6
  99. package/lib/browser/preferences/preference-validation-service.spec.js.map +1 -1
  100. package/lib/browser/preferences/test/mock-preference-provider.d.ts +2 -3
  101. package/lib/browser/preferences/test/mock-preference-provider.d.ts.map +1 -1
  102. package/lib/browser/preferences/test/mock-preference-provider.js +5 -7
  103. package/lib/browser/preferences/test/mock-preference-provider.js.map +1 -1
  104. package/lib/browser/preferences/test/mock-preference-proxy.d.ts.map +1 -1
  105. package/lib/browser/preferences/test/mock-preference-proxy.js.map +1 -1
  106. package/lib/browser/preferences/test/mock-preference-service.d.ts +1 -4
  107. package/lib/browser/preferences/test/mock-preference-service.d.ts.map +1 -1
  108. package/lib/browser/preferences/test/mock-preference-service.js.map +1 -1
  109. package/lib/browser/quick-input/quick-command-service.d.ts +1 -1
  110. package/lib/browser/quick-input/quick-command-service.d.ts.map +1 -1
  111. package/lib/browser/quick-input/quick-command-service.js +1 -1
  112. package/lib/browser/quick-input/quick-command-service.js.map +1 -1
  113. package/lib/browser/request/browser-request-service.d.ts +1 -1
  114. package/lib/browser/request/browser-request-service.d.ts.map +1 -1
  115. package/lib/browser/request/browser-request-service.js +2 -2
  116. package/lib/browser/request/browser-request-service.js.map +1 -1
  117. package/lib/browser/saveable.d.ts +9 -0
  118. package/lib/browser/saveable.d.ts.map +1 -1
  119. package/lib/browser/saveable.js.map +1 -1
  120. package/lib/browser/secondary-window-handler.d.ts +21 -9
  121. package/lib/browser/secondary-window-handler.d.ts.map +1 -1
  122. package/lib/browser/secondary-window-handler.js +162 -21
  123. package/lib/browser/secondary-window-handler.js.map +1 -1
  124. package/lib/browser/shell/application-shell.d.ts +7 -2
  125. package/lib/browser/shell/application-shell.d.ts.map +1 -1
  126. package/lib/browser/shell/application-shell.js +27 -10
  127. package/lib/browser/shell/application-shell.js.map +1 -1
  128. package/lib/browser/shell/shell-layout-restorer.d.ts +13 -0
  129. package/lib/browser/shell/shell-layout-restorer.d.ts.map +1 -1
  130. package/lib/browser/shell/shell-layout-restorer.js +8 -1
  131. package/lib/browser/shell/shell-layout-restorer.js.map +1 -1
  132. package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-menu-adapters.d.ts +30 -16
  133. package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-menu-adapters.d.ts.map +1 -1
  134. package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-menu-adapters.js +116 -33
  135. package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-menu-adapters.js.map +1 -1
  136. package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-registry.d.ts.map +1 -1
  137. package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-registry.js +8 -3
  138. package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-registry.js.map +1 -1
  139. package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar.js +1 -1
  140. package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar.js.map +1 -1
  141. package/lib/browser/shell/tab-bar-toolbar/tab-toolbar-item.d.ts +2 -2
  142. package/lib/browser/shell/tab-bar-toolbar/tab-toolbar-item.d.ts.map +1 -1
  143. package/lib/browser/shell/tab-bars.d.ts +1 -1
  144. package/lib/browser/shell/tab-bars.d.ts.map +1 -1
  145. package/lib/browser/shell/theia-dock-panel.d.ts +19 -2
  146. package/lib/browser/shell/theia-dock-panel.d.ts.map +1 -1
  147. package/lib/browser/shell/theia-dock-panel.js +82 -0
  148. package/lib/browser/shell/theia-dock-panel.js.map +1 -1
  149. package/lib/browser/status-bar/status-bar.d.ts +1 -1
  150. package/lib/browser/status-bar/status-bar.d.ts.map +1 -1
  151. package/lib/browser/status-bar/status-bar.js +3 -2
  152. package/lib/browser/status-bar/status-bar.js.map +1 -1
  153. package/lib/browser/theming.d.ts +5 -4
  154. package/lib/browser/theming.d.ts.map +1 -1
  155. package/lib/browser/theming.js +7 -6
  156. package/lib/browser/theming.js.map +1 -1
  157. package/lib/browser/tooltip-service.d.ts +1 -1
  158. package/lib/browser/tooltip-service.d.ts.map +1 -1
  159. package/lib/browser/tooltip-service.js +1 -1
  160. package/lib/browser/tooltip-service.js.map +1 -1
  161. package/lib/browser/tree/index.d.ts +0 -1
  162. package/lib/browser/tree/index.d.ts.map +1 -1
  163. package/lib/browser/tree/index.js +0 -1
  164. package/lib/browser/tree/index.js.map +1 -1
  165. package/lib/browser/tree/tree-widget.d.ts +2 -2
  166. package/lib/browser/tree/tree-widget.d.ts.map +1 -1
  167. package/lib/browser/tree/tree-widget.js +5 -4
  168. package/lib/browser/tree/tree-widget.js.map +1 -1
  169. package/lib/browser/view-container.d.ts.map +1 -1
  170. package/lib/browser/view-container.js +2 -2
  171. package/lib/browser/view-container.js.map +1 -1
  172. package/lib/browser/widgets/extractable-widget.d.ts +3 -0
  173. package/lib/browser/widgets/extractable-widget.d.ts.map +1 -1
  174. package/lib/browser/widgets/extractable-widget.js.map +1 -1
  175. package/lib/browser/widgets/widget.js +4 -4
  176. package/lib/browser/widgets/widget.js.map +1 -1
  177. package/lib/browser/window/default-secondary-window-service.d.ts +10 -5
  178. package/lib/browser/window/default-secondary-window-service.d.ts.map +1 -1
  179. package/lib/browser/window/default-secondary-window-service.js +53 -13
  180. package/lib/browser/window/default-secondary-window-service.js.map +1 -1
  181. package/lib/browser/window/default-window-service.d.ts +1 -1
  182. package/lib/browser/window/default-window-service.d.ts.map +1 -1
  183. package/lib/browser/window/default-window-service.js +1 -1
  184. package/lib/browser/window/default-window-service.js.map +1 -1
  185. package/lib/browser/window/default-window-service.spec.js +1 -1
  186. package/lib/browser/window/default-window-service.spec.js.map +1 -1
  187. package/lib/browser/window/secondary-window-service.d.ts +15 -2
  188. package/lib/browser/window/secondary-window-service.d.ts.map +1 -1
  189. package/lib/browser/window/secondary-window-service.js +12 -1
  190. package/lib/browser/window/secondary-window-service.js.map +1 -1
  191. package/lib/browser/window/window-title-service.d.ts +1 -1
  192. package/lib/browser/window/window-title-service.d.ts.map +1 -1
  193. package/lib/browser/window/window-title-service.js +1 -1
  194. package/lib/browser/window/window-title-service.js.map +1 -1
  195. package/lib/{browser → common}/core-preferences.d.ts +2 -1
  196. package/lib/common/core-preferences.d.ts.map +1 -0
  197. package/lib/{browser → common}/core-preferences.js +17 -18
  198. package/lib/common/core-preferences.js.map +1 -0
  199. package/lib/common/index.d.ts +4 -0
  200. package/lib/common/index.d.ts.map +1 -1
  201. package/lib/common/index.js +4 -0
  202. package/lib/common/index.js.map +1 -1
  203. package/lib/common/inversify-utils.d.ts +31 -0
  204. package/lib/common/inversify-utils.d.ts.map +1 -0
  205. package/lib/common/inversify-utils.js +60 -0
  206. package/lib/common/inversify-utils.js.map +1 -0
  207. package/lib/common/json-schema.d.ts +1 -0
  208. package/lib/common/json-schema.d.ts.map +1 -1
  209. package/lib/common/menu/menu-types.d.ts +1 -0
  210. package/lib/common/menu/menu-types.d.ts.map +1 -1
  211. package/lib/common/menu/menu-types.js.map +1 -1
  212. package/lib/common/preferences/defaults-preference-provider.d.ts +21 -0
  213. package/lib/common/preferences/defaults-preference-provider.d.ts.map +1 -0
  214. package/lib/common/preferences/defaults-preference-provider.js +99 -0
  215. package/lib/common/preferences/defaults-preference-provider.js.map +1 -0
  216. package/lib/common/preferences/index.d.ts +12 -0
  217. package/lib/common/preferences/index.d.ts.map +1 -0
  218. package/lib/common/preferences/index.js +30 -0
  219. package/lib/common/preferences/index.js.map +1 -0
  220. package/lib/{browser → common}/preferences/injectable-preference-proxy.d.ts +1 -1
  221. package/lib/common/preferences/injectable-preference-proxy.d.ts.map +1 -0
  222. package/lib/{browser → common}/preferences/injectable-preference-proxy.js +2 -2
  223. package/lib/common/preferences/injectable-preference-proxy.js.map +1 -0
  224. package/lib/common/preferences/preference-configurations.d.ts.map +1 -0
  225. package/lib/common/preferences/preference-configurations.js.map +1 -0
  226. package/lib/{browser → common}/preferences/preference-language-override-service.d.ts +4 -13
  227. package/lib/common/preferences/preference-language-override-service.d.ts.map +1 -0
  228. package/lib/{browser → common}/preferences/preference-language-override-service.js +14 -30
  229. package/lib/common/preferences/preference-language-override-service.js.map +1 -0
  230. package/lib/common/preferences/preference-provider-impl.d.ts +52 -0
  231. package/lib/common/preferences/preference-provider-impl.d.ts.map +1 -0
  232. package/lib/{browser/preferences/preference-provider.js → common/preferences/preference-provider-impl.js} +23 -95
  233. package/lib/common/preferences/preference-provider-impl.js.map +1 -0
  234. package/lib/{browser → common}/preferences/preference-provider.d.ts +34 -59
  235. package/lib/common/preferences/preference-provider.d.ts.map +1 -0
  236. package/lib/common/preferences/preference-provider.js +71 -0
  237. package/lib/common/preferences/preference-provider.js.map +1 -0
  238. package/lib/common/preferences/preference-provider.spec.d.ts.map +1 -0
  239. package/lib/{browser → common}/preferences/preference-provider.spec.js +4 -4
  240. package/lib/common/preferences/preference-provider.spec.js.map +1 -0
  241. package/lib/{browser → common}/preferences/preference-proxy.d.ts +2 -2
  242. package/lib/common/preferences/preference-proxy.d.ts.map +1 -0
  243. package/lib/{browser → common}/preferences/preference-proxy.js +10 -10
  244. package/lib/common/preferences/preference-proxy.js.map +1 -0
  245. package/lib/common/preferences/preference-schema-service.d.ts +55 -0
  246. package/lib/common/preferences/preference-schema-service.d.ts.map +1 -0
  247. package/lib/common/preferences/preference-schema-service.js +402 -0
  248. package/lib/common/preferences/preference-schema-service.js.map +1 -0
  249. package/lib/common/preferences/preference-schema.d.ts +145 -43
  250. package/lib/common/preferences/preference-schema.d.ts.map +1 -1
  251. package/lib/common/preferences/preference-schema.js +3 -41
  252. package/lib/common/preferences/preference-schema.js.map +1 -1
  253. package/lib/common/preferences/preference-scope.d.ts +4 -1
  254. package/lib/common/preferences/preference-scope.d.ts.map +1 -1
  255. package/lib/common/preferences/preference-scope.js +5 -14
  256. package/lib/common/preferences/preference-scope.js.map +1 -1
  257. package/lib/{browser → common}/preferences/preference-service.d.ts +9 -10
  258. package/lib/common/preferences/preference-service.d.ts.map +1 -0
  259. package/lib/{browser → common}/preferences/preference-service.js +68 -58
  260. package/lib/common/preferences/preference-service.js.map +1 -0
  261. package/lib/common/stream.d.ts +9 -0
  262. package/lib/common/stream.d.ts.map +1 -1
  263. package/lib/common/stream.js +93 -2
  264. package/lib/common/stream.js.map +1 -1
  265. package/lib/common/supported-encodings.d.ts.map +1 -0
  266. package/lib/common/supported-encodings.js.map +1 -0
  267. package/lib/{browser/tree → common}/tree-preference.d.ts +1 -1
  268. package/lib/common/tree-preference.d.ts.map +1 -0
  269. package/lib/{browser/tree → common}/tree-preference.js +3 -5
  270. package/lib/common/tree-preference.js.map +1 -0
  271. package/lib/electron-browser/menu/electron-context-menu-renderer.d.ts +2 -1
  272. package/lib/electron-browser/menu/electron-context-menu-renderer.d.ts.map +1 -1
  273. package/lib/electron-browser/menu/electron-context-menu-renderer.js +2 -1
  274. package/lib/electron-browser/menu/electron-context-menu-renderer.js.map +1 -1
  275. package/lib/electron-browser/menu/electron-main-menu-factory.d.ts +1 -2
  276. package/lib/electron-browser/menu/electron-main-menu-factory.d.ts.map +1 -1
  277. package/lib/electron-browser/menu/electron-main-menu-factory.js +11 -10
  278. package/lib/electron-browser/menu/electron-main-menu-factory.js.map +1 -1
  279. package/lib/electron-browser/menu/electron-menu-contribution.d.ts +2 -2
  280. package/lib/electron-browser/menu/electron-menu-contribution.d.ts.map +1 -1
  281. package/lib/electron-browser/menu/electron-menu-contribution.js +6 -6
  282. package/lib/electron-browser/menu/electron-menu-contribution.js.map +1 -1
  283. package/lib/electron-browser/preload.d.ts.map +1 -1
  284. package/lib/electron-browser/preload.js +3 -0
  285. package/lib/electron-browser/preload.js.map +1 -1
  286. package/lib/electron-browser/window/electron-secondary-window-service.d.ts.map +1 -1
  287. package/lib/electron-browser/window/electron-secondary-window-service.js +5 -4
  288. package/lib/electron-browser/window/electron-secondary-window-service.js.map +1 -1
  289. package/lib/electron-browser/window/electron-window-module.js +1 -1
  290. package/lib/electron-browser/window/electron-window-module.js.map +1 -1
  291. package/lib/electron-browser/window/electron-window-service.d.ts +1 -1
  292. package/lib/electron-browser/window/electron-window-service.d.ts.map +1 -1
  293. package/lib/electron-browser/window/electron-window-service.js +1 -1
  294. package/lib/electron-browser/window/electron-window-service.js.map +1 -1
  295. package/lib/electron-common/electron-api.d.ts +2 -0
  296. package/lib/electron-common/electron-api.d.ts.map +1 -1
  297. package/lib/electron-common/electron-api.js +2 -1
  298. package/lib/electron-common/electron-api.js.map +1 -1
  299. package/lib/{electron-browser/window → electron-common}/electron-window-preferences.d.ts +2 -1
  300. package/lib/electron-common/electron-window-preferences.d.ts.map +1 -0
  301. package/lib/{electron-browser/window → electron-common}/electron-window-preferences.js +7 -7
  302. package/lib/electron-common/electron-window-preferences.js.map +1 -0
  303. package/lib/electron-main/electron-api-main.d.ts.map +1 -1
  304. package/lib/electron-main/electron-api-main.js +9 -0
  305. package/lib/electron-main/electron-api-main.js.map +1 -1
  306. package/lib/electron-node/window/electron-window-module.d.ts +4 -0
  307. package/lib/electron-node/window/electron-window-module.d.ts.map +1 -0
  308. package/lib/{browser/preferences/preference-scope.js → electron-node/window/electron-window-module.js} +7 -5
  309. package/lib/electron-node/window/electron-window-module.js.map +1 -0
  310. package/lib/node/backend-application-module.d.ts.map +1 -1
  311. package/lib/node/backend-application-module.js +13 -0
  312. package/lib/node/backend-application-module.js.map +1 -1
  313. package/lib/node/backend-application.js +1 -1
  314. package/lib/node/logger-cli-contribution.d.ts +7 -1
  315. package/lib/node/logger-cli-contribution.d.ts.map +1 -1
  316. package/lib/node/logger-cli-contribution.js +22 -10
  317. package/lib/node/logger-cli-contribution.js.map +1 -1
  318. package/lib/node/logger-cli-contribution.spec.js +13 -2
  319. package/lib/node/logger-cli-contribution.spec.js.map +1 -1
  320. package/package.json +8 -7
  321. package/src/browser/breadcrumbs/breadcrumbs-renderer.tsx +1 -1
  322. package/src/browser/common-frontend-contribution.ts +2 -3
  323. package/src/browser/dialogs/react-dialog.tsx +1 -0
  324. package/src/browser/encoding-registry.ts +1 -1
  325. package/src/browser/frontend-application-bindings.ts +8 -13
  326. package/src/browser/frontend-application-module.ts +13 -6
  327. package/src/browser/frontend-application.ts +1 -1
  328. package/src/browser/hover-service.ts +1 -2
  329. package/src/browser/icon-theme-service.ts +3 -2
  330. package/src/browser/index.ts +0 -1
  331. package/src/browser/json-schema-store.ts +9 -1
  332. package/src/browser/keybinding.spec.ts +1 -1
  333. package/src/browser/keybinding.ts +1 -1
  334. package/src/browser/menu/browser-menu-plugin.ts +7 -7
  335. package/src/browser/open-with-service.ts +1 -1
  336. package/src/browser/opener-service.ts +1 -2
  337. package/src/browser/preferences/frontend-config-preference-contributions.ts +52 -0
  338. package/src/browser/preferences/index.ts +0 -5
  339. package/src/browser/preferences/preference-contribution.ts +16 -398
  340. package/src/browser/preferences/preference-proxy.spec.ts +27 -17
  341. package/src/browser/preferences/preference-schema-provider.spec.ts +25 -37
  342. package/src/browser/preferences/preference-service.spec.ts +32 -56
  343. package/src/browser/preferences/preference-validation-service.spec.ts +27 -19
  344. package/src/browser/preferences/preference-validation-service.ts +60 -41
  345. package/src/browser/preferences/test/mock-preference-provider.ts +2 -5
  346. package/src/browser/preferences/test/mock-preference-proxy.ts +1 -2
  347. package/src/browser/preferences/test/mock-preference-service.ts +1 -4
  348. package/src/browser/quick-input/quick-command-service.ts +1 -1
  349. package/src/browser/request/browser-request-service.ts +4 -4
  350. package/src/browser/saveable.ts +8 -0
  351. package/src/browser/secondary-window-handler.ts +189 -29
  352. package/src/browser/shell/application-shell.ts +36 -13
  353. package/src/browser/shell/shell-layout-restorer.ts +15 -0
  354. package/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar-menu-adapters.tsx +139 -40
  355. package/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar-registry.ts +12 -6
  356. package/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar.tsx +2 -2
  357. package/src/browser/shell/tab-bar-toolbar/tab-toolbar-item.tsx +2 -2
  358. package/src/browser/shell/tab-bars.ts +1 -1
  359. package/src/browser/shell/theia-dock-panel.ts +101 -2
  360. package/src/browser/status-bar/status-bar.tsx +3 -2
  361. package/src/browser/style/dockpanel.css +7 -0
  362. package/src/browser/theming.ts +7 -6
  363. package/src/browser/tooltip-service.tsx +1 -1
  364. package/src/browser/tree/index.ts +0 -1
  365. package/src/browser/tree/tree-widget.tsx +6 -5
  366. package/src/browser/view-container.ts +5 -5
  367. package/src/browser/widgets/extractable-widget.ts +3 -0
  368. package/src/browser/widgets/widget.ts +4 -4
  369. package/src/browser/window/default-secondary-window-service.ts +54 -17
  370. package/src/browser/window/default-window-service.spec.ts +1 -1
  371. package/src/browser/window/default-window-service.ts +1 -1
  372. package/src/browser/window/secondary-window-service.ts +23 -2
  373. package/src/browser/window/window-title-service.ts +1 -1
  374. package/src/{browser → common}/core-preferences.ts +16 -17
  375. package/src/common/index.ts +4 -0
  376. package/src/common/inversify-utils.ts +63 -0
  377. package/src/common/json-schema.ts +1 -0
  378. package/src/common/menu/menu-types.ts +2 -0
  379. package/src/common/preferences/defaults-preference-provider.ts +91 -0
  380. package/src/common/preferences/index.ts +27 -0
  381. package/src/{browser → common}/preferences/injectable-preference-proxy.ts +3 -3
  382. package/src/{browser → common}/preferences/preference-language-override-service.ts +12 -29
  383. package/src/common/preferences/preference-provider-impl.ts +165 -0
  384. package/src/{browser → common}/preferences/preference-provider.spec.ts +6 -5
  385. package/src/common/preferences/preference-provider.ts +164 -0
  386. package/src/{browser → common}/preferences/preference-proxy.ts +15 -14
  387. package/src/common/preferences/preference-schema-service.ts +434 -0
  388. package/src/common/preferences/preference-schema.ts +156 -64
  389. package/src/common/preferences/preference-scope.ts +5 -13
  390. package/src/{browser → common}/preferences/preference-service.ts +76 -63
  391. package/src/common/stream.ts +102 -1
  392. package/src/{browser/tree → common}/tree-preference.ts +2 -4
  393. package/src/electron-browser/menu/electron-context-menu-renderer.ts +2 -1
  394. package/src/electron-browser/menu/electron-main-menu-factory.ts +13 -11
  395. package/src/electron-browser/menu/electron-menu-contribution.ts +9 -6
  396. package/src/electron-browser/preload.ts +4 -1
  397. package/src/electron-browser/window/electron-secondary-window-service.ts +7 -4
  398. package/src/electron-browser/window/electron-window-module.ts +1 -1
  399. package/src/electron-browser/window/electron-window-service.ts +1 -1
  400. package/src/electron-common/electron-api.ts +2 -0
  401. package/src/{electron-browser/window → electron-common}/electron-window-preferences.ts +6 -6
  402. package/src/electron-main/electron-api-main.ts +11 -1
  403. package/src/{browser/preferences/preference-scope.ts → electron-node/window/electron-window-module.ts} +7 -3
  404. package/src/node/backend-application-module.ts +28 -1
  405. package/src/node/backend-application.ts +1 -1
  406. package/src/node/logger-cli-contribution.spec.ts +17 -2
  407. package/src/node/logger-cli-contribution.ts +18 -3
  408. package/lib/browser/core-preferences.d.ts.map +0 -1
  409. package/lib/browser/core-preferences.js.map +0 -1
  410. package/lib/browser/preferences/injectable-preference-proxy.d.ts.map +0 -1
  411. package/lib/browser/preferences/injectable-preference-proxy.js.map +0 -1
  412. package/lib/browser/preferences/preference-configurations.d.ts.map +0 -1
  413. package/lib/browser/preferences/preference-configurations.js.map +0 -1
  414. package/lib/browser/preferences/preference-language-override-service.d.ts.map +0 -1
  415. package/lib/browser/preferences/preference-language-override-service.js.map +0 -1
  416. package/lib/browser/preferences/preference-provider.d.ts.map +0 -1
  417. package/lib/browser/preferences/preference-provider.js.map +0 -1
  418. package/lib/browser/preferences/preference-provider.spec.d.ts.map +0 -1
  419. package/lib/browser/preferences/preference-provider.spec.js.map +0 -1
  420. package/lib/browser/preferences/preference-proxy.d.ts.map +0 -1
  421. package/lib/browser/preferences/preference-proxy.js.map +0 -1
  422. package/lib/browser/preferences/preference-scope.d.ts +0 -3
  423. package/lib/browser/preferences/preference-scope.d.ts.map +0 -1
  424. package/lib/browser/preferences/preference-scope.js.map +0 -1
  425. package/lib/browser/preferences/preference-service.d.ts.map +0 -1
  426. package/lib/browser/preferences/preference-service.js.map +0 -1
  427. package/lib/browser/supported-encodings.d.ts.map +0 -1
  428. package/lib/browser/supported-encodings.js.map +0 -1
  429. package/lib/browser/tree/tree-preference.d.ts.map +0 -1
  430. package/lib/browser/tree/tree-preference.js.map +0 -1
  431. package/lib/electron-browser/window/electron-window-preferences.d.ts.map +0 -1
  432. package/lib/electron-browser/window/electron-window-preferences.js.map +0 -1
  433. package/src/browser/preferences/preference-provider.ts +0 -277
  434. /package/lib/{browser → common}/preferences/preference-configurations.d.ts +0 -0
  435. /package/lib/{browser → common}/preferences/preference-configurations.js +0 -0
  436. /package/lib/{browser → common}/preferences/preference-provider.spec.d.ts +0 -0
  437. /package/lib/{browser → common}/supported-encodings.d.ts +0 -0
  438. /package/lib/{browser → common}/supported-encodings.js +0 -0
  439. /package/src/{browser → common}/preferences/preference-configurations.ts +0 -0
  440. /package/src/{browser → common}/supported-encodings.ts +0 -0
@@ -0,0 +1,434 @@
1
+ // *****************************************************************************
2
+ // Copyright (C) 2025 STMicroelectronics and others.
3
+ //
4
+ // This program and the accompanying materials are made available under the
5
+ // terms of the Eclipse Public License v. 2.0 which is available at
6
+ // http://www.eclipse.org/legal/epl-2.0.
7
+ //
8
+ // This Source Code may also be made available under the following Secondary
9
+ // Licenses when the conditions for such availability set forth in the Eclipse
10
+ // Public License v. 2.0 are satisfied: GNU General Public License, version 2
11
+ // with the GNU Classpath Exception which is available at
12
+ // https://www.gnu.org/software/classpath/license.html.
13
+ //
14
+ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
15
+ // *****************************************************************************
16
+
17
+ import { inject, injectable, named, postConstruct } from 'inversify';
18
+ import { Disposable } from '../disposable';
19
+ import { Emitter } from '../event';
20
+ import { IJSONSchema } from '../json-schema';
21
+ import { JSONObject, JSONValue } from '@lumino/coreutils';
22
+ import { PreferenceDataProperty, PreferenceSchema, PreferenceSchemaService, DefaultValueChangedEvent, PreferenceContribution } from './preference-schema';
23
+ import { PreferenceScope, ValidPreferenceScopes } from './preference-scope';
24
+ import { PreferenceUtils } from './preference-provider';
25
+ import { ContributionProvider } from '../contribution-provider';
26
+ import { Deferred } from '../promise-util';
27
+
28
+ const NO_OVERRIDE = {};
29
+ const OVERRIDE_PROPERTY = '\\[(.*)\\]$';
30
+
31
+ @injectable()
32
+ export class PreferenceSchemaServiceImpl implements PreferenceSchemaService {
33
+ // Storage structures
34
+ protected readonly schemas = new Set<PreferenceSchema>();
35
+ protected readonly properties = new Map<string, PreferenceDataProperty>();
36
+ /**
37
+ * This map stores default overrides. The primary map key is the base preference name.
38
+ * The preference name maps to a second map keyed by the override identifier or a special object value `NO_OVERRIDE',
39
+ * representing default overrides for the base property. The value in this second map is an array
40
+ * of entries in reverse order of their insertion. This is necessary becuaus multiple clients might register
41
+ * overrides for the same preference key/override combination. The elements in this array consist of a unique, generated
42
+ * identifier and the actual override value. This allows us to always return the last registerd override even
43
+ * when overrides are later removed.
44
+ */
45
+ protected readonly defaultOverrides = new Map<string, Map<string | object, [number, JSONValue][]>>();
46
+ protected readonly _overrideIdentifiers = new Set<string>();
47
+
48
+ protected readonly jsonSchemas: IJSONSchema[] = [];
49
+
50
+ protected readonly _ready = new Deferred();
51
+
52
+ get ready(): Promise<void> {
53
+ return this._ready.promise;
54
+ }
55
+
56
+ get overrideIdentifiers(): ReadonlySet<string> {
57
+ return this._overrideIdentifiers;
58
+ }
59
+
60
+ getSchemaProperties(): ReadonlyMap<string, PreferenceDataProperty> {
61
+ return this.properties;
62
+ }
63
+
64
+ protected nextSchemaTitle = 1;
65
+ protected nextOverrideValueId = 1;
66
+
67
+ // Event emitters
68
+ protected readonly defaultValueChangedEmitter = new Emitter<DefaultValueChangedEvent>();
69
+ protected readonly schemaChangedEmitter = new Emitter<void>();
70
+
71
+ // Public events
72
+ readonly onDidChangeDefaultValue = this.defaultValueChangedEmitter.event;
73
+ readonly onDidChangeSchema = this.schemaChangedEmitter.event;
74
+
75
+ @inject(ValidPreferenceScopes)
76
+ readonly validScopes: readonly PreferenceScope[];
77
+
78
+ @inject(ContributionProvider) @named(PreferenceContribution)
79
+ protected readonly preferenceContributions: ContributionProvider<PreferenceContribution>;
80
+
81
+ @postConstruct()
82
+ protected init(): void {
83
+ for (const scope of this.validScopes) {
84
+ this.jsonSchemas[scope] = {
85
+ type: 'object',
86
+ properties: {},
87
+ patternProperties: {},
88
+ additionalProperties: false
89
+ };
90
+ }
91
+ const promises: Promise<void>[] = [];
92
+ this.preferenceContributions.getContributions().forEach(contrib => {
93
+ if (contrib.schema) {
94
+ this.addSchema(contrib.schema);
95
+ }
96
+ if (contrib.initSchema) {
97
+ promises.push(contrib.initSchema(this));
98
+ }
99
+ });
100
+ Promise.all(promises).then(() => this._ready.resolve());
101
+ }
102
+
103
+ dispose(): void {
104
+ this.defaultValueChangedEmitter.dispose();
105
+ this.schemaChangedEmitter.dispose();
106
+ }
107
+
108
+ registerOverrideIdentifier(overrideIdentifier: string): Disposable {
109
+ if (!this._overrideIdentifiers.has(overrideIdentifier)) {
110
+ this.addOverrideToJsonSchema(overrideIdentifier);
111
+ this._overrideIdentifiers.add(overrideIdentifier);
112
+ this.schemaChangedEmitter.fire();
113
+
114
+ return Disposable.create(() => {
115
+ if (this._overrideIdentifiers.delete(overrideIdentifier)) {
116
+ this.schemaChangedEmitter.fire();
117
+ }
118
+ });
119
+ }
120
+ return Disposable.NULL;
121
+ }
122
+
123
+ addSchema(schema: PreferenceSchema): Disposable {
124
+ this.schemas.add(schema);
125
+
126
+ for (const [key, property] of Object.entries(schema.properties)) {
127
+ if (this.properties.has(key)) {
128
+ throw new Error(`Property with id '${key}' already exists`);
129
+ }
130
+
131
+ if (property.scope === undefined) {
132
+ property.scope = schema.scope;
133
+ }
134
+
135
+ if (property.overridable === undefined) {
136
+ property.overridable = schema.defaultOverridable;
137
+ }
138
+
139
+ this.properties.set(key, property);
140
+ this.setJSONSchemasProperty(key, property);
141
+ if (property.default !== undefined) {
142
+ this.defaultValueChangedEmitter.fire(this.changeFor(key, undefined, this.defaultOverrides.get(key), undefined, property.default!));
143
+ }
144
+
145
+ }
146
+
147
+ this.schemaChangedEmitter.fire();
148
+
149
+ return Disposable.create(() => {
150
+ if (this.schemas.delete(schema)) {
151
+ for (const [key, property] of Object.entries(schema.properties)) {
152
+ this.deleteFromJSONSchemas(key, property);
153
+ this.properties.delete(key);
154
+ const overrides = this.defaultOverrides.get(key);
155
+
156
+ const baseOverride = overrides?.get(NO_OVERRIDE);
157
+ if (baseOverride !== undefined) {
158
+ this.defaultValueChangedEmitter.fire(this.changeFor(key, undefined, overrides, baseOverride, undefined));
159
+ } else if (property.default !== undefined) {
160
+ this.defaultValueChangedEmitter.fire(this.changeFor(key, undefined, overrides, property.default, undefined));
161
+ }
162
+ if (overrides) {
163
+ for (const [overrideKey, value] of overrides) {
164
+ if (typeof overrideKey === 'string') {
165
+ this.defaultValueChangedEmitter.fire(this.changeFor(key, overrideKey, overrides, value[0][1], undefined));
166
+ }
167
+ }
168
+ }
169
+ }
170
+
171
+ this.schemaChangedEmitter.fire();
172
+ }
173
+ });
174
+ }
175
+
176
+ isValidInScope(preferenceName: string, scope: PreferenceScope): boolean {
177
+ const property = this.properties.get(preferenceName);
178
+
179
+ if (!property) {
180
+ return false;
181
+ }
182
+
183
+ // A property is valid in a scope if:
184
+ // 1. It is included (undefined or true)
185
+ // 2. Its scope is not defined (valid in all scopes) or its scope includes the given scope
186
+ return (property.included !== false) &&
187
+ (property.scope === undefined || property.scope >= scope);
188
+ }
189
+
190
+ getSchemaProperty(key: string): PreferenceDataProperty | undefined {
191
+ return this.properties.get(key);
192
+ }
193
+
194
+ updateSchemaProperty(key: string, property: PreferenceDataProperty): void {
195
+ const existing = this.properties.get(key);
196
+ if (existing) {
197
+ // Update the property with new values
198
+ const updatedProperty = { ...existing, ...property };
199
+ this.properties.set(key, updatedProperty);
200
+ const hasNoBaseOverrideValue = this.defaultOverrides.get(key)?.get(NO_OVERRIDE) === undefined;
201
+ if (hasNoBaseOverrideValue && !PreferenceUtils.deepEqual(property.default, existing.default)) {
202
+ this.defaultValueChangedEmitter.fire(this.changeFor(key, undefined, this.defaultOverrides.get(key), undefined, property.default!));
203
+ }
204
+
205
+ this.setJSONSchemasProperty(key, updatedProperty);
206
+ this.schemaChangedEmitter.fire();
207
+ } else {
208
+ console.warn(`Trying to update non-existent property ${key}`);
209
+ }
210
+ }
211
+
212
+ registerOverride(key: string, overrideIdentifier: string | undefined, value: JSONValue): Disposable {
213
+ const overrideId = overrideIdentifier || NO_OVERRIDE;
214
+ const property = this.properties.get(key);
215
+ if (!property) {
216
+ console.warn(`Trying to register default override for non-existent preference: ${key}`);
217
+ } else if (!property.overridable && overrideIdentifier) {
218
+ console.warn(`Trying to register default override for identifier ${overrideIdentifier} for non-overridable preference: ${key}`);
219
+ }
220
+
221
+ let overrides = this.defaultOverrides.get(key);
222
+ if (!overrides) {
223
+ overrides = new Map();
224
+ this.defaultOverrides.set(key, overrides);
225
+ }
226
+
227
+ const oldValue = this.getDefaultValue(key, overrideIdentifier);
228
+
229
+ const overrideValueId = this.nextOverrideValueId;
230
+ let override = overrides.get(overrideId);
231
+ if (!override) {
232
+ override = [];
233
+ overrides.set(overrideId, override);
234
+ }
235
+ override.unshift([overrideValueId, value]);
236
+
237
+ // Fire event only if the value actually changed
238
+ if (!PreferenceUtils.deepEqual(oldValue, value)) {
239
+ const evt = this.changeFor(key, overrideIdentifier, overrides, oldValue, value);
240
+ this.defaultValueChangedEmitter.fire(evt);
241
+ }
242
+
243
+ if (property) {
244
+ this.setJSONSchemasProperty(key, property);
245
+ }
246
+
247
+ return Disposable.create(() => {
248
+ this.removeOverride(key, overrideIdentifier, overrideValueId);
249
+ });
250
+ }
251
+
252
+ protected changeFor(key: string, overrideIdentifier: string | undefined,
253
+ overrides: Map<string | object, [number, JSONValue][]> | undefined, oldValue: JSONValue | undefined, newValue: JSONValue | undefined): DefaultValueChangedEvent {
254
+ const affectedOverrides = [];
255
+ if (!overrideIdentifier) {
256
+ for (const id of this._overrideIdentifiers) {
257
+ if (!overrides?.has(id)) {
258
+ affectedOverrides.push(id);
259
+ }
260
+ }
261
+ }
262
+ return {
263
+ key,
264
+ overrideIdentifier: overrideIdentifier,
265
+ otherAffectedOverrides: affectedOverrides,
266
+ oldValue,
267
+ newValue
268
+ };
269
+ }
270
+
271
+ protected removeOverride(key: string, overrideIdentifier: string | undefined, overrideValueId: number): void {
272
+ const overrideId = overrideIdentifier || NO_OVERRIDE;
273
+ const overrides = this.defaultOverrides.get(key);
274
+ if (overrides) {
275
+ const values = overrides.get(overrideId);
276
+ if (values) {
277
+ const index = values.findIndex(v => v[0] === overrideValueId);
278
+ if (index) {
279
+ const oldValue = this.getDefaultValue(key, overrideIdentifier);
280
+ values.splice(index, 1);
281
+ const newValue = this.getDefaultValue(key, overrideIdentifier);
282
+ if (!PreferenceUtils.deepEqual(oldValue, newValue)) {
283
+
284
+ const affectedOverrides = [];
285
+ if (!overrideIdentifier) {
286
+ for (const id of this._overrideIdentifiers) {
287
+ if (!overrides.has(id)) {
288
+ affectedOverrides.push(id);
289
+ }
290
+ }
291
+ }
292
+
293
+ this.defaultValueChangedEmitter.fire({
294
+ key,
295
+ overrideIdentifier,
296
+ otherAffectedOverrides: affectedOverrides,
297
+ oldValue,
298
+ newValue
299
+ });
300
+ }
301
+ }
302
+ if (values.length === 0) {
303
+ overrides.delete(overrideId);
304
+ }
305
+ }
306
+ if (overrides.size === 0) {
307
+ this.defaultOverrides.delete(key);
308
+ }
309
+ }
310
+ }
311
+
312
+ getDefaultValue(key: string, overrideIdentifier: string | undefined): JSONValue | undefined {
313
+ const overrideId = overrideIdentifier || NO_OVERRIDE;
314
+ const overrides = this.defaultOverrides.get(key);
315
+ if (overrides) {
316
+ const values = overrides.get(overrideId);
317
+ if (values) {
318
+ return values[0][1]; // there will be no empty values arrays in the data structure
319
+ }
320
+ }
321
+
322
+ const property = this.properties.get(key);
323
+ return property?.default;
324
+ }
325
+
326
+ inspectDefaultValue(key: string, overrideIdentifier: string | undefined): JSONValue | undefined {
327
+ const overrideId = overrideIdentifier || NO_OVERRIDE;
328
+ const overrides = this.defaultOverrides.get(key);
329
+ if (overrides) {
330
+ const values = overrides.get(overrideId);
331
+ if (values) {
332
+ return values[0][1]; // there will be no empty values arrays in the data structure
333
+ }
334
+ }
335
+
336
+ if (!overrideIdentifier) {
337
+ const property = this.properties.get(key);
338
+ return property?.default;
339
+ }
340
+ return undefined;
341
+ }
342
+
343
+ getJSONSchema(scope: PreferenceScope): IJSONSchema {
344
+ return this.jsonSchemas[scope];
345
+ }
346
+
347
+ private setJSONSchemasProperty(key: string, property: PreferenceDataProperty): void {
348
+ for (const scope of this.validScopes) {
349
+ if (this.isValidInScope(key, scope)) {
350
+ this.setJSONSchemaProperty(this.jsonSchemas[scope], key, property);
351
+ }
352
+ }
353
+ }
354
+ private deleteFromJSONSchemas(key: string, property: PreferenceDataProperty): void {
355
+ for (const scope of this.validScopes) {
356
+ if (this.isValidInScope(key, scope)) {
357
+ const schema = this.jsonSchemas[scope];
358
+ for (const name of Object.keys(schema.properties!)) {
359
+ if (name.match(OVERRIDE_PROPERTY)) {
360
+ const value = schema.properties![name] as IJSONSchema;
361
+ delete value.properties![key];
362
+ } else {
363
+ delete schema.properties![key];
364
+ }
365
+ }
366
+ }
367
+ }
368
+ }
369
+
370
+ private setJSONSchemaProperty(schema: IJSONSchema, key: string, property: PreferenceDataProperty): void {
371
+ // Add property to the schema
372
+ const prop = { ...property, default: this.getDefaultValue(key, undefined) };
373
+ schema.properties![key] = prop;
374
+ delete prop['scope'];
375
+ delete prop['overridable'];
376
+ if (property.overridable) {
377
+ for (const overrideIdentifier of this._overrideIdentifiers) {
378
+ const overrideSchema: IJSONSchema = schema.properties![`[${overrideIdentifier}]`] || {
379
+ type: 'object',
380
+ properties: {},
381
+ patternProperties: {},
382
+ additionalProperties: false
383
+ };
384
+ schema.properties![`[${overrideIdentifier}]`] = overrideSchema;
385
+ overrideSchema.properties![key] = { ...property, default: this.getDefaultValue(key, overrideIdentifier) };
386
+ }
387
+ }
388
+ }
389
+
390
+ addOverrideToJsonSchema(overrideIdentifier: string): void {
391
+ for (const scope of this.validScopes) {
392
+ const schema = this.jsonSchemas[scope];
393
+ const overrideSchema: IJSONSchema = {
394
+ type: 'object',
395
+ properties: {},
396
+ patternProperties: {},
397
+ additionalProperties: false
398
+ };
399
+ schema.properties![`[${overrideIdentifier}]`] = overrideSchema;
400
+ for (const [key, property] of this.properties.entries()) {
401
+ if (property.overridable && this.isValidInScope(key, scope)) {
402
+ overrideSchema.properties![key] = { ...property, default: this.getDefaultValue(key, overrideIdentifier) };
403
+ }
404
+ }
405
+ }
406
+ }
407
+
408
+ getDefaultValues(): JSONObject {
409
+ const result: JSONObject = {};
410
+
411
+ for (const [key, property] of this.properties.entries()) {
412
+ if (this.isValidInScope(key, PreferenceScope.Default)) {
413
+ if (property.default !== undefined) {
414
+ result[key] = property.default;
415
+ }
416
+ const overrides = this.defaultOverrides.get(key);
417
+ if (overrides) {
418
+ for (const [overrideId, values] of overrides.entries()) {
419
+ if (overrideId === NO_OVERRIDE) {
420
+ result[key] = values[0][1];
421
+ } else {
422
+ const overrideKey = `[${overrideId}]`;
423
+ const target: JSONObject = result[overrideKey] as JSONObject || {};
424
+ target[key] = values[0][1];
425
+ result[overrideKey] = target;
426
+ }
427
+ }
428
+ }
429
+ }
430
+ }
431
+
432
+ return result;
433
+ }
434
+ }
@@ -16,89 +16,181 @@
16
16
 
17
17
  /* eslint-disable @typescript-eslint/no-explicit-any */
18
18
 
19
- import { JSONValue } from '@lumino/coreutils';
19
+ import { JSONObject, JSONValue } from '@lumino/coreutils';
20
20
  import { IJSONSchema } from '../json-schema';
21
21
  import { PreferenceScope } from './preference-scope';
22
- import { isObject, isString } from '../types';
22
+ import { Event } from '../event';
23
+ import { Disposable } from '../disposable';
23
24
 
24
- export interface PreferenceSchema {
25
- [name: string]: any,
26
- scope?: 'application' | 'window' | 'resource' | PreferenceScope,
27
- overridable?: boolean;
25
+ export const PreferenceContribution = Symbol('PreferenceContribution');
26
+ /**
27
+ * A {@link PreferenceContribution} allows adding additional custom preferences.
28
+ * For this, the {@link PreferenceContribution} has to provide a valid `PrefernceSchema` specifying which preferences
29
+ * are available including their types and description.
30
+ *
31
+ * ### Example usage
32
+ * ```typescript
33
+ * const MyPreferencesSchema: PreferenceSchema = {
34
+ * 'scope': PreferenceScope.Folder,
35
+ * 'properties': {
36
+ * 'myext.decorations.enabled': {
37
+ * 'type': 'boolean',
38
+ * 'description': 'Show file status',
39
+ * 'default': true
40
+ * },
41
+ * // [...]
42
+ * }
43
+ * }
44
+ * @injectable()
45
+ * export class MyPreferenceContribution implements PreferenceContribution{
46
+ * schema= MyPreferencesSchema;
47
+ * }
48
+ * ```
49
+ */
50
+ export interface PreferenceContribution {
51
+ readonly schema?: PreferenceSchema;
28
52
  /**
29
- * The title of the preference schema.
30
- * It is used in the preference UI to associate a localized group of preferences.
53
+ * Allows to do additional intialisation of the preference schema, for example registering overrides
54
+ * @param service the preference schema service
31
55
  */
32
- title?: string;
33
- properties: PreferenceSchemaProperties
34
- }
35
- export namespace PreferenceSchema {
36
- export function is(obj: unknown): obj is PreferenceSchema {
37
- return isObject<PreferenceSchema>(obj) && PreferenceSchemaProperties.is(obj.properties);
38
- }
39
- export function getDefaultScope(schema: PreferenceSchema): PreferenceScope {
40
- let defaultScope: PreferenceScope = PreferenceScope.Workspace;
41
- if (!PreferenceScope.is(schema.scope)) {
42
- defaultScope = PreferenceScope.fromString(<string>schema.scope) || PreferenceScope.Workspace;
43
- } else {
44
- defaultScope = schema.scope;
45
- }
46
- return defaultScope;
47
- }
56
+ initSchema?(service: PreferenceSchemaService): Promise<void>
48
57
  }
49
58
 
50
- export interface PreferenceSchemaProperties {
51
- [name: string]: PreferenceSchemaProperty
52
- }
53
- export namespace PreferenceSchemaProperties {
54
- export function is(obj: unknown): obj is PreferenceSchemaProperties {
55
- return isObject(obj);
56
- }
59
+ export interface IndexedAccess<T> {
60
+ [name: string]: T;
57
61
  }
58
62
 
59
- export interface PreferenceDataSchema {
60
- [name: string]: any,
63
+ export interface PreferenceSchema {
64
+ /** The default scope for properties in this schema */
61
65
  scope?: PreferenceScope,
62
- properties: {
63
- [name: string]: PreferenceDataProperty
64
- }
65
- patternProperties: {
66
- [name: string]: PreferenceDataProperty
67
- };
66
+ /** Optional title to be used in UI */
67
+ title?: string,
68
+ /** Whether properties in this schema are overridable by default. Defaults to false. */
69
+ defaultOverridable?: boolean;
70
+ properties: IndexedAccess<PreferenceDataProperty>;
68
71
  }
69
72
 
70
- export interface PreferenceItem extends IJSONSchema {
73
+ export interface PreferenceDataProperty extends IJSONSchema {
71
74
  /**
72
- * preference default value, if `undefined` then `default`
75
+ * Whether distinct values can be defined for language override identifers. E.g. values valid when editing typescript files vs.
76
+ * when editing Java files
73
77
  */
74
- defaultValue?: JSONValue;
75
78
  overridable?: boolean;
76
- /** If false, the preference will not be included in the schema or the UI. */
79
+ /** If false, the preference will not be included in the schema or the UI. E.g. OS-Specific prefs */
77
80
  included?: boolean;
78
81
  /** If true, this item will registered as part of the preference schema, but hidden in the preference editor UI. */
79
82
  hidden?: boolean;
80
- [key: string]: any;
81
- }
82
- export interface PreferenceSchemaProperty extends PreferenceItem {
83
- description?: string;
84
- markdownDescription?: string;
85
- scope?: 'application' | 'machine' | 'window' | 'resource' | 'language-overridable' | 'machine-overridable' | PreferenceScope;
86
- tags?: string[];
87
- }
88
-
89
- export interface PreferenceDataProperty extends PreferenceItem {
90
- description?: string;
91
- markdownDescription?: string;
83
+ /** The maximum scope where values for this property can be set. */
92
84
  scope?: PreferenceScope;
85
+ /** Metadata intended for custom renderers */
93
86
  typeDetails?: any;
87
+ /** Tags can be searched for in the UI */
88
+ tags?: string[]
94
89
  }
95
- export namespace PreferenceDataProperty {
96
- export function fromPreferenceSchemaProperty(schemaProps: PreferenceSchemaProperty, defaultScope: PreferenceScope = PreferenceScope.Workspace): PreferenceDataProperty {
97
- if (!schemaProps.scope) {
98
- schemaProps.scope = defaultScope;
99
- } else if (isString(schemaProps.scope)) {
100
- return Object.assign(schemaProps, { scope: PreferenceScope.fromString(schemaProps.scope) || defaultScope });
101
- }
102
- return <PreferenceDataProperty>schemaProps;
103
- }
90
+
91
+ export interface DefaultValueChangedEvent {
92
+ /** The preference key */
93
+ key: string;
94
+ /** The override identifier that the default changed for */
95
+ overrideIdentifier?: string;
96
+ /**
97
+ * When the default for the base property changes, indicates which override identifiers will be affected
98
+ */
99
+ otherAffectedOverrides: string[];
100
+ oldValue: JSONValue | undefined;
101
+ newValue: JSONValue | undefined;
104
102
  }
103
+
104
+ export const PreferenceSchemaService = Symbol('PreferenceSchemaService');
105
+
106
+ export interface PreferenceSchemaService {
107
+ /**
108
+ * Resolves after static contributions have been processed
109
+ */
110
+ readonly ready: Promise<void>;
111
+ /**
112
+ * Register an override identifier for language specific preferences
113
+ * @param overrideIdentifier The identifier to register
114
+ * @returns A disposable to unregister the identifier
115
+ */
116
+ registerOverrideIdentifier(overrideIdentifier: string): Disposable;
117
+ readonly overrideIdentifiers: ReadonlySet<string>;
118
+
119
+ /**
120
+ * Add a preference schema. It is an error to register the same property in two different schemas
121
+ * @param schema The schema to add
122
+ * @returns A disposable to remove the schema
123
+ */
124
+ addSchema(schema: PreferenceSchema): Disposable;
125
+
126
+ /**
127
+ * The scopes which this preference schema service handles. Any properties that are not applicable within the
128
+ * valid scopes will be ignored
129
+ */
130
+ readonly validScopes: readonly PreferenceScope[];
131
+ /**
132
+ * Check if a preference is valid in a specific scope
133
+ * @param preferenceName The preference name
134
+ * @param scope The scope to check
135
+ * @returns True if the preference is valid in the given scope
136
+ */
137
+ isValidInScope(preferenceName: string, scope: PreferenceScope): boolean;
138
+ getSchemaProperty(key: string): PreferenceDataProperty | undefined;
139
+ getSchemaProperties(): ReadonlyMap<string, PreferenceDataProperty>;
140
+
141
+ /**
142
+ * Update a property in the schema. The corresponding JSON Schemas, etc. will be updated
143
+ * @param key The property key
144
+ * @param property The updated property
145
+ */
146
+ updateSchemaProperty(key: string, property: PreferenceDataProperty): void;
147
+
148
+ /**
149
+ * Register an override for a preference default value. If multiple overrides are registered for the same value,
150
+ * the last override will be in effect. Removing the last override will make the second-to-last override active, etc.
151
+ * @param key The preference key
152
+ * @param overrideIdentifier The override identifier, undefined for global default
153
+ * @param value The default value
154
+ * @returns A disposable to unregister the override
155
+ */
156
+ registerOverride(key: string, overrideIdentifier: string | undefined, value: JSONValue): Disposable;
157
+ /**
158
+ * Get the default value for a preference. This is the value a client will see for the given key/override
159
+ * @param key The preference key
160
+ * @param overrideIdentifier The override identifier, undefined for global default
161
+ * @returns The default value or undefined if not found
162
+ */
163
+ getDefaultValue(key: string, overrideIdentifier: string | undefined): JSONValue | undefined;
164
+ /**
165
+ * Gets the default value for a preference. This method not fall back to the global value if no override is given
166
+ * @param key The preference key
167
+ * @param overrideIdentifier The override identifier, undefined for global default
168
+ * @returns The default value or undefined if not found
169
+ */
170
+ inspectDefaultValue(key: string, overrideIdentifier: string | undefined): JSONValue | undefined;
171
+
172
+ /**
173
+ * Gets a JSON schema a preference.json file for the given scope.
174
+ * @param scope The scope to generate schema for
175
+ * @returns The JSON schema
176
+ */
177
+ getJSONSchema(scope: PreferenceScope): IJSONSchema;
178
+ /**
179
+ * Get the collection of all defined default values as JSONObject of the form like in a preferences.json
180
+ *
181
+ * #### Example usage
182
+ * ```json
183
+ * {
184
+ * "my.preference": "a string default",
185
+ * "[typescript]": {
186
+ * "another.preference": 39
187
+ * }
188
+ * }
189
+ */
190
+ getDefaultValues(): JSONObject;
191
+
192
+ // Public events
193
+ onDidChangeDefaultValue: Event<DefaultValueChangedEvent>;
194
+ onDidChangeSchema: Event<void>;
195
+ }
196
+