@theia/core 1.42.0 → 1.43.0

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 (321) hide show
  1. package/README.md +6 -6
  2. package/i18n/nls.cs.json +29 -0
  3. package/i18n/nls.de.json +29 -0
  4. package/i18n/nls.es.json +29 -0
  5. package/i18n/nls.fr.json +29 -0
  6. package/i18n/nls.hu.json +29 -0
  7. package/i18n/nls.it.json +29 -0
  8. package/i18n/nls.ja.json +29 -0
  9. package/i18n/nls.json +29 -0
  10. package/i18n/nls.pl.json +29 -0
  11. package/i18n/nls.pt-br.json +29 -0
  12. package/i18n/nls.pt-pt.json +29 -0
  13. package/i18n/nls.ru.json +29 -0
  14. package/i18n/nls.zh-cn.json +29 -0
  15. package/lib/browser/color-application-contribution.d.ts +1 -1
  16. package/lib/browser/color-application-contribution.d.ts.map +1 -1
  17. package/lib/browser/common-frontend-contribution.d.ts +6 -3
  18. package/lib/browser/common-frontend-contribution.d.ts.map +1 -1
  19. package/lib/browser/common-frontend-contribution.js +35 -14
  20. package/lib/browser/common-frontend-contribution.js.map +1 -1
  21. package/lib/browser/connection-status-service.d.ts +1 -1
  22. package/lib/browser/connection-status-service.d.ts.map +1 -1
  23. package/lib/browser/connection-status-service.js +2 -2
  24. package/lib/browser/connection-status-service.js.map +1 -1
  25. package/lib/browser/core-preferences.js +16 -16
  26. package/lib/browser/core-preferences.js.map +1 -1
  27. package/lib/browser/credentials-service.d.ts +2 -2
  28. package/lib/browser/credentials-service.d.ts.map +1 -1
  29. package/lib/browser/credentials-service.js +2 -2
  30. package/lib/browser/credentials-service.js.map +1 -1
  31. package/lib/browser/dialogs.d.ts +1 -1
  32. package/lib/browser/dialogs.d.ts.map +1 -1
  33. package/lib/browser/frontend-application-contribution.d.ts +76 -0
  34. package/lib/browser/frontend-application-contribution.d.ts.map +1 -0
  35. package/lib/browser/frontend-application-contribution.js +51 -0
  36. package/lib/browser/frontend-application-contribution.js.map +1 -0
  37. package/lib/browser/frontend-application-module.d.ts.map +1 -1
  38. package/lib/browser/frontend-application-module.js +24 -23
  39. package/lib/browser/frontend-application-module.js.map +1 -1
  40. package/lib/browser/frontend-application.d.ts +1 -73
  41. package/lib/browser/frontend-application.d.ts.map +1 -1
  42. package/lib/browser/frontend-application.js +3 -26
  43. package/lib/browser/frontend-application.js.map +1 -1
  44. package/lib/browser/i18n/language-quick-pick-service.d.ts.map +1 -1
  45. package/lib/browser/i18n/language-quick-pick-service.js +1 -0
  46. package/lib/browser/i18n/language-quick-pick-service.js.map +1 -1
  47. package/lib/browser/icon-registry.d.ts +63 -0
  48. package/lib/browser/icon-registry.d.ts.map +1 -0
  49. package/lib/browser/icon-registry.js +25 -0
  50. package/lib/browser/icon-registry.js.map +1 -0
  51. package/lib/browser/icon-theme-contribution.d.ts +1 -1
  52. package/lib/browser/icon-theme-contribution.d.ts.map +1 -1
  53. package/lib/browser/index.d.ts +1 -0
  54. package/lib/browser/index.d.ts.map +1 -1
  55. package/lib/browser/index.js +1 -0
  56. package/lib/browser/index.js.map +1 -1
  57. package/lib/browser/json-schema-store.d.ts +1 -1
  58. package/lib/browser/json-schema-store.d.ts.map +1 -1
  59. package/lib/browser/label-provider.d.ts +1 -1
  60. package/lib/browser/label-provider.d.ts.map +1 -1
  61. package/lib/browser/logger-frontend-module.js +2 -2
  62. package/lib/browser/logger-frontend-module.js.map +1 -1
  63. package/lib/browser/menu/browser-menu-module.js +2 -2
  64. package/lib/browser/menu/browser-menu-module.js.map +1 -1
  65. package/lib/browser/menu/browser-menu-plugin.d.ts +2 -1
  66. package/lib/browser/menu/browser-menu-plugin.d.ts.map +1 -1
  67. package/lib/browser/menu/browser-menu-plugin.js.map +1 -1
  68. package/lib/browser/messaging/messaging-frontend-module.d.ts.map +1 -1
  69. package/lib/browser/messaging/messaging-frontend-module.js +1 -0
  70. package/lib/browser/messaging/messaging-frontend-module.js.map +1 -1
  71. package/lib/browser/messaging/ws-connection-provider.d.ts +5 -0
  72. package/lib/browser/messaging/ws-connection-provider.d.ts.map +1 -1
  73. package/lib/browser/messaging/ws-connection-provider.js +18 -3
  74. package/lib/browser/messaging/ws-connection-provider.js.map +1 -1
  75. package/lib/browser/preload/theme-preload-contribution.js +2 -2
  76. package/lib/browser/preload/theme-preload-contribution.js.map +1 -1
  77. package/lib/browser/quick-input/quick-command-frontend-contribution.d.ts.map +1 -1
  78. package/lib/browser/quick-input/quick-command-frontend-contribution.js +5 -0
  79. package/lib/browser/quick-input/quick-command-frontend-contribution.js.map +1 -1
  80. package/lib/browser/quick-input/quick-input-frontend-contribution.d.ts +1 -1
  81. package/lib/browser/quick-input/quick-input-frontend-contribution.d.ts.map +1 -1
  82. package/lib/browser/saveable.d.ts +3 -3
  83. package/lib/browser/saveable.d.ts.map +1 -1
  84. package/lib/browser/saveable.js +13 -8
  85. package/lib/browser/saveable.js.map +1 -1
  86. package/lib/browser/shell/application-shell-mouse-tracker.d.ts +1 -1
  87. package/lib/browser/shell/application-shell-mouse-tracker.d.ts.map +1 -1
  88. package/lib/browser/shell/application-shell.d.ts.map +1 -1
  89. package/lib/browser/shell/application-shell.js +15 -16
  90. package/lib/browser/shell/application-shell.js.map +1 -1
  91. package/lib/browser/shell/tab-bar-decorator.d.ts +1 -1
  92. package/lib/browser/shell/tab-bar-decorator.d.ts.map +1 -1
  93. package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-registry.d.ts +1 -1
  94. package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-registry.d.ts.map +1 -1
  95. package/lib/browser/status-bar/status-bar.d.ts.map +1 -1
  96. package/lib/browser/status-bar/status-bar.js +4 -2
  97. package/lib/browser/status-bar/status-bar.js.map +1 -1
  98. package/lib/browser/styling-service.d.ts +1 -1
  99. package/lib/browser/styling-service.d.ts.map +1 -1
  100. package/lib/browser/window/browser-window-module.js +2 -2
  101. package/lib/browser/window/browser-window-module.js.map +1 -1
  102. package/lib/browser/window/default-window-service.d.ts +2 -1
  103. package/lib/browser/window/default-window-service.d.ts.map +1 -1
  104. package/lib/browser/window/default-window-service.js +3 -3
  105. package/lib/browser/window/default-window-service.js.map +1 -1
  106. package/lib/browser/window/default-window-service.spec.js +2 -2
  107. package/lib/browser/window/default-window-service.spec.js.map +1 -1
  108. package/lib/browser/window/window-service.d.ts +3 -3
  109. package/lib/browser/window/window-service.d.ts.map +1 -1
  110. package/lib/browser/window/window-title-updater.d.ts +2 -1
  111. package/lib/browser/window/window-title-updater.d.ts.map +1 -1
  112. package/lib/browser/window/window-title-updater.js.map +1 -1
  113. package/lib/common/cancellation.d.ts +2 -0
  114. package/lib/common/cancellation.d.ts.map +1 -1
  115. package/lib/common/cancellation.js +20 -0
  116. package/lib/common/cancellation.js.map +1 -1
  117. package/lib/common/collections.d.ts +30 -0
  118. package/lib/common/collections.d.ts.map +1 -0
  119. package/lib/common/collections.js +122 -0
  120. package/lib/common/collections.js.map +1 -0
  121. package/lib/common/event.d.ts +5 -0
  122. package/lib/common/event.d.ts.map +1 -1
  123. package/lib/common/event.js +31 -0
  124. package/lib/common/event.js.map +1 -1
  125. package/lib/common/hash.d.ts +8 -0
  126. package/lib/common/hash.d.ts.map +1 -0
  127. package/lib/common/hash.js +85 -0
  128. package/lib/common/hash.js.map +1 -0
  129. package/lib/common/index.d.ts +1 -0
  130. package/lib/common/index.d.ts.map +1 -1
  131. package/lib/common/index.js +1 -0
  132. package/lib/common/index.js.map +1 -1
  133. package/lib/common/{keytar-protocol.d.ts → key-store.d.ts} +4 -4
  134. package/lib/common/key-store.d.ts.map +1 -0
  135. package/lib/common/{keytar-protocol.js → key-store.js} +4 -4
  136. package/lib/common/key-store.js.map +1 -0
  137. package/lib/common/keybinding.d.ts +2 -0
  138. package/lib/common/keybinding.d.ts.map +1 -1
  139. package/lib/common/keybinding.js +28 -0
  140. package/lib/common/keybinding.js.map +1 -1
  141. package/lib/common/markdown-rendering/markdown-string.d.ts +4 -0
  142. package/lib/common/markdown-rendering/markdown-string.d.ts.map +1 -1
  143. package/lib/common/markdown-rendering/markdown-string.js +24 -1
  144. package/lib/common/markdown-rendering/markdown-string.js.map +1 -1
  145. package/lib/common/menu/menu-types.d.ts +1 -1
  146. package/lib/common/menu/menu-types.d.ts.map +1 -1
  147. package/lib/common/menu/menu-types.js +2 -2
  148. package/lib/common/menu/menu-types.js.map +1 -1
  149. package/lib/common/message-rpc/rpc-protocol.d.ts.map +1 -1
  150. package/lib/common/message-rpc/rpc-protocol.js +6 -11
  151. package/lib/common/message-rpc/rpc-protocol.js.map +1 -1
  152. package/lib/common/objects.d.ts +1 -1
  153. package/lib/common/objects.d.ts.map +1 -1
  154. package/lib/common/objects.js +12 -10
  155. package/lib/common/objects.js.map +1 -1
  156. package/lib/common/quick-pick-service.d.ts +1 -0
  157. package/lib/common/quick-pick-service.d.ts.map +1 -1
  158. package/lib/common/quick-pick-service.js +2 -1
  159. package/lib/common/quick-pick-service.js.map +1 -1
  160. package/lib/common/strings.d.ts +1 -0
  161. package/lib/common/strings.d.ts.map +1 -1
  162. package/lib/common/strings.js +10 -1
  163. package/lib/common/strings.js.map +1 -1
  164. package/lib/common/types.d.ts +8 -0
  165. package/lib/common/types.d.ts.map +1 -1
  166. package/lib/common/types.js +21 -1
  167. package/lib/common/types.js.map +1 -1
  168. package/lib/common/uri.d.ts +0 -1
  169. package/lib/common/uri.d.ts.map +1 -1
  170. package/lib/common/uri.js +0 -3
  171. package/lib/common/uri.js.map +1 -1
  172. package/lib/common/uuid.d.ts +3 -0
  173. package/lib/common/uuid.d.ts.map +1 -0
  174. package/lib/common/uuid.js +86 -0
  175. package/lib/common/uuid.js.map +1 -0
  176. package/lib/common/version.d.ts +2 -0
  177. package/lib/common/version.d.ts.map +1 -0
  178. package/lib/common/version.js +20 -0
  179. package/lib/common/version.js.map +1 -0
  180. package/lib/common/window.d.ts +3 -0
  181. package/lib/common/window.d.ts.map +1 -1
  182. package/lib/electron-browser/keyboard/electron-keyboard-module.js +1 -1
  183. package/lib/electron-browser/keyboard/electron-keyboard-module.js.map +1 -1
  184. package/lib/electron-browser/messaging/electron-local-ws-connection-provider.d.ts +7 -0
  185. package/lib/electron-browser/messaging/electron-local-ws-connection-provider.d.ts.map +1 -0
  186. package/lib/electron-browser/messaging/electron-local-ws-connection-provider.js +55 -0
  187. package/lib/electron-browser/messaging/electron-local-ws-connection-provider.js.map +1 -0
  188. package/lib/electron-browser/messaging/electron-messaging-frontend-module.d.ts.map +1 -1
  189. package/lib/electron-browser/messaging/electron-messaging-frontend-module.js +16 -2
  190. package/lib/electron-browser/messaging/electron-messaging-frontend-module.js.map +1 -1
  191. package/lib/electron-browser/messaging/electron-ws-connection-provider.d.ts +1 -1
  192. package/lib/electron-browser/messaging/electron-ws-connection-provider.d.ts.map +1 -1
  193. package/lib/electron-browser/window/electron-window-module.js +2 -2
  194. package/lib/electron-browser/window/electron-window-module.js.map +1 -1
  195. package/lib/electron-browser/window/electron-window-service.d.ts +3 -3
  196. package/lib/electron-browser/window/electron-window-service.d.ts.map +1 -1
  197. package/lib/electron-browser/window/electron-window-service.js +10 -4
  198. package/lib/electron-browser/window/electron-window-service.js.map +1 -1
  199. package/lib/electron-common/electron-main-window-service.d.ts +2 -2
  200. package/lib/electron-common/electron-main-window-service.d.ts.map +1 -1
  201. package/lib/electron-main/electron-main-application.d.ts +3 -2
  202. package/lib/electron-main/electron-main-application.d.ts.map +1 -1
  203. package/lib/electron-main/electron-main-application.js +8 -4
  204. package/lib/electron-main/electron-main-application.js.map +1 -1
  205. package/lib/electron-main/electron-main-window-service-impl.d.ts +2 -2
  206. package/lib/electron-main/electron-main-window-service-impl.d.ts.map +1 -1
  207. package/lib/electron-main/electron-main-window-service-impl.js +2 -2
  208. package/lib/electron-main/electron-main-window-service-impl.js.map +1 -1
  209. package/lib/electron-node/hosting/electron-ws-origin-validator.d.ts +2 -0
  210. package/lib/electron-node/hosting/electron-ws-origin-validator.d.ts.map +1 -1
  211. package/lib/electron-node/hosting/electron-ws-origin-validator.js +12 -0
  212. package/lib/electron-node/hosting/electron-ws-origin-validator.js.map +1 -1
  213. package/lib/electron-node/token/electron-token-validator.d.ts +2 -2
  214. package/lib/electron-node/token/electron-token-validator.d.ts.map +1 -1
  215. package/lib/electron-node/token/electron-token-validator.js +12 -1
  216. package/lib/electron-node/token/electron-token-validator.js.map +1 -1
  217. package/lib/node/backend-application-module.d.ts.map +1 -1
  218. package/lib/node/backend-application-module.js +7 -4
  219. package/lib/node/backend-application-module.js.map +1 -1
  220. package/lib/node/backend-application.d.ts.map +1 -1
  221. package/lib/node/backend-application.js +4 -0
  222. package/lib/node/backend-application.js.map +1 -1
  223. package/lib/node/backend-remote-service.d.ts +4 -0
  224. package/lib/node/backend-remote-service.d.ts.map +1 -0
  225. package/lib/node/backend-remote-service.js +35 -0
  226. package/lib/node/backend-remote-service.js.map +1 -0
  227. package/lib/node/i18n/localization-contribution.d.ts +4 -4
  228. package/lib/node/i18n/localization-contribution.d.ts.map +1 -1
  229. package/lib/node/i18n/localization-contribution.js +11 -7
  230. package/lib/node/i18n/localization-contribution.js.map +1 -1
  231. package/lib/node/i18n/localization-provider.d.ts +16 -4
  232. package/lib/node/i18n/localization-provider.d.ts.map +1 -1
  233. package/lib/node/i18n/localization-provider.js +42 -10
  234. package/lib/node/i18n/localization-provider.js.map +1 -1
  235. package/lib/node/key-store-server.d.ts +28 -0
  236. package/lib/node/key-store-server.d.ts.map +1 -0
  237. package/lib/node/{keytar-server.js → key-store-server.js} +76 -17
  238. package/lib/node/key-store-server.js.map +1 -0
  239. package/lib/node/messaging/messaging-contribution.d.ts +1 -1
  240. package/lib/node/messaging/messaging-contribution.d.ts.map +1 -1
  241. package/lib/node/messaging/messaging-contribution.js +5 -4
  242. package/lib/node/messaging/messaging-contribution.js.map +1 -1
  243. package/package.json +6 -6
  244. package/src/browser/color-application-contribution.ts +1 -1
  245. package/src/browser/common-frontend-contribution.ts +41 -16
  246. package/src/browser/connection-status-service.ts +1 -1
  247. package/src/browser/core-preferences.ts +16 -16
  248. package/src/browser/credentials-service.ts +3 -3
  249. package/src/browser/dialogs.ts +1 -1
  250. package/src/browser/frontend-application-contribution.ts +110 -0
  251. package/src/browser/frontend-application-module.ts +8 -7
  252. package/src/browser/frontend-application.ts +2 -92
  253. package/src/browser/i18n/language-quick-pick-service.ts +1 -0
  254. package/src/browser/icon-registry.ts +96 -0
  255. package/src/browser/icon-theme-contribution.ts +1 -1
  256. package/src/browser/index.ts +1 -0
  257. package/src/browser/json-schema-store.ts +1 -1
  258. package/src/browser/label-provider.ts +1 -1
  259. package/src/browser/logger-frontend-module.ts +1 -1
  260. package/src/browser/menu/browser-menu-module.ts +1 -1
  261. package/src/browser/menu/browser-menu-plugin.ts +2 -1
  262. package/src/browser/messaging/messaging-frontend-module.ts +2 -1
  263. package/src/browser/messaging/ws-connection-provider.ts +21 -2
  264. package/src/browser/preload/theme-preload-contribution.ts +1 -1
  265. package/src/browser/quick-input/quick-command-frontend-contribution.ts +5 -0
  266. package/src/browser/quick-input/quick-input-frontend-contribution.ts +1 -1
  267. package/src/browser/saveable.ts +11 -7
  268. package/src/browser/shell/application-shell-mouse-tracker.ts +1 -1
  269. package/src/browser/shell/application-shell.ts +16 -15
  270. package/src/browser/shell/tab-bar-decorator.ts +1 -1
  271. package/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar-registry.ts +1 -1
  272. package/src/browser/status-bar/status-bar.tsx +6 -2
  273. package/src/browser/style/status-bar.css +12 -4
  274. package/src/browser/styling-service.ts +1 -1
  275. package/src/browser/window/browser-window-module.ts +1 -1
  276. package/src/browser/window/default-window-service.spec.ts +1 -1
  277. package/src/browser/window/default-window-service.ts +2 -1
  278. package/src/browser/window/window-service.ts +3 -3
  279. package/src/browser/window/window-title-updater.ts +2 -1
  280. package/src/common/cancellation.ts +22 -0
  281. package/src/common/collections.ts +125 -0
  282. package/src/common/event.ts +32 -0
  283. package/src/common/hash.ts +85 -0
  284. package/src/common/i18n/nls.metadata.json +4947 -4690
  285. package/src/common/index.ts +1 -0
  286. package/src/common/{keytar-protocol.ts → key-store.ts} +3 -3
  287. package/src/common/keybinding.ts +26 -0
  288. package/src/common/markdown-rendering/markdown-string.ts +24 -0
  289. package/src/common/menu/menu-types.ts +1 -1
  290. package/src/common/message-rpc/rpc-protocol.ts +6 -10
  291. package/src/common/objects.ts +14 -10
  292. package/src/common/quick-pick-service.ts +1 -0
  293. package/src/common/strings.ts +11 -0
  294. package/src/common/types.ts +22 -0
  295. package/src/common/uri.ts +0 -4
  296. package/src/common/uuid.ts +99 -0
  297. package/src/common/version.ts +17 -0
  298. package/src/common/window.ts +4 -0
  299. package/src/electron-browser/keyboard/electron-keyboard-module.ts +1 -1
  300. package/src/electron-browser/messaging/electron-local-ws-connection-provider.ts +45 -0
  301. package/src/electron-browser/messaging/electron-messaging-frontend-module.ts +15 -2
  302. package/src/electron-browser/messaging/electron-ws-connection-provider.ts +1 -1
  303. package/src/electron-browser/window/electron-window-module.ts +1 -1
  304. package/src/electron-browser/window/electron-window-service.ts +10 -5
  305. package/src/electron-common/electron-main-window-service.ts +2 -2
  306. package/src/electron-main/electron-main-application.ts +9 -5
  307. package/src/electron-main/electron-main-window-service-impl.ts +3 -3
  308. package/src/electron-node/hosting/electron-ws-origin-validator.ts +9 -1
  309. package/src/electron-node/token/electron-token-validator.ts +13 -3
  310. package/src/node/backend-application-module.ts +8 -5
  311. package/src/node/backend-application.ts +4 -0
  312. package/src/node/backend-remote-service.ts +25 -0
  313. package/src/node/i18n/localization-contribution.ts +15 -11
  314. package/src/node/i18n/localization-provider.ts +59 -12
  315. package/src/node/{keytar-server.ts → key-store-server.ts} +75 -11
  316. package/src/node/messaging/messaging-contribution.ts +5 -4
  317. package/lib/common/keytar-protocol.d.ts.map +0 -1
  318. package/lib/common/keytar-protocol.js.map +0 -1
  319. package/lib/node/keytar-server.d.ts +0 -14
  320. package/lib/node/keytar-server.d.ts.map +0 -1
  321. package/lib/node/keytar-server.js.map +0 -1
