@theia/core 1.65.0-next.19 → 1.65.0-next.28

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 (331) hide show
  1. package/lib/browser/breadcrumbs/breadcrumbs-renderer.d.ts +1 -1
  2. package/lib/browser/breadcrumbs/breadcrumbs-renderer.d.ts.map +1 -1
  3. package/lib/browser/breadcrumbs/breadcrumbs-renderer.js +1 -1
  4. package/lib/browser/breadcrumbs/breadcrumbs-renderer.js.map +1 -1
  5. package/lib/browser/catalog.json +13 -4
  6. package/lib/browser/common-frontend-contribution.d.ts +2 -3
  7. package/lib/browser/common-frontend-contribution.d.ts.map +1 -1
  8. package/lib/browser/common-frontend-contribution.js +3 -4
  9. package/lib/browser/common-frontend-contribution.js.map +1 -1
  10. package/lib/browser/encoding-registry.d.ts +1 -1
  11. package/lib/browser/encoding-registry.d.ts.map +1 -1
  12. package/lib/browser/encoding-registry.js +1 -1
  13. package/lib/browser/encoding-registry.js.map +1 -1
  14. package/lib/browser/frontend-application-bindings.d.ts.map +1 -1
  15. package/lib/browser/frontend-application-bindings.js +10 -17
  16. package/lib/browser/frontend-application-bindings.js.map +1 -1
  17. package/lib/browser/frontend-application-module.d.ts.map +1 -1
  18. package/lib/browser/frontend-application-module.js +4 -5
  19. package/lib/browser/frontend-application-module.js.map +1 -1
  20. package/lib/browser/frontend-application.d.ts +1 -1
  21. package/lib/browser/frontend-application.d.ts.map +1 -1
  22. package/lib/browser/frontend-application.js +1 -1
  23. package/lib/browser/frontend-application.js.map +1 -1
  24. package/lib/browser/hover-service.d.ts +1 -2
  25. package/lib/browser/hover-service.d.ts.map +1 -1
  26. package/lib/browser/hover-service.js +1 -2
  27. package/lib/browser/hover-service.js.map +1 -1
  28. package/lib/browser/icon-theme-service.d.ts +3 -2
  29. package/lib/browser/icon-theme-service.d.ts.map +1 -1
  30. package/lib/browser/icon-theme-service.js +4 -3
  31. package/lib/browser/icon-theme-service.js.map +1 -1
  32. package/lib/browser/index.d.ts +0 -1
  33. package/lib/browser/index.d.ts.map +1 -1
  34. package/lib/browser/index.js +0 -1
  35. package/lib/browser/index.js.map +1 -1
  36. package/lib/browser/keybinding.d.ts +1 -1
  37. package/lib/browser/keybinding.d.ts.map +1 -1
  38. package/lib/browser/keybinding.js +1 -1
  39. package/lib/browser/keybinding.js.map +1 -1
  40. package/lib/browser/keybinding.spec.js +1 -1
  41. package/lib/browser/keybinding.spec.js.map +1 -1
  42. package/lib/browser/menu/browser-menu-plugin.d.ts +2 -2
  43. package/lib/browser/menu/browser-menu-plugin.d.ts.map +1 -1
  44. package/lib/browser/menu/browser-menu-plugin.js +2 -3
  45. package/lib/browser/menu/browser-menu-plugin.js.map +1 -1
  46. package/lib/browser/open-with-service.d.ts +1 -1
  47. package/lib/browser/open-with-service.d.ts.map +1 -1
  48. package/lib/browser/open-with-service.js +3 -3
  49. package/lib/browser/open-with-service.js.map +1 -1
  50. package/lib/browser/opener-service.d.ts +1 -2
  51. package/lib/browser/opener-service.d.ts.map +1 -1
  52. package/lib/browser/opener-service.js.map +1 -1
  53. package/lib/browser/preferences/frontend-config-preference-contributions.d.ts +6 -0
  54. package/lib/browser/preferences/frontend-config-preference-contributions.d.ts.map +1 -0
  55. package/lib/browser/preferences/frontend-config-preference-contributions.js +60 -0
  56. package/lib/browser/preferences/frontend-config-preference-contributions.js.map +1 -0
  57. package/lib/browser/preferences/index.d.ts +0 -5
  58. package/lib/browser/preferences/index.d.ts.map +1 -1
  59. package/lib/browser/preferences/index.js +0 -5
  60. package/lib/browser/preferences/index.js.map +1 -1
  61. package/lib/browser/preferences/preference-contribution.d.ts +0 -96
  62. package/lib/browser/preferences/preference-contribution.d.ts.map +1 -1
  63. package/lib/browser/preferences/preference-contribution.js +14 -355
  64. package/lib/browser/preferences/preference-contribution.js.map +1 -1
  65. package/lib/browser/preferences/preference-proxy.spec.js +25 -17
  66. package/lib/browser/preferences/preference-proxy.spec.js.map +1 -1
  67. package/lib/browser/preferences/preference-schema-provider.spec.js +21 -34
  68. package/lib/browser/preferences/preference-schema-provider.spec.js.map +1 -1
  69. package/lib/browser/preferences/preference-service.spec.js +57 -80
  70. package/lib/browser/preferences/preference-service.spec.js.map +1 -1
  71. package/lib/browser/preferences/preference-validation-service.d.ts +24 -26
  72. package/lib/browser/preferences/preference-validation-service.d.ts.map +1 -1
  73. package/lib/browser/preferences/preference-validation-service.js +40 -20
  74. package/lib/browser/preferences/preference-validation-service.js.map +1 -1
  75. package/lib/browser/preferences/preference-validation-service.spec.js +10 -6
  76. package/lib/browser/preferences/preference-validation-service.spec.js.map +1 -1
  77. package/lib/browser/preferences/test/mock-preference-provider.d.ts +2 -3
  78. package/lib/browser/preferences/test/mock-preference-provider.d.ts.map +1 -1
  79. package/lib/browser/preferences/test/mock-preference-provider.js +5 -7
  80. package/lib/browser/preferences/test/mock-preference-provider.js.map +1 -1
  81. package/lib/browser/preferences/test/mock-preference-proxy.d.ts.map +1 -1
  82. package/lib/browser/preferences/test/mock-preference-proxy.js.map +1 -1
  83. package/lib/browser/preferences/test/mock-preference-service.d.ts +1 -4
  84. package/lib/browser/preferences/test/mock-preference-service.d.ts.map +1 -1
  85. package/lib/browser/preferences/test/mock-preference-service.js.map +1 -1
  86. package/lib/browser/quick-input/quick-command-service.d.ts +1 -1
  87. package/lib/browser/quick-input/quick-command-service.d.ts.map +1 -1
  88. package/lib/browser/quick-input/quick-command-service.js +1 -1
  89. package/lib/browser/quick-input/quick-command-service.js.map +1 -1
  90. package/lib/browser/request/browser-request-service.d.ts +1 -1
  91. package/lib/browser/request/browser-request-service.d.ts.map +1 -1
  92. package/lib/browser/request/browser-request-service.js +2 -2
  93. package/lib/browser/request/browser-request-service.js.map +1 -1
  94. package/lib/browser/shell/application-shell.d.ts +1 -1
  95. package/lib/browser/shell/application-shell.d.ts.map +1 -1
  96. package/lib/browser/shell/application-shell.js +1 -1
  97. package/lib/browser/shell/application-shell.js.map +1 -1
  98. package/lib/browser/shell/tab-bars.d.ts +1 -1
  99. package/lib/browser/shell/tab-bars.d.ts.map +1 -1
  100. package/lib/browser/shell/theia-dock-panel.d.ts +1 -1
  101. package/lib/browser/shell/theia-dock-panel.d.ts.map +1 -1
  102. package/lib/browser/status-bar/status-bar.d.ts +1 -1
  103. package/lib/browser/status-bar/status-bar.d.ts.map +1 -1
  104. package/lib/browser/status-bar/status-bar.js +1 -1
  105. package/lib/browser/status-bar/status-bar.js.map +1 -1
  106. package/lib/browser/theming.d.ts +5 -4
  107. package/lib/browser/theming.d.ts.map +1 -1
  108. package/lib/browser/theming.js +7 -6
  109. package/lib/browser/theming.js.map +1 -1
  110. package/lib/browser/tooltip-service.d.ts +1 -1
  111. package/lib/browser/tooltip-service.d.ts.map +1 -1
  112. package/lib/browser/tooltip-service.js +1 -1
  113. package/lib/browser/tooltip-service.js.map +1 -1
  114. package/lib/browser/tree/index.d.ts +0 -1
  115. package/lib/browser/tree/index.d.ts.map +1 -1
  116. package/lib/browser/tree/index.js +0 -1
  117. package/lib/browser/tree/index.js.map +1 -1
  118. package/lib/browser/tree/tree-widget.d.ts +2 -2
  119. package/lib/browser/tree/tree-widget.d.ts.map +1 -1
  120. package/lib/browser/tree/tree-widget.js +3 -3
  121. package/lib/browser/tree/tree-widget.js.map +1 -1
  122. package/lib/browser/window/default-secondary-window-service.d.ts +1 -2
  123. package/lib/browser/window/default-secondary-window-service.d.ts.map +1 -1
  124. package/lib/browser/window/default-secondary-window-service.js +1 -2
  125. package/lib/browser/window/default-secondary-window-service.js.map +1 -1
  126. package/lib/browser/window/default-window-service.d.ts +1 -1
  127. package/lib/browser/window/default-window-service.d.ts.map +1 -1
  128. package/lib/browser/window/default-window-service.js +1 -1
  129. package/lib/browser/window/default-window-service.js.map +1 -1
  130. package/lib/browser/window/default-window-service.spec.js +1 -1
  131. package/lib/browser/window/default-window-service.spec.js.map +1 -1
  132. package/lib/browser/window/window-title-service.d.ts +1 -1
  133. package/lib/browser/window/window-title-service.d.ts.map +1 -1
  134. package/lib/browser/window/window-title-service.js +1 -1
  135. package/lib/browser/window/window-title-service.js.map +1 -1
  136. package/lib/{browser → common}/core-preferences.d.ts +2 -1
  137. package/lib/common/core-preferences.d.ts.map +1 -0
  138. package/lib/{browser → common}/core-preferences.js +17 -18
  139. package/lib/common/core-preferences.js.map +1 -0
  140. package/lib/common/index.d.ts +4 -0
  141. package/lib/common/index.d.ts.map +1 -1
  142. package/lib/common/index.js +4 -0
  143. package/lib/common/index.js.map +1 -1
  144. package/lib/common/inversify-utils.d.ts +31 -0
  145. package/lib/common/inversify-utils.d.ts.map +1 -0
  146. package/lib/common/inversify-utils.js +60 -0
  147. package/lib/common/inversify-utils.js.map +1 -0
  148. package/lib/common/json-schema.d.ts +1 -0
  149. package/lib/common/json-schema.d.ts.map +1 -1
  150. package/lib/common/preferences/defaults-preference-provider.d.ts +21 -0
  151. package/lib/common/preferences/defaults-preference-provider.d.ts.map +1 -0
  152. package/lib/common/preferences/defaults-preference-provider.js +99 -0
  153. package/lib/common/preferences/defaults-preference-provider.js.map +1 -0
  154. package/lib/common/preferences/index.d.ts +12 -0
  155. package/lib/common/preferences/index.d.ts.map +1 -0
  156. package/lib/common/preferences/index.js +30 -0
  157. package/lib/common/preferences/index.js.map +1 -0
  158. package/lib/{browser → common}/preferences/injectable-preference-proxy.d.ts +1 -1
  159. package/lib/common/preferences/injectable-preference-proxy.d.ts.map +1 -0
  160. package/lib/{browser → common}/preferences/injectable-preference-proxy.js +2 -2
  161. package/lib/common/preferences/injectable-preference-proxy.js.map +1 -0
  162. package/lib/common/preferences/preference-configurations.d.ts.map +1 -0
  163. package/lib/common/preferences/preference-configurations.js.map +1 -0
  164. package/lib/{browser → common}/preferences/preference-language-override-service.d.ts +4 -13
  165. package/lib/common/preferences/preference-language-override-service.d.ts.map +1 -0
  166. package/lib/{browser → common}/preferences/preference-language-override-service.js +14 -30
  167. package/lib/common/preferences/preference-language-override-service.js.map +1 -0
  168. package/lib/common/preferences/preference-provider-impl.d.ts +52 -0
  169. package/lib/common/preferences/preference-provider-impl.d.ts.map +1 -0
  170. package/lib/{browser/preferences/preference-provider.js → common/preferences/preference-provider-impl.js} +23 -95
  171. package/lib/common/preferences/preference-provider-impl.js.map +1 -0
  172. package/lib/{browser → common}/preferences/preference-provider.d.ts +34 -59
  173. package/lib/common/preferences/preference-provider.d.ts.map +1 -0
  174. package/lib/common/preferences/preference-provider.js +71 -0
  175. package/lib/common/preferences/preference-provider.js.map +1 -0
  176. package/lib/common/preferences/preference-provider.spec.d.ts.map +1 -0
  177. package/lib/{browser → common}/preferences/preference-provider.spec.js +4 -4
  178. package/lib/common/preferences/preference-provider.spec.js.map +1 -0
  179. package/lib/{browser → common}/preferences/preference-proxy.d.ts +2 -2
  180. package/lib/common/preferences/preference-proxy.d.ts.map +1 -0
  181. package/lib/{browser → common}/preferences/preference-proxy.js +10 -10
  182. package/lib/common/preferences/preference-proxy.js.map +1 -0
  183. package/lib/common/preferences/preference-schema-service.d.ts +55 -0
  184. package/lib/common/preferences/preference-schema-service.d.ts.map +1 -0
  185. package/lib/common/preferences/preference-schema-service.js +402 -0
  186. package/lib/common/preferences/preference-schema-service.js.map +1 -0
  187. package/lib/common/preferences/preference-schema.d.ts +145 -43
  188. package/lib/common/preferences/preference-schema.d.ts.map +1 -1
  189. package/lib/common/preferences/preference-schema.js +3 -41
  190. package/lib/common/preferences/preference-schema.js.map +1 -1
  191. package/lib/common/preferences/preference-scope.d.ts +4 -1
  192. package/lib/common/preferences/preference-scope.d.ts.map +1 -1
  193. package/lib/common/preferences/preference-scope.js +5 -14
  194. package/lib/common/preferences/preference-scope.js.map +1 -1
  195. package/lib/{browser → common}/preferences/preference-service.d.ts +9 -10
  196. package/lib/common/preferences/preference-service.d.ts.map +1 -0
  197. package/lib/{browser → common}/preferences/preference-service.js +65 -60
  198. package/lib/common/preferences/preference-service.js.map +1 -0
  199. package/lib/common/supported-encodings.d.ts.map +1 -0
  200. package/lib/common/supported-encodings.js.map +1 -0
  201. package/lib/{browser/tree → common}/tree-preference.d.ts +1 -1
  202. package/lib/common/tree-preference.d.ts.map +1 -0
  203. package/lib/{browser/tree → common}/tree-preference.js +3 -5
  204. package/lib/common/tree-preference.js.map +1 -0
  205. package/lib/electron-browser/menu/electron-context-menu-renderer.d.ts +2 -1
  206. package/lib/electron-browser/menu/electron-context-menu-renderer.d.ts.map +1 -1
  207. package/lib/electron-browser/menu/electron-context-menu-renderer.js +2 -1
  208. package/lib/electron-browser/menu/electron-context-menu-renderer.js.map +1 -1
  209. package/lib/electron-browser/menu/electron-main-menu-factory.d.ts +1 -2
  210. package/lib/electron-browser/menu/electron-main-menu-factory.d.ts.map +1 -1
  211. package/lib/electron-browser/menu/electron-main-menu-factory.js +1 -1
  212. package/lib/electron-browser/menu/electron-main-menu-factory.js.map +1 -1
  213. package/lib/electron-browser/menu/electron-menu-contribution.d.ts +2 -2
  214. package/lib/electron-browser/menu/electron-menu-contribution.d.ts.map +1 -1
  215. package/lib/electron-browser/menu/electron-menu-contribution.js +6 -6
  216. package/lib/electron-browser/menu/electron-menu-contribution.js.map +1 -1
  217. package/lib/electron-browser/window/electron-window-module.js +1 -1
  218. package/lib/electron-browser/window/electron-window-module.js.map +1 -1
  219. package/lib/electron-browser/window/electron-window-service.d.ts +1 -1
  220. package/lib/electron-browser/window/electron-window-service.d.ts.map +1 -1
  221. package/lib/electron-browser/window/electron-window-service.js +1 -1
  222. package/lib/electron-browser/window/electron-window-service.js.map +1 -1
  223. package/lib/{electron-browser/window → electron-common}/electron-window-preferences.d.ts +2 -1
  224. package/lib/electron-common/electron-window-preferences.d.ts.map +1 -0
  225. package/lib/{electron-browser/window → electron-common}/electron-window-preferences.js +7 -7
  226. package/lib/electron-common/electron-window-preferences.js.map +1 -0
  227. package/lib/electron-node/window/electron-window-module.d.ts +4 -0
  228. package/lib/electron-node/window/electron-window-module.d.ts.map +1 -0
  229. package/lib/{browser/preferences/preference-scope.js → electron-node/window/electron-window-module.js} +7 -5
  230. package/lib/electron-node/window/electron-window-module.js.map +1 -0
  231. package/lib/node/backend-application-module.d.ts.map +1 -1
  232. package/lib/node/backend-application-module.js +13 -0
  233. package/lib/node/backend-application-module.js.map +1 -1
  234. package/package.json +6 -5
  235. package/src/browser/breadcrumbs/breadcrumbs-renderer.tsx +1 -1
  236. package/src/browser/common-frontend-contribution.ts +2 -3
  237. package/src/browser/encoding-registry.ts +1 -1
  238. package/src/browser/frontend-application-bindings.ts +8 -13
  239. package/src/browser/frontend-application-module.ts +4 -4
  240. package/src/browser/frontend-application.ts +1 -1
  241. package/src/browser/hover-service.ts +1 -2
  242. package/src/browser/icon-theme-service.ts +3 -2
  243. package/src/browser/index.ts +0 -1
  244. package/src/browser/keybinding.spec.ts +1 -1
  245. package/src/browser/keybinding.ts +1 -1
  246. package/src/browser/menu/browser-menu-plugin.ts +4 -4
  247. package/src/browser/open-with-service.ts +1 -1
  248. package/src/browser/opener-service.ts +1 -2
  249. package/src/browser/preferences/frontend-config-preference-contributions.ts +52 -0
  250. package/src/browser/preferences/index.ts +0 -5
  251. package/src/browser/preferences/preference-contribution.ts +16 -398
  252. package/src/browser/preferences/preference-proxy.spec.ts +27 -17
  253. package/src/browser/preferences/preference-schema-provider.spec.ts +25 -37
  254. package/src/browser/preferences/preference-service.spec.ts +32 -56
  255. package/src/browser/preferences/preference-validation-service.spec.ts +27 -19
  256. package/src/browser/preferences/preference-validation-service.ts +60 -41
  257. package/src/browser/preferences/test/mock-preference-provider.ts +2 -5
  258. package/src/browser/preferences/test/mock-preference-proxy.ts +1 -2
  259. package/src/browser/preferences/test/mock-preference-service.ts +1 -4
  260. package/src/browser/quick-input/quick-command-service.ts +1 -1
  261. package/src/browser/request/browser-request-service.ts +4 -4
  262. package/src/browser/shell/application-shell.ts +1 -1
  263. package/src/browser/shell/tab-bars.ts +1 -1
  264. package/src/browser/shell/theia-dock-panel.ts +1 -1
  265. package/src/browser/status-bar/status-bar.tsx +1 -1
  266. package/src/browser/theming.ts +7 -6
  267. package/src/browser/tooltip-service.tsx +1 -1
  268. package/src/browser/tree/index.ts +0 -1
  269. package/src/browser/tree/tree-widget.tsx +4 -4
  270. package/src/browser/window/default-secondary-window-service.ts +1 -2
  271. package/src/browser/window/default-window-service.spec.ts +1 -1
  272. package/src/browser/window/default-window-service.ts +1 -1
  273. package/src/browser/window/window-title-service.ts +1 -1
  274. package/src/{browser → common}/core-preferences.ts +16 -17
  275. package/src/common/index.ts +4 -0
  276. package/src/common/inversify-utils.ts +63 -0
  277. package/src/common/json-schema.ts +1 -0
  278. package/src/common/preferences/defaults-preference-provider.ts +91 -0
  279. package/src/common/preferences/index.ts +27 -0
  280. package/src/{browser → common}/preferences/injectable-preference-proxy.ts +3 -3
  281. package/src/{browser → common}/preferences/preference-language-override-service.ts +12 -29
  282. package/src/common/preferences/preference-provider-impl.ts +165 -0
  283. package/src/{browser → common}/preferences/preference-provider.spec.ts +6 -5
  284. package/src/common/preferences/preference-provider.ts +164 -0
  285. package/src/{browser → common}/preferences/preference-proxy.ts +15 -14
  286. package/src/common/preferences/preference-schema-service.ts +434 -0
  287. package/src/common/preferences/preference-schema.ts +156 -64
  288. package/src/common/preferences/preference-scope.ts +5 -13
  289. package/src/{browser → common}/preferences/preference-service.ts +71 -65
  290. package/src/{browser/tree → common}/tree-preference.ts +2 -4
  291. package/src/electron-browser/menu/electron-context-menu-renderer.ts +2 -1
  292. package/src/electron-browser/menu/electron-main-menu-factory.ts +2 -2
  293. package/src/electron-browser/menu/electron-menu-contribution.ts +9 -6
  294. package/src/electron-browser/window/electron-window-module.ts +1 -1
  295. package/src/electron-browser/window/electron-window-service.ts +1 -1
  296. package/src/{electron-browser/window → electron-common}/electron-window-preferences.ts +6 -6
  297. package/src/{browser/preferences/preference-scope.ts → electron-node/window/electron-window-module.ts} +7 -3
  298. package/src/node/backend-application-module.ts +28 -1
  299. package/lib/browser/core-preferences.d.ts.map +0 -1
  300. package/lib/browser/core-preferences.js.map +0 -1
  301. package/lib/browser/preferences/injectable-preference-proxy.d.ts.map +0 -1
  302. package/lib/browser/preferences/injectable-preference-proxy.js.map +0 -1
  303. package/lib/browser/preferences/preference-configurations.d.ts.map +0 -1
  304. package/lib/browser/preferences/preference-configurations.js.map +0 -1
  305. package/lib/browser/preferences/preference-language-override-service.d.ts.map +0 -1
  306. package/lib/browser/preferences/preference-language-override-service.js.map +0 -1
  307. package/lib/browser/preferences/preference-provider.d.ts.map +0 -1
  308. package/lib/browser/preferences/preference-provider.js.map +0 -1
  309. package/lib/browser/preferences/preference-provider.spec.d.ts.map +0 -1
  310. package/lib/browser/preferences/preference-provider.spec.js.map +0 -1
  311. package/lib/browser/preferences/preference-proxy.d.ts.map +0 -1
  312. package/lib/browser/preferences/preference-proxy.js.map +0 -1
  313. package/lib/browser/preferences/preference-scope.d.ts +0 -3
  314. package/lib/browser/preferences/preference-scope.d.ts.map +0 -1
  315. package/lib/browser/preferences/preference-scope.js.map +0 -1
  316. package/lib/browser/preferences/preference-service.d.ts.map +0 -1
  317. package/lib/browser/preferences/preference-service.js.map +0 -1
  318. package/lib/browser/supported-encodings.d.ts.map +0 -1
  319. package/lib/browser/supported-encodings.js.map +0 -1
  320. package/lib/browser/tree/tree-preference.d.ts.map +0 -1
  321. package/lib/browser/tree/tree-preference.js.map +0 -1
  322. package/lib/electron-browser/window/electron-window-preferences.d.ts.map +0 -1
  323. package/lib/electron-browser/window/electron-window-preferences.js.map +0 -1
  324. package/src/browser/preferences/preference-provider.ts +0 -277
  325. /package/lib/{browser → common}/preferences/preference-configurations.d.ts +0 -0
  326. /package/lib/{browser → common}/preferences/preference-configurations.js +0 -0
  327. /package/lib/{browser → common}/preferences/preference-provider.spec.d.ts +0 -0
  328. /package/lib/{browser → common}/supported-encodings.d.ts +0 -0
  329. /package/lib/{browser → common}/supported-encodings.js +0 -0
  330. /package/src/{browser → common}/preferences/preference-configurations.ts +0 -0
  331. /package/src/{browser → common}/supported-encodings.ts +0 -0
@@ -16,12 +16,12 @@
16
16
 
17
17
  import { interfaces } from 'inversify';
18
18
  import { environment } from '@theia/application-package/lib/environment';
19
- import { createPreferenceProxy, PreferenceProxy, PreferenceService, PreferenceContribution, PreferenceSchema } from './preferences';
20
19
  import { SUPPORTED_ENCODINGS } from './supported-encodings';
21
- import { FrontendApplicationConfigProvider } from './frontend-application-config-provider';
22
20
  import { isOSX } from '../common/os';
23
21
  import { nls } from '../common/nls';
24
- import { DefaultTheme } from '@theia/application-package/lib/application-props';
22
+ import { PreferenceContribution, PreferenceSchema } from '../common/preferences/preference-schema';
23
+ import { createPreferenceProxy, PreferenceProxy, PreferenceService } from '../common/preferences';
24
+ import { PreferenceScope } from '../common/preferences/preference-scope';
25
25
 
26
26
  /* eslint-disable max-len */
27
27
  const windowTitleDescription = [
@@ -43,7 +43,6 @@ const windowTitleDescription = [
43
43
  ].join('\n- ');
44
44
 
45
45
  export const corePreferenceSchema: PreferenceSchema = {
46
- 'type': 'object',
47
46
  properties: {
48
47
  'application.confirmExit': {
49
48
  type: 'string',
@@ -59,7 +58,7 @@ export const corePreferenceSchema: PreferenceSchema = {
59
58
  'type': 'boolean',
60
59
  'default': true,
61
60
  'description': nls.localizeByDefault('Enable/disable navigation breadcrumbs.'),
62
- 'scope': 'application'
61
+ 'scope': PreferenceScope.User
63
62
  },
64
63
  'files.encoding': {
65
64
  'type': 'string',
@@ -67,7 +66,7 @@ export const corePreferenceSchema: PreferenceSchema = {
67
66
  'default': 'utf8',
68
67
  'description': nls.localizeByDefault(
69
68
  'The default character set encoding to use when reading and writing files. This setting can also be configured per language.'),
70
- 'scope': 'language-overridable',
69
+ 'scope': PreferenceScope.Folder,
71
70
  'enumDescriptions': Object.keys(SUPPORTED_ENCODINGS).map(key => SUPPORTED_ENCODINGS[key].labelLong),
72
71
  'included': Object.keys(SUPPORTED_ENCODINGS).length > 1
73
72
  },
@@ -103,7 +102,7 @@ export const corePreferenceSchema: PreferenceSchema = {
103
102
  : nls.localizeByDefault('Menu is displayed as a compact button in the side bar.')
104
103
  ],
105
104
  default: 'classic',
106
- scope: 'application',
105
+ scope: PreferenceScope.User,
107
106
  markdownDescription: nls.localizeByDefault("Control the visibility of the menu bar. A setting of 'toggle' means that the menu bar is hidden and a single press of the Alt key will show it. A setting of 'compact' will move the menu into the side bar."),
108
107
  included: !(isOSX && environment.electron.is())
109
108
  },
@@ -112,13 +111,13 @@ export const corePreferenceSchema: PreferenceSchema = {
112
111
  default: isOSX
113
112
  ? '${activeEditorShort}${separator}${rootName}'
114
113
  : '${dirty} ${activeEditorShort}${separator}${rootName}${separator}${appName}',
115
- scope: 'application',
114
+ scope: PreferenceScope.User,
116
115
  markdownDescription: windowTitleDescription
117
116
  },
118
117
  'window.titleSeparator': {
119
118
  type: 'string',
120
119
  default: ' - ',
121
- scope: 'application',
120
+ scope: PreferenceScope.User,
122
121
  markdownDescription: nls.localizeByDefault('Separator used by {0}.', '`#window.title#`')
123
122
  },
124
123
  'window.tabCloseIconPlacement': {
@@ -129,7 +128,7 @@ export const corePreferenceSchema: PreferenceSchema = {
129
128
  nls.localize('theia/core/window/tabCloseIconPlacement/start', 'Place the close icon at the start of the label. In left-to-right languages, this is the left side of the tab.'),
130
129
  ],
131
130
  default: 'end',
132
- scope: 'application',
131
+ scope: PreferenceScope.User,
133
132
  description: nls.localize('theia/core/window/tabCloseIconPlacement/description', 'Place the close icons on tab titles at the start or end of the tab. The default is end on all platforms.'),
134
133
  included: isOSX
135
134
  },
@@ -153,18 +152,18 @@ export const corePreferenceSchema: PreferenceSchema = {
153
152
  type: 'string',
154
153
  pattern: '^https?://([^:]*(:[^@]*)?@)?([^:]+|\\[[:0-9a-fA-F]+\\])(:\\d+)?/?$|^$',
155
154
  markdownDescription: nls.localizeByDefault('The proxy setting to use. If not set, will be inherited from the `http_proxy` and `https_proxy` environment variables. When during [remote development](https://aka.ms/vscode-remote) the {0} setting is disabled this setting can be configured in the local and the remote settings separately.'),
156
- scope: 'application'
155
+ scope: PreferenceScope.User
157
156
  },
158
157
  'http.proxyStrictSSL': {
159
158
  type: 'boolean',
160
159
  default: true,
161
160
  description: nls.localizeByDefault('Controls whether the proxy server certificate should be verified against the list of supplied CAs. When during [remote development](https://aka.ms/vscode-remote) the {0} setting is disabled this setting can be configured in the local and the remote settings separately.'),
162
- scope: 'application'
161
+ scope: PreferenceScope.User
163
162
  },
164
163
  'http.proxyAuthorization': {
165
164
  type: 'string',
166
165
  markdownDescription: nls.localizeByDefault('The value to send as the `Proxy-Authorization` header for every network request. When during [remote development](https://aka.ms/vscode-remote) the {0} setting is disabled this setting can be configured in the local and the remote settings separately.'),
167
- scope: 'application'
166
+ scope: PreferenceScope.User
168
167
  },
169
168
  'http.proxySupport': {
170
169
  type: 'string',
@@ -177,13 +176,13 @@ export const corePreferenceSchema: PreferenceSchema = {
177
176
  ],
178
177
  default: 'override',
179
178
  description: nls.localizeByDefault('Use the proxy support for extensions. When during [remote development](https://aka.ms/vscode-remote) the {0} setting is disabled this setting can be configured in the local and the remote settings separately.'),
180
- scope: 'application'
179
+ scope: PreferenceScope.User
181
180
  },
182
181
  'http.systemCertificates': {
183
182
  type: 'boolean',
184
183
  default: true,
185
184
  description: nls.localizeByDefault('Controls whether CA certificates should be loaded from the OS. On Windows and macOS, a reload of the window is required after turning this off. When during [remote development](https://aka.ms/vscode-remote) the {0} setting is disabled this setting can be configured in the local and the remote settings separately.'),
186
- scope: 'application'
185
+ scope: PreferenceScope.User
187
186
  },
188
187
  'workbench.list.openMode': {
189
188
  type: 'string',
@@ -229,14 +228,14 @@ export const corePreferenceSchema: PreferenceSchema = {
229
228
  type: 'string',
230
229
  enum: ['dark', 'light', 'hc-theia'],
231
230
  enumItemLabels: ['Dark (Theia)', 'Light (Theia)', 'High Contrast (Theia)'],
232
- default: DefaultTheme.defaultForOSTheme(FrontendApplicationConfigProvider.get().defaultTheme),
231
+ default: 'light',
233
232
  description: nls.localizeByDefault('Specifies the color theme used in the workbench when {0} is not enabled.', '`#window.autoDetectColorScheme#`')
234
233
  },
235
234
  'workbench.iconTheme': {
236
235
  type: ['string'],
237
236
  enum: ['none', 'theia-file-icons'],
238
237
  enumItemLabels: [nls.localizeByDefault('None'), 'File Icons (Theia)'],
239
- default: FrontendApplicationConfigProvider.get().defaultIconTheme,
238
+ default: 'none',
240
239
  description: nls.localizeByDefault("Specifies the file icon theme used in the workbench or 'null' to not show any file icons.")
241
240
  },
242
241
  'workbench.silentNotifications': {
@@ -20,8 +20,10 @@ export * from './cancellation';
20
20
  export * from './command';
21
21
  export * from './contribution-filter';
22
22
  export * from './contribution-provider';
23
+ export * from './core-preferences';
23
24
  export * from './disposable';
24
25
  export * from './event';
26
+ export * from './inversify-utils';
25
27
  export * from './listener';
26
28
  export * from './logger';
27
29
  export * from './lsp-types';
@@ -36,6 +38,7 @@ export * from './objects';
36
38
  export * from './os';
37
39
  export * from './path';
38
40
  export * from './performance';
41
+ export * from './preferences';
39
42
  export * from './progress-service';
40
43
  export * from './progress-service-protocol';
41
44
  export * from './quick-pick-service';
@@ -45,6 +48,7 @@ export * from './selection';
45
48
  export * from './selection-service';
46
49
  export * from './strings';
47
50
  export * from './telemetry';
51
+ export * from './tree-preference';
48
52
  export * from './types';
49
53
  export { default as URI } from './uri';
50
54
  export * from './uuid';
@@ -0,0 +1,63 @@
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 { interfaces, Container } from 'inversify';
18
+
19
+ /**
20
+ * This utility creates a factory function that accepts runtime arguments which are bound as constant
21
+ * values in a child container, allowing for dependency injection of both static dependencies
22
+ * (resolved as usual from the factory's container) and dynamic parameters (provided at factory invocation time).
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * // Factory interface
27
+ * interface UserPreferenceProviderFactory {
28
+ * (uri: URI, section: string): UserPreferenceProvider;
29
+ * }
30
+ * // Factory symbol
31
+ * const UserPreferenceProviderFactory = Symbol('UserPreferenceProviderFactory');
32
+ *
33
+ * // Bind the factory
34
+ * bindFactory(
35
+ * bind,
36
+ * UserPreferenceProviderFactory, // Service identifier of the factory
37
+ * UserPreferenceProvider, // Service identifier of the entity to be constructed
38
+ * SectionPreferenceProviderUri, // The first factory argument will be bound to this identifier (uri)
39
+ * SectionPreferenceProviderSection // The second factory argument will be bound to this identifier (section)
40
+ * );
41
+ *
42
+ * // Usage: factory(uri, section) creates UserPreferenceProvider with injected dependencies
43
+ * const factory = container.get(UserPreferenceProviderFactory);
44
+ * const provider = factory(myUri, 'settings');
45
+ * ```
46
+ */
47
+
48
+ export function bindFactory<F, C>(bind: interfaces.Bind,
49
+ factoryId: interfaces.ServiceIdentifier<F>,
50
+ constructor: interfaces.Newable<C>,
51
+ ...parameterBindings: interfaces.ServiceIdentifier<unknown>[]): void {
52
+ bind(factoryId).toFactory(ctx =>
53
+ (...args: unknown[]) => {
54
+ const child = new Container({ defaultScope: 'Singleton' });
55
+ child.parent = ctx.container;
56
+ for (let i = 0; i < parameterBindings.length; i++) {
57
+ child.bind(parameterBindings[i]).toConstantValue(args[i]);
58
+ }
59
+ child.bind(constructor).to(constructor);
60
+ return child.get(constructor);
61
+ }
62
+ );
63
+ }
@@ -87,6 +87,7 @@ export interface IJSONSchema {
87
87
  errorMessage?: string; // VSCode extension
88
88
  patternErrorMessage?: string; // VSCode extension
89
89
  deprecationMessage?: string; // VSCode extension
90
+ markdownDeprecationMessage?: string; // VS code extension
90
91
  enumItemLabels?: string[]; // VSCode extension
91
92
  enumDescriptions?: string[]; // VSCode extension
92
93
  markdownEnumDescriptions?: string[]; // VSCode extension
@@ -0,0 +1,91 @@
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
+ import { JSONObject, JSONValue } from '@lumino/coreutils';
17
+ import { PreferenceScope } from './preference-scope';
18
+ import { PreferenceProvider, PreferenceProviderDataChange, PreferenceProviderDataChanges, PreferenceResolveResult } from './preference-provider';
19
+ import { inject, injectable, postConstruct } from 'inversify';
20
+ import { PreferenceSchemaService } from './preference-schema';
21
+ import { Deferred } from '../promise-util';
22
+ import { PreferenceLanguageOverrideService } from './preference-language-override-service';
23
+ import { PreferenceProviderBase } from './preference-provider-impl';
24
+
25
+ // *****************************************************************************
26
+
27
+ @injectable()
28
+ export class DefaultsPreferenceProvider extends PreferenceProviderBase implements PreferenceProvider {
29
+
30
+ @inject(PreferenceSchemaService)
31
+ protected readonly preferenceSchemaService: PreferenceSchemaService;
32
+
33
+ @inject(PreferenceLanguageOverrideService)
34
+ protected readonly preferenceOverrideService: PreferenceLanguageOverrideService;
35
+
36
+ protected readonly _ready = new Deferred<void>();
37
+ ready: Promise<void> = this._ready.promise;
38
+
39
+ @postConstruct()
40
+ init(): void {
41
+ this.toDispose.push(this.preferenceSchemaService.onDidChangeDefaultValue(e => {
42
+ const changes: PreferenceProviderDataChanges = {};
43
+ if (e.overrideIdentifier) {
44
+ changes[e.key] = this.changeFor(e.key, e.overrideIdentifier, e.oldValue, e.newValue);
45
+ } else {
46
+ changes[e.key] = this.changeFor(e.key, undefined, e.oldValue, e.newValue);
47
+ for (const override of e.otherAffectedOverrides) {
48
+ const change = this.changeFor(e.key, override, e.oldValue, e.newValue);
49
+ changes[change.preferenceName] = change;
50
+ }
51
+ }
52
+ this.emitPreferencesChangedEvent(changes);
53
+ }));
54
+ this._ready.resolve();
55
+ }
56
+
57
+ protected changeFor(key: string, overrideIdentifier: string | undefined, oldValue: JSONValue | undefined, newValue: JSONValue | undefined): PreferenceProviderDataChange {
58
+ const preferenceName = overrideIdentifier ? this.preferenceOverrideService.overridePreferenceName({ preferenceName: key, overrideIdentifier }) : key;
59
+
60
+ return {
61
+ preferenceName: preferenceName,
62
+ newValue: newValue,
63
+ oldValue: oldValue,
64
+ scope: PreferenceScope.Default
65
+ };
66
+ }
67
+
68
+ canHandleScope(scope: PreferenceScope): boolean {
69
+ return scope === PreferenceScope.Default;
70
+ }
71
+ get<T>(preferenceName: string, resourceUri?: string): T | undefined {
72
+ const overrideInfo = this.preferenceOverrideService.overriddenPreferenceName(preferenceName);
73
+ return this.preferenceSchemaService.getDefaultValue(overrideInfo?.preferenceName ?? preferenceName, overrideInfo?.overrideIdentifier) as T;
74
+ }
75
+
76
+ setPreference(key: string, value: JSONValue, resourceUri?: string): Promise<boolean> {
77
+ return Promise.resolve(false);
78
+ }
79
+
80
+ resolve<T>(preferenceName: string, resourceUri?: string): PreferenceResolveResult<T> {
81
+ const overrideInfo = this.preferenceOverrideService.overriddenPreferenceName(preferenceName);
82
+ return {
83
+ value: this.preferenceSchemaService.inspectDefaultValue(overrideInfo?.preferenceName ?? preferenceName, overrideInfo?.overrideIdentifier) as T,
84
+ configUri: undefined
85
+ };
86
+ }
87
+
88
+ getPreferences(): JSONObject {
89
+ return this.preferenceSchemaService.getDefaultValues();
90
+ }
91
+ }
@@ -0,0 +1,27 @@
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
+ export * from './defaults-preference-provider';
18
+ export * from './preference-language-override-service';
19
+ export * from './preference-provider-impl';
20
+ export * from './preference-provider';
21
+ export * from './preference-schema-service';
22
+ export * from './preference-schema';
23
+ export * from './preference-scope';
24
+ export * from './preference-service';
25
+ export * from './injectable-preference-proxy';
26
+ export * from './preference-proxy';
27
+ export * from './preference-configurations';
@@ -16,12 +16,12 @@
16
16
 
17
17
  import { inject, injectable, postConstruct } from 'inversify';
18
18
  import { PreferenceSchema } from '../../common/preferences/preference-schema';
19
- import { Disposable, DisposableCollection, Emitter, Event, isObject, MaybePromise } from '../../common';
19
+ import { Disposable, DisposableCollection, Emitter, Event, isObject, MaybePromise, PreferenceScope } from '../../common';
20
20
  import { PreferenceChangeEvent, PreferenceEventEmitter, PreferenceProxy, PreferenceProxyOptions, PreferenceRetrieval } from './preference-proxy';
21
- import { PreferenceChange, PreferenceChangeImpl, PreferenceChanges, PreferenceScope, PreferenceService } from './preference-service';
21
+ import { PreferenceChange, PreferenceChangeImpl, PreferenceChanges, PreferenceService } from './preference-service';
22
22
  import { JSONValue } from '@lumino/coreutils';
23
23
  import { PreferenceProviderDataChange } from './preference-provider';
24
- import { OverridePreferenceName } from './preference-language-override-service';
24
+ import { OverridePreferenceName } from '../../common/preferences/preference-language-override-service';
25
25
 
26
26
  export const PreferenceProxySchema = Symbol('PreferenceProxySchema');
27
27
  export interface PreferenceProxyFactory {
@@ -14,9 +14,11 @@
14
14
  // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
15
15
  // *****************************************************************************
16
16
 
17
- import { injectable } from 'inversify';
18
- import { escapeRegExpCharacters, isObject } from '../../common';
19
- import { PreferenceSchemaProperties } from '../../common/preferences/preference-schema';
17
+ import { inject, injectable } from 'inversify';
18
+ import { isObject } from '../types';
19
+ import { IndexedAccess, PreferenceSchemaService } from './preference-schema';
20
+ import { escapeRegExpCharacters } from '../strings';
21
+ import { JSONValue } from '@lumino/coreutils';
20
22
 
21
23
  export interface OverridePreferenceName {
22
24
  preferenceName: string
@@ -34,10 +36,11 @@ export const getOverridePattern = (identifier: string) => `\\[(${identifier})\\]
34
36
 
35
37
  @injectable()
36
38
  export class PreferenceLanguageOverrideService {
37
- protected readonly overrideIdentifiers = new Set<string>();
39
+ @inject(PreferenceSchemaService)
40
+ protected readonly preferenceSchemaService: PreferenceSchemaService;
38
41
 
39
- testOverrideValue(name: string, value: unknown): value is PreferenceSchemaProperties {
40
- return PreferenceSchemaProperties.is(value) && OVERRIDE_PROPERTY_PATTERN.test(name);
42
+ static testOverrideValue(name: string, value: unknown): value is IndexedAccess<JSONValue> {
43
+ return isObject(value) && OVERRIDE_PROPERTY_PATTERN.test(name);
41
44
  }
42
45
 
43
46
  /**
@@ -65,7 +68,7 @@ export class PreferenceLanguageOverrideService {
65
68
  }
66
69
  const matches = name.substring(0, index).match(OVERRIDE_PROPERTY_PATTERN);
67
70
  const overrideIdentifier = matches && matches[1];
68
- if (!overrideIdentifier || !this.overrideIdentifiers.has(overrideIdentifier)) {
71
+ if (!overrideIdentifier || !this.preferenceSchemaService.overrideIdentifiers.has(overrideIdentifier)) {
69
72
  return undefined;
70
73
  }
71
74
  const preferenceName = name.substring(index + 1);
@@ -74,7 +77,7 @@ export class PreferenceLanguageOverrideService {
74
77
 
75
78
  computeOverridePatternPropertiesKey(): string | undefined {
76
79
  let param: string = '';
77
- for (const overrideIdentifier of this.overrideIdentifiers) {
80
+ for (const overrideIdentifier of this.preferenceSchemaService.overrideIdentifiers) {
78
81
  if (param.length) {
79
82
  param += '|';
80
83
  }
@@ -84,28 +87,8 @@ export class PreferenceLanguageOverrideService {
84
87
  }
85
88
 
86
89
  *getOverridePreferenceNames(preferenceName: string): IterableIterator<string> {
87
- for (const overrideIdentifier of this.overrideIdentifiers) {
90
+ for (const overrideIdentifier of this.preferenceSchemaService.overrideIdentifiers) {
88
91
  yield this.overridePreferenceName({ preferenceName, overrideIdentifier });
89
92
  }
90
93
  }
91
-
92
- /**
93
- * @param overrideIdentifier
94
- * @returns true if the addition caused a change, i.e. if the identifier was not already present in the set of identifiers, false otherwise.
95
- */
96
- addOverrideIdentifier(overrideIdentifier: string): boolean {
97
- const alreadyPresent = this.overrideIdentifiers.has(overrideIdentifier);
98
- if (!alreadyPresent) {
99
- this.overrideIdentifiers.add(overrideIdentifier);
100
- }
101
- return !alreadyPresent;
102
- }
103
-
104
- /**
105
- * @param overrideIdentifier
106
- * @returns true if the deletion caused a change, i.e. if the identifier was present in the set, false otherwise.
107
- */
108
- removeOverrideIdentifier(overrideIdentifier: string): boolean {
109
- return this.overrideIdentifiers.delete(overrideIdentifier);
110
- }
111
94
  }
@@ -0,0 +1,165 @@
1
+ // *****************************************************************************
2
+ // Copyright (C) 2018 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 debounce = require('p-debounce');
18
+ import { injectable } from 'inversify';
19
+ import { JSONObject } from '@lumino/coreutils';
20
+ import URI from '../../common/uri';
21
+ import { DisposableCollection, Emitter, Event, isObject, PreferenceLanguageOverrideService } from '../../common';
22
+ import { Deferred } from '../../common/promise-util';
23
+ import { PreferenceScope } from './preference-scope';
24
+ import { PreferenceProvider, PreferenceProviderDataChange, PreferenceProviderDataChanges, PreferenceResolveResult } from './preference-provider';
25
+
26
+ export abstract class PreferenceProviderBase {
27
+
28
+ protected readonly onDidPreferencesChangedEmitter = new Emitter<PreferenceProviderDataChanges>();
29
+ readonly onDidPreferencesChanged: Event<PreferenceProviderDataChanges> = this.onDidPreferencesChangedEmitter.event;
30
+
31
+ protected readonly toDispose = new DisposableCollection();
32
+
33
+ protected deferredChanges: PreferenceProviderDataChanges | undefined;
34
+
35
+ constructor() {
36
+ this.toDispose.push(this.onDidPreferencesChangedEmitter);
37
+ }
38
+
39
+ /**
40
+ * Informs the listeners that one or more preferences of this provider are changed.
41
+ * The listeners are able to find what was changed from the emitted event.
42
+ */
43
+ protected emitPreferencesChangedEvent(changes: PreferenceProviderDataChanges | PreferenceProviderDataChange[]): Promise<boolean> {
44
+ if (Array.isArray(changes)) {
45
+ for (const change of changes) {
46
+ this.mergePreferenceProviderDataChange(change);
47
+ }
48
+ } else {
49
+ for (const preferenceName of Object.keys(changes)) {
50
+ this.mergePreferenceProviderDataChange(changes[preferenceName]);
51
+ }
52
+ }
53
+ return this.fireDidPreferencesChanged();
54
+ }
55
+
56
+ protected mergePreferenceProviderDataChange(change: PreferenceProviderDataChange): void {
57
+ if (!this.deferredChanges) {
58
+ this.deferredChanges = {};
59
+ }
60
+ const current = this.deferredChanges[change.preferenceName];
61
+ const { newValue, scope, domain } = change;
62
+ if (!current) {
63
+ // new
64
+ this.deferredChanges[change.preferenceName] = change;
65
+ } else if (current.oldValue === newValue) {
66
+ // delete
67
+ delete this.deferredChanges[change.preferenceName];
68
+ } else {
69
+ // update
70
+ Object.assign(current, { newValue, scope, domain });
71
+ }
72
+ }
73
+
74
+ protected fireDidPreferencesChanged = debounce(() => {
75
+ const changes = this.deferredChanges;
76
+ this.deferredChanges = undefined;
77
+ if (changes && Object.keys(changes).length) {
78
+ this.onDidPreferencesChangedEmitter.fire(changes);
79
+ return true;
80
+ }
81
+ return false;
82
+ }, 0);
83
+
84
+ dispose(): void {
85
+ this.toDispose.dispose();
86
+ }
87
+
88
+ }
89
+
90
+ /**
91
+ * The {@link PreferenceProvider} is used to store and retrieve preference values. A {@link PreferenceProvider} does not operate in a global scope but is
92
+ * configured for one or more {@link PreferenceScope}s. The (default implementation for the) {@link PreferenceService} aggregates all {@link PreferenceProvider}s and
93
+ * serves as a common facade for manipulating preference values.
94
+ */
95
+ @injectable()
96
+ export abstract class PreferenceProviderImpl extends PreferenceProviderBase implements PreferenceProvider {
97
+
98
+ protected readonly _ready = new Deferred<void>();
99
+
100
+ constructor() {
101
+ super();
102
+ }
103
+
104
+ get<T>(preferenceName: string, resourceUri?: string): T | undefined {
105
+ return this.resolve<T>(preferenceName, resourceUri).value;
106
+ }
107
+
108
+ resolve<T>(preferenceName: string, resourceUri?: string): PreferenceResolveResult<T> {
109
+ const value = this.getPreferences(resourceUri)[preferenceName];
110
+ if (value !== undefined) {
111
+ return {
112
+ value: value as T,
113
+ configUri: this.getConfigUri(resourceUri)
114
+ };
115
+ }
116
+ return {};
117
+ }
118
+
119
+ abstract getPreferences(resourceUri?: string): JSONObject;
120
+ abstract setPreference(key: string, value: unknown, resourceUri?: string): Promise<boolean>;
121
+
122
+ /**
123
+ * Resolved when the preference provider is ready to provide preferences
124
+ * It should be resolved by subclasses.
125
+ */
126
+ get ready(): Promise<void> {
127
+ return this._ready.promise;
128
+ }
129
+
130
+ /**
131
+ * Retrieve the domain for this provider.
132
+ *
133
+ * @returns the domain or `undefined` if this provider is suitable for all domains.
134
+ */
135
+ getDomain(): string[] | undefined {
136
+ return undefined;
137
+ }
138
+
139
+ getConfigUri(resourceUri?: string, sectionName?: string): URI | undefined {
140
+ return undefined;
141
+ }
142
+
143
+ getContainingConfigUri?(resourceUri?: string, sectionName?: string): URI | undefined;
144
+
145
+ protected getParsedContent(jsonData: unknown): { [key: string]: unknown } {
146
+ const preferences: { [key: string]: unknown } = {};
147
+ if (!isObject(jsonData)) {
148
+ return preferences;
149
+ }
150
+ for (const [preferenceName, preferenceValue] of Object.entries(jsonData)) {
151
+ if (PreferenceLanguageOverrideService.testOverrideValue(preferenceName, preferenceValue)) {
152
+ for (const [overriddenPreferenceName, overriddenValue] of Object.entries(preferenceValue)) {
153
+ preferences[`${preferenceName}.${overriddenPreferenceName}`] = overriddenValue;
154
+ }
155
+ } else {
156
+ preferences[preferenceName] = preferenceValue;
157
+ }
158
+ }
159
+ return preferences;
160
+ }
161
+
162
+ canHandleScope(scope: PreferenceScope): boolean {
163
+ return true;
164
+ }
165
+ }
@@ -14,20 +14,21 @@
14
14
  // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
15
15
  // *****************************************************************************
16
16
 
17
- import { PreferenceProvider } from './preference-provider';
17
+ import { PreferenceUtils } from './preference-provider';
18
+
18
19
  const { expect } = require('chai');
19
20
 
20
- describe('PreferenceProvider', () => {
21
+ describe('PreferenceProviderImpl', () => {
21
22
  it('should preserve extra source fields on merge', () => {
22
- const result = PreferenceProvider.merge({ 'configurations': [], 'compounds': [] }, { 'configurations': [] });
23
+ const result = PreferenceUtils.merge({ 'configurations': [], 'compounds': [] }, { 'configurations': [] });
23
24
  expect(result).deep.equals({ 'configurations': [], 'compounds': [] });
24
25
  });
25
26
  it('should preserve extra target fields on merge', () => {
26
- const result = PreferenceProvider.merge({ 'configurations': [] }, { 'configurations': [], 'compounds': [] });
27
+ const result = PreferenceUtils.merge({ 'configurations': [] }, { 'configurations': [], 'compounds': [] });
27
28
  expect(result).deep.equals({ 'configurations': [], 'compounds': [] });
28
29
  });
29
30
  it('should merge array values', () => {
30
- const result = PreferenceProvider.merge(
31
+ const result = PreferenceUtils.merge(
31
32
  { 'configurations': [{ 'name': 'test1', 'request': 'launch' }], 'compounds': [] },
32
33
  { 'configurations': [{ 'name': 'test2' }] }
33
34
  );