@@ -29,10 +29,10 @@ import { ApplicationServer, applicationPath } from '../common/application-protoc
29
29
  import { EnvVariablesServer, envVariablesPath } from './../common/env-variables';
30
30
  import { EnvVariablesServerImpl } from './env-variables';
31
31
  import { ConnectionContainerModule } from './messaging/connection-container-module';
32
- import { QuickPickService, quickPickServicePath } from '../common/quick-pick-service';
32
+ import { QuickInputService, quickInputServicePath, QuickPickService, quickPickServicePath } from '../common/quick-pick-service';
33
33
  import { WsRequestValidator, WsRequestValidatorContribution } from './ws-request-validators';
34
- import { KeytarService, keytarServicePath } from '../common/keytar-protocol';
35
- import { KeytarServiceImpl } from './keytar-server';
34
+ import { KeyStoreService, keyStoreServicePath } from '../common/key-store';
35
+ import { KeyStoreServiceImpl } from './key-store-server';
36
36
  import { ContributionFilterRegistry, ContributionFilterRegistryImpl } from '../common/contribution-filter';
37
37
  import { EnvironmentUtils } from './environment-utils';
38
38
  import { ProcessUtils } from './process-utils';
@@ -41,6 +41,7 @@ import { bindNodeStopwatch, bindBackendStopwatchServer } from './performance';
41
41
  import { OSBackendProviderImpl } from './os-backend-provider';
42
42
  import { BackendRequestFacade } from './request/backend-request-facade';
43
43
  import { FileSystemLocking, FileSystemLockingImpl } from './filesystem-locking';
44
+ import { BackendRemoteService } from './backend-remote-service';
44
45
 
45
46
  decorate(injectable(), ApplicationPackage);
46
47
 
@@ -54,6 +55,7 @@ const messageConnectionModule = ConnectionContainerModule.create(({ bind, bindFr
54
55
  });
55
56
 
56
57
  const quickPickConnectionModule = ConnectionContainerModule.create(({ bindFrontendService }) => {
58
+ bindFrontendService(quickInputServicePath, QuickInputService);
57
59
  bindFrontendService(quickPickServicePath, QuickPickService);
58
60
  });
59
61
 
@@ -106,9 +108,9 @@ export const backendApplicationModule = new ContainerModule(bind => {
106
108
 
107
109
  bind(WsRequestValidator).toSelf().inSingletonScope();
108
110
  bindContributionProvider(bind, WsRequestValidatorContribution);
109
- bind(KeytarService).to(KeytarServiceImpl).inSingletonScope();
111
+ bind(KeyStoreService).to(KeyStoreServiceImpl).inSingletonScope();
110
112
  bind(ConnectionHandler).toDynamicValue(ctx =>
111
- new RpcConnectionHandler(keytarServicePath, () => ctx.container.get<KeytarService>(KeytarService))
113
+ new RpcConnectionHandler(keyStoreServicePath, () => ctx.container.get<KeyStoreService>(KeyStoreService))
112
114
  ).inSingletonScope();
113
115
 
114
116
  bind(ContributionFilterRegistry).to(ContributionFilterRegistryImpl).inSingletonScope();
@@ -125,6 +127,7 @@ export const backendApplicationModule = new ContainerModule(bind => {
125
127
  bind(ProxyCliContribution).toSelf().inSingletonScope();
126
128
  bind(CliContribution).toService(ProxyCliContribution);
127
129
 
130
+ bind(BackendRemoteService).toSelf().inSingletonScope();
128
131
  bind(BackendRequestFacade).toSelf().inSingletonScope();
129
132
  bind(ConnectionHandler).toDynamicValue(
130
133
  ctx => new RpcConnectionHandler(REQUEST_SERVICE_PATH, () => ctx.container.get(BackendRequestFacade))
@@ -228,6 +228,10 @@ export class BackendApplication {
228
228
  this.app.get('*.gif', this.serveGzipped.bind(this, 'image/gif'));
229
229
  this.app.get('*.png', this.serveGzipped.bind(this, 'image/png'));
230
230
  this.app.get('*.svg', this.serveGzipped.bind(this, 'image/svg+xml'));
231
+ this.app.get('*.eot', this.serveGzipped.bind(this, 'application/vnd.ms-fontobject'));
232
+ this.app.get('*.ttf', this.serveGzipped.bind(this, 'font/ttf'));
233
+ this.app.get('*.woff', this.serveGzipped.bind(this, 'font/woff'));
234
+ this.app.get('*.woff2', this.serveGzipped.bind(this, 'font/woff2'));
231
235
 
232
236
  for (const contribution of this.contributionsProvider.getContributions()) {
233
237
  if (contribution.configure) {
@@ -0,0 +1,25 @@
1
+ // *****************************************************************************
2
+ // Copyright (C) 2023 TypeFox and others.
3
+ //
4
+ // This program and the accompanying materials are made available under the
5
+ // terms of the Eclipse Public License v. 2.0 which is available at
6
+ // http://www.eclipse.org/legal/epl-2.0.
7
+ //
8
+ // This Source Code may also be made available under the following Secondary
9
+ // Licenses when the conditions for such availability set forth in the Eclipse
10
+ // Public License v. 2.0 are satisfied: GNU General Public License, version 2
11
+ // with the GNU Classpath Exception which is available at
12
+ // https://www.gnu.org/software/classpath/license.html.
13
+ //
14
+ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
15
+ // *****************************************************************************
16
+
17
+ import { injectable } from 'inversify';
18
+
19
+ @injectable()
20
+ export class BackendRemoteService {
21
+
22
+ isRemoteServer(): boolean {
23
+ return false;
24
+ }
25
+ }
@@ -18,7 +18,7 @@ import * as fs from 'fs-extra';
18
18
  import { inject, injectable, named } from 'inversify';
19
19
  import { ContributionProvider, isObject } from '../../common';
20
20
  import { LanguageInfo, Localization } from '../../common/i18n/localization';
21
- import { LocalizationProvider } from './localization-provider';
21
+ import { LazyLocalization, LocalizationProvider } from './localization-provider';
22
22
 
23
23
  export const LocalizationContribution = Symbol('LocalizationContribution');
24
24
 
@@ -41,38 +41,42 @@ export class LocalizationRegistry {
41
41
  ));
42
42
  }
43
43
 
44
- registerLocalization(localization: Localization): void {
44
+ registerLocalization(localization: Localization | LazyLocalization): void {
45
+ if (!LazyLocalization.is(localization)) {
46
+ localization = LazyLocalization.fromLocalization(localization);
47
+ }
45
48
  this.localizationProvider.addLocalizations(localization);
46
49
  }
47
50
 
48
51
  registerLocalizationFromRequire(locale: string | LanguageInfo, required: unknown): void {
49
52
  const translations = this.flattenTranslations(required);
50
- this.registerLocalization(this.createLocalization(locale, translations));
53
+ this.registerLocalization(this.createLocalization(locale, () => Promise.resolve(translations)));
51
54
  }
52
55
 
53
- async registerLocalizationFromFile(localizationPath: string, locale?: string | LanguageInfo): Promise<void> {
56
+ registerLocalizationFromFile(localizationPath: string, locale?: string | LanguageInfo): void {
54
57
  if (!locale) {
55
58
  locale = this.identifyLocale(localizationPath);
56
59
  }
57
60
  if (!locale) {
58
61
  throw new Error('Could not determine locale from path.');
59
62
  }
60
- const translationJson = await fs.readJson(localizationPath);
61
- const translations = this.flattenTranslations(translationJson);
62
- this.registerLocalization(this.createLocalization(locale, translations));
63
+ this.registerLocalization(this.createLocalization(locale, async () => {
64
+ const translationJson = await fs.readJson(localizationPath);
65
+ return this.flattenTranslations(translationJson);
66
+ }));
63
67
  }
64
68
 
65
- protected createLocalization(locale: string | LanguageInfo, translations: Record<string, string>): Localization {
66
- let localization: Localization;
69
+ protected createLocalization(locale: string | LanguageInfo, translations: () => Promise<Record<string, string>>): LazyLocalization {
70
+ let localization: LazyLocalization;
67
71
  if (typeof locale === 'string') {
68
72
  localization = {
69
73
  languageId: locale,
70
- translations
74
+ getTranslations: translations
71
75
  };
72
76
  } else {
73
77
  localization = {
74
78
  ...locale,
75
- translations
79
+ getTranslations: translations
76
80
  };
77
81
  }
78
82
  return localization;
@@ -17,24 +17,70 @@
17
17
  import { injectable } from 'inversify';
18
18
  import { nls } from '../../common/nls';
19
19
  import { LanguageInfo, Localization } from '../../common/i18n/localization';
20
+ import { Disposable } from '../../common/disposable';
21
+ import { isObject } from '../../common/types';
22
+
23
+ /**
24
+ * Localization data structure that contributes its localizations asynchronously.
25
+ * Allows to load localizations on demand when requested by the user.
26
+ */
27
+ export interface LazyLocalization extends LanguageInfo {
28
+ getTranslations(): Promise<Record<string, string>>;
29
+ }
30
+
31
+ export namespace LazyLocalization {
32
+ export function is(obj: unknown): obj is LazyLocalization {
33
+ return isObject<LazyLocalization>(obj) && typeof obj.languageId === 'string' && typeof obj.getTranslations === 'function';
34
+ }
35
+ export function fromLocalization(localization: Localization): LazyLocalization {
36
+ const {
37
+ languageId,
38
+ languageName,
39
+ languagePack,
40
+ localizedLanguageName,
41
+ translations
42
+ } = localization;
43
+ return {
44
+ languageId,
45
+ languageName,
46
+ languagePack,
47
+ localizedLanguageName,
48
+ getTranslations: () => Promise.resolve(translations)
49
+ };
50
+ }
51
+ export async function toLocalization(localization: LazyLocalization): Promise<Localization> {
52
+ const {
53
+ languageId,
54
+ languageName,
55
+ languagePack,
56
+ localizedLanguageName
57
+ } = localization;
58
+ return {
59
+ languageId,
60
+ languageName,
61
+ languagePack,
62
+ localizedLanguageName,
63
+ translations: await localization.getTranslations()
64
+ };
65
+ }
66
+ }
20
67
 
21
68
  @injectable()
22
69
  export class LocalizationProvider {
23
70
 
24
- protected localizations: Localization[] = [];
71
+ protected localizations: LazyLocalization[] = [];
25
72
  protected currentLanguage = nls.defaultLocale;
26
73
 
27
- addLocalizations(...localizations: Localization[]): void {
74
+ addLocalizations(...localizations: LazyLocalization[]): Disposable {
28
75
  this.localizations.push(...localizations);
29
- }
30
-
31
- removeLocalizations(...localizations: Localization[]): void {
32
- for (const localization of localizations) {
33
- const index = this.localizations.indexOf(localization);
34
- if (index >= 0) {
35
- this.localizations.splice(index, 1);
76
+ return Disposable.create(() => {
77
+ for (const localization of localizations) {
78
+ const index = this.localizations.indexOf(localization);
79
+ if (index >= 0) {
80
+ this.localizations.splice(index, 1);
81
+ }
36
82
  }
37
- }
83
+ });
38
84
  }
39
85
 
40
86
  setCurrentLanguage(languageId: string): void {
@@ -61,12 +107,13 @@ export class LocalizationProvider {
61
107
  return Array.from(languageInfos.values()).sort((a, b) => a.languageId.localeCompare(b.languageId));
62
108
  }
63
109
 
64
- loadLocalization(languageId: string): Localization {
110
+ async loadLocalization(languageId: string): Promise<Localization> {
65
111
  const merged: Localization = {
66
112
  languageId,
67
113
  translations: {}
68
114
  };
69
- for (const localization of this.localizations.filter(e => e.languageId === languageId)) {
115
+ const localizations = await Promise.all(this.localizations.filter(e => e.languageId === languageId).map(LazyLocalization.toLocalization));
116
+ for (const localization of localizations) {
70
117
  merged.languageName ||= localization.languageName;
71
118
  merged.localizedLanguageName ||= localization.localizedLanguageName;
72
119
  merged.languagePack ||= localization.languagePack;
@@ -20,24 +20,27 @@
20
20
  *--------------------------------------------------------------------------------------------*/
21
21
  // code copied and modified from https://github.com/microsoft/vscode/blob/1.55.2/src/vs/platform/native/electron-main/nativeHostMainService.ts#L679-L771
22
22
 
23
- import { KeytarService } from '../common/keytar-protocol';
23
+ import { KeyStoreService } from '../common/key-store';
24
24
  import { injectable } from 'inversify';
25
25
  import { isWindows } from '../common';
26
- import * as keytar from 'keytar';
27
26
 
28
27
  @injectable()
29
- export class KeytarServiceImpl implements KeytarService {
28
+ export class KeyStoreServiceImpl implements KeyStoreService {
29
+
30
30
  private static readonly MAX_PASSWORD_LENGTH = 2500;
31
- private static readonly PASSWORD_CHUNK_SIZE = KeytarServiceImpl.MAX_PASSWORD_LENGTH - 100;
31
+ private static readonly PASSWORD_CHUNK_SIZE = KeyStoreServiceImpl.MAX_PASSWORD_LENGTH - 100;
32
+
33
+ protected keytarImplementation?: typeof import('keytar');
32
34
 
33
35
  async setPassword(service: string, account: string, password: string): Promise<void> {
34
- if (isWindows && password.length > KeytarServiceImpl.MAX_PASSWORD_LENGTH) {
36
+ const keytar = await this.getKeytar();
37
+ if (isWindows && password.length > KeyStoreServiceImpl.MAX_PASSWORD_LENGTH) {
35
38
  let index = 0;
36
39
  let chunk = 0;
37
40
  let hasNextChunk = true;
38
41
  while (hasNextChunk) {
39
- const passwordChunk = password.substring(index, index + KeytarServiceImpl.PASSWORD_CHUNK_SIZE);
40
- index += KeytarServiceImpl.PASSWORD_CHUNK_SIZE;
42
+ const passwordChunk = password.substring(index, index + KeyStoreServiceImpl.PASSWORD_CHUNK_SIZE);
43
+ index += KeyStoreServiceImpl.PASSWORD_CHUNK_SIZE;
41
44
  hasNextChunk = password.length - index > 0;
42
45
 
43
46
  const content: ChunkedPassword = {
@@ -54,11 +57,13 @@ export class KeytarServiceImpl implements KeytarService {
54
57
  }
55
58
  }
56
59
 
57
- deletePassword(service: string, account: string): Promise<boolean> {
60
+ async deletePassword(service: string, account: string): Promise<boolean> {
61
+ const keytar = await this.getKeytar();
58
62
  return keytar.deletePassword(service, account);
59
63
  }
60
64
 
61
65
  async getPassword(service: string, account: string): Promise<string | undefined> {
66
+ const keytar = await this.getKeytar();
62
67
  const password = await keytar.getPassword(service, account);
63
68
  if (password) {
64
69
  try {
@@ -81,15 +86,74 @@ export class KeytarServiceImpl implements KeytarService {
81
86
  }
82
87
  }
83
88
  }
89
+
84
90
  async findPassword(service: string): Promise<string | undefined> {
91
+ const keytar = await this.getKeytar();
85
92
  const password = await keytar.findPassword(service);
86
- if (password) {
87
- return password;
88
- }
93
+ return password ?? undefined;
89
94
  }
95
+
90
96
  async findCredentials(service: string): Promise<Array<{ account: string, password: string }>> {
97
+ const keytar = await this.getKeytar();
91
98
  return keytar.findCredentials(service);
92
99
  }
100
+
101
+ protected async getKeytar(): Promise<typeof import('keytar')> {
102
+ if (this.keytarImplementation) {
103
+ return this.keytarImplementation;
104
+ }
105
+ try {
106
+ this.keytarImplementation = await import('keytar');
107
+ // Try using keytar to see if it throws or not.
108
+ await this.keytarImplementation.findCredentials('test-keytar-loads');
109
+ } catch (err) {
110
+ this.keytarImplementation = new InMemoryCredentialsProvider();
111
+ console.warn('OS level credential store could not be accessed. Using in-memory credentials provider', err);
112
+ }
113
+ return this.keytarImplementation;
114
+ }
115
+ }
116
+
117
+ export class InMemoryCredentialsProvider {
118
+ private secretVault: Record<string, Record<string, string> | undefined> = {};
119
+
120
+ async getPassword(service: string, account: string): Promise<string | null> {
121
+ // eslint-disable-next-line no-null/no-null
122
+ return this.secretVault[service]?.[account] ?? null;
123
+ }
124
+
125
+ async setPassword(service: string, account: string, password: string): Promise<void> {
126
+ this.secretVault[service] = this.secretVault[service] ?? {};
127
+ this.secretVault[service]![account] = password;
128
+ }
129
+
130
+ async deletePassword(service: string, account: string): Promise<boolean> {
131
+ if (!this.secretVault[service]?.[account]) {
132
+ return false;
133
+ }
134
+ delete this.secretVault[service]![account];
135
+ if (Object.keys(this.secretVault[service]!).length === 0) {
136
+ delete this.secretVault[service];
137
+ }
138
+ return true;
139
+ }
140
+
141
+ async findPassword(service: string): Promise<string | null> {
142
+ // eslint-disable-next-line no-null/no-null
143
+ return JSON.stringify(this.secretVault[service]) ?? null;
144
+ }
145
+
146
+ async findCredentials(service: string): Promise<Array<{ account: string; password: string }>> {
147
+ const credentials: { account: string; password: string }[] = [];
148
+ for (const account of Object.keys(this.secretVault[service] || {})) {
149
+ credentials.push({ account, password: this.secretVault[service]![account] });
150
+ }
151
+ return credentials;
152
+ }
153
+
154
+ async clear(): Promise<void> {
155
+ this.secretVault = {};
156
+ }
93
157
  }
94
158
 
95
159
  interface ChunkedPassword {
@@ -83,7 +83,7 @@ export class MessagingContribution implements BackendApplicationContribution, Me
83
83
  // We provide a `fix-origin` header in the `WebSocketConnectionProvider`
84
84
  request.headers.origin = request.headers['fix-origin'] as string;
85
85
  if (await this.allowConnect(socket.request)) {
86
- this.handleConnection(socket);
86
+ await this.handleConnection(socket);
87
87
  this.messagingListener.onDidWebSocketUpgrade(socket.request, socket);
88
88
  } else {
89
89
  socket.disconnect(true);
@@ -91,7 +91,7 @@ export class MessagingContribution implements BackendApplicationContribution, Me
91
91
  });
92
92
  }
93
93
 
94
- protected handleConnection(socket: Socket): void {
94
+ protected async handleConnection(socket: Socket): Promise<void> {
95
95
  const pathname = socket.nsp.name;
96
96
  if (pathname && !this.wsHandlers.route(pathname, socket)) {
97
97
  console.error('Cannot find a ws handler for the path: ' + pathname);
@@ -166,14 +166,15 @@ export namespace MessagingContribution {
166
166
 
167
167
  push(spec: string, callback: (params: MessagingService.PathParams, connection: T) => void): void {
168
168
  const route = new Route(spec);
169
- this.handlers.push((path, channel) => {
169
+ const handler = (path: string, channel: T): string | false => {
170
170
  const params = route.match(path);
171
171
  if (!params) {
172
172
  return false;
173
173
  }
174
174
  callback(params, channel);
175
175
  return route.reverse(params);
176
- });
176
+ };
177
+ this.handlers.push(handler);
177
178
  }
178
179
 
179
180
  route(path: string, connection: T): string | false {
@@ -1 +0,0 @@
1
- {"version":3,"file":"keytar-protocol.d.ts","sourceRoot":"","sources":["../../src/common/keytar-protocol.ts"],"names":[],"mappings":"AAgBA,eAAO,MAAM,iBAAiB,qBAAqB,CAAC;AAEpD,eAAO,MAAM,aAAa,eAA0B,CAAC;AACrD,MAAM,WAAW,aAAa;IAC1B,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/E,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC3E,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnE,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC3D,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;CAC3F"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"keytar-protocol.js","sourceRoot":"","sources":["../../src/common/keytar-protocol.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,+CAA+C;AAC/C,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;AAEnE,QAAA,iBAAiB,GAAG,kBAAkB,CAAC;AAEvC,QAAA,aAAa,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC"}
@@ -1,14 +0,0 @@
1
- import { KeytarService } from '../common/keytar-protocol';
2
- export declare class KeytarServiceImpl implements KeytarService {
3
- private static readonly MAX_PASSWORD_LENGTH;
4
- private static readonly PASSWORD_CHUNK_SIZE;
5
- setPassword(service: string, account: string, password: string): Promise<void>;
6
- deletePassword(service: string, account: string): Promise<boolean>;
7
- getPassword(service: string, account: string): Promise<string | undefined>;
8
- findPassword(service: string): Promise<string | undefined>;
9
- findCredentials(service: string): Promise<Array<{
10
- account: string;
11
- password: string;
12
- }>>;
13
- }
14
- //# sourceMappingURL=keytar-server.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"keytar-server.d.ts","sourceRoot":"","sources":["../../src/node/keytar-server.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAK1D,qBACa,iBAAkB,YAAW,aAAa;IACnD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAQ;IACnD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAA+C;IAEpF,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBpF,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAI5D,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAuB1E,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAM1D,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAGhG"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"keytar-server.js","sourceRoot":"","sources":["../../src/node/keytar-server.ts"],"names":[],"mappings":"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"}