@theia/filesystem 1.77.0-next.1 → 1.77.0-next.108

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 (436) hide show
  1. package/lib/browser/breadcrumbs/filepath-breadcrumb.js +4 -8
  2. package/lib/browser/breadcrumbs/filepath-breadcrumb.js.map +1 -1
  3. package/lib/browser/breadcrumbs/filepath-breadcrumbs-container.d.ts +1 -1
  4. package/lib/browser/breadcrumbs/filepath-breadcrumbs-container.d.ts.map +1 -1
  5. package/lib/browser/breadcrumbs/filepath-breadcrumbs-container.js +18 -25
  6. package/lib/browser/breadcrumbs/filepath-breadcrumbs-container.js.map +1 -1
  7. package/lib/browser/breadcrumbs/filepath-breadcrumbs-contribution.d.ts +5 -5
  8. package/lib/browser/breadcrumbs/filepath-breadcrumbs-contribution.d.ts.map +1 -1
  9. package/lib/browser/breadcrumbs/filepath-breadcrumbs-contribution.js +27 -33
  10. package/lib/browser/breadcrumbs/filepath-breadcrumbs-contribution.js.map +1 -1
  11. package/lib/browser/download/file-download-command-contribution.d.ts +1 -1
  12. package/lib/browser/download/file-download-command-contribution.d.ts.map +1 -1
  13. package/lib/browser/download/file-download-command-contribution.js +28 -33
  14. package/lib/browser/download/file-download-command-contribution.js.map +1 -1
  15. package/lib/browser/download/file-download-frontend-module.js +8 -10
  16. package/lib/browser/download/file-download-frontend-module.js.map +1 -1
  17. package/lib/browser/download/file-download-service.d.ts +1 -1
  18. package/lib/browser/download/file-download-service.d.ts.map +1 -1
  19. package/lib/browser/download/file-download-service.js +19 -25
  20. package/lib/browser/download/file-download-service.js.map +1 -1
  21. package/lib/browser/file-dialog/file-dialog-container.d.ts +1 -1
  22. package/lib/browser/file-dialog/file-dialog-container.d.ts.map +1 -1
  23. package/lib/browser/file-dialog/file-dialog-container.js +25 -30
  24. package/lib/browser/file-dialog/file-dialog-container.js.map +1 -1
  25. package/lib/browser/file-dialog/file-dialog-hidden-files-renderer.d.ts +1 -1
  26. package/lib/browser/file-dialog/file-dialog-hidden-files-renderer.d.ts.map +1 -1
  27. package/lib/browser/file-dialog/file-dialog-hidden-files-renderer.js +13 -21
  28. package/lib/browser/file-dialog/file-dialog-hidden-files-renderer.js.map +1 -1
  29. package/lib/browser/file-dialog/file-dialog-model.d.ts +2 -2
  30. package/lib/browser/file-dialog/file-dialog-model.d.ts.map +1 -1
  31. package/lib/browser/file-dialog/file-dialog-model.js +20 -27
  32. package/lib/browser/file-dialog/file-dialog-model.js.map +1 -1
  33. package/lib/browser/file-dialog/file-dialog-module.js +21 -23
  34. package/lib/browser/file-dialog/file-dialog-module.js.map +1 -1
  35. package/lib/browser/file-dialog/file-dialog-service.d.ts +4 -4
  36. package/lib/browser/file-dialog/file-dialog-service.d.ts.map +1 -1
  37. package/lib/browser/file-dialog/file-dialog-service.js +29 -38
  38. package/lib/browser/file-dialog/file-dialog-service.js.map +1 -1
  39. package/lib/browser/file-dialog/file-dialog-tree-filters-renderer.d.ts +3 -1
  40. package/lib/browser/file-dialog/file-dialog-tree-filters-renderer.d.ts.map +1 -1
  41. package/lib/browser/file-dialog/file-dialog-tree-filters-renderer.js +17 -22
  42. package/lib/browser/file-dialog/file-dialog-tree-filters-renderer.js.map +1 -1
  43. package/lib/browser/file-dialog/file-dialog-tree-filters-renderer.spec.d.ts +2 -0
  44. package/lib/browser/file-dialog/file-dialog-tree-filters-renderer.spec.d.ts.map +1 -0
  45. package/lib/browser/file-dialog/file-dialog-tree-filters-renderer.spec.js +35 -0
  46. package/lib/browser/file-dialog/file-dialog-tree-filters-renderer.spec.js.map +1 -0
  47. package/lib/browser/file-dialog/file-dialog-tree.d.ts +2 -2
  48. package/lib/browser/file-dialog/file-dialog-tree.d.ts.map +1 -1
  49. package/lib/browser/file-dialog/file-dialog-tree.js +8 -11
  50. package/lib/browser/file-dialog/file-dialog-tree.js.map +1 -1
  51. package/lib/browser/file-dialog/file-dialog-widget.d.ts +2 -2
  52. package/lib/browser/file-dialog/file-dialog-widget.d.ts.map +1 -1
  53. package/lib/browser/file-dialog/file-dialog-widget.js +18 -23
  54. package/lib/browser/file-dialog/file-dialog-widget.js.map +1 -1
  55. package/lib/browser/file-dialog/file-dialog.d.ts +11 -6
  56. package/lib/browser/file-dialog/file-dialog.d.ts.map +1 -1
  57. package/lib/browser/file-dialog/file-dialog.js +109 -126
  58. package/lib/browser/file-dialog/file-dialog.js.map +1 -1
  59. package/lib/browser/file-dialog/index.d.ts +4 -4
  60. package/lib/browser/file-dialog/index.d.ts.map +1 -1
  61. package/lib/browser/file-dialog/index.js +4 -7
  62. package/lib/browser/file-dialog/index.js.map +1 -1
  63. package/lib/browser/file-resource.d.ts +2 -2
  64. package/lib/browser/file-resource.d.ts.map +1 -1
  65. package/lib/browser/file-resource.js +64 -71
  66. package/lib/browser/file-resource.js.map +1 -1
  67. package/lib/browser/file-resource.spec.js +39 -41
  68. package/lib/browser/file-resource.spec.js.map +1 -1
  69. package/lib/browser/file-selection.d.ts +1 -1
  70. package/lib/browser/file-selection.d.ts.map +1 -1
  71. package/lib/browser/file-selection.js +7 -10
  72. package/lib/browser/file-selection.js.map +1 -1
  73. package/lib/browser/file-service-activation.spec.d.ts +2 -0
  74. package/lib/browser/file-service-activation.spec.d.ts.map +1 -0
  75. package/lib/browser/file-service-activation.spec.js +79 -0
  76. package/lib/browser/file-service-activation.spec.js.map +1 -0
  77. package/lib/browser/file-service-copy.spec.d.ts +2 -0
  78. package/lib/browser/file-service-copy.spec.d.ts.map +1 -0
  79. package/lib/browser/file-service-copy.spec.js +193 -0
  80. package/lib/browser/file-service-copy.spec.js.map +1 -0
  81. package/lib/browser/file-service-watcher.spec.js +199 -201
  82. package/lib/browser/file-service-watcher.spec.js.map +1 -1
  83. package/lib/browser/file-service.d.ts +4 -4
  84. package/lib/browser/file-service.d.ts.map +1 -1
  85. package/lib/browser/file-service.js +179 -182
  86. package/lib/browser/file-service.js.map +1 -1
  87. package/lib/browser/file-tree/file-tree-container.js +12 -15
  88. package/lib/browser/file-tree/file-tree-container.js.map +1 -1
  89. package/lib/browser/file-tree/file-tree-decorator-adapter.js +23 -31
  90. package/lib/browser/file-tree/file-tree-decorator-adapter.js.map +1 -1
  91. package/lib/browser/file-tree/file-tree-decorator-adapter.spec.js +26 -28
  92. package/lib/browser/file-tree/file-tree-decorator-adapter.spec.js.map +1 -1
  93. package/lib/browser/file-tree/file-tree-label-provider.d.ts +1 -1
  94. package/lib/browser/file-tree/file-tree-label-provider.d.ts.map +1 -1
  95. package/lib/browser/file-tree/file-tree-label-provider.js +13 -18
  96. package/lib/browser/file-tree/file-tree-label-provider.js.map +1 -1
  97. package/lib/browser/file-tree/file-tree-model.d.ts +5 -5
  98. package/lib/browser/file-tree/file-tree-model.d.ts.map +1 -1
  99. package/lib/browser/file-tree/file-tree-model.js +48 -52
  100. package/lib/browser/file-tree/file-tree-model.js.map +1 -1
  101. package/lib/browser/file-tree/file-tree-widget.d.ts +3 -3
  102. package/lib/browser/file-tree/file-tree-widget.d.ts.map +1 -1
  103. package/lib/browser/file-tree/file-tree-widget.js +66 -72
  104. package/lib/browser/file-tree/file-tree-widget.js.map +1 -1
  105. package/lib/browser/file-tree/file-tree.d.ts +3 -3
  106. package/lib/browser/file-tree/file-tree.d.ts.map +1 -1
  107. package/lib/browser/file-tree/file-tree.js +26 -31
  108. package/lib/browser/file-tree/file-tree.js.map +1 -1
  109. package/lib/browser/file-tree/index.d.ts +6 -6
  110. package/lib/browser/file-tree/index.d.ts.map +1 -1
  111. package/lib/browser/file-tree/index.js +6 -9
  112. package/lib/browser/file-tree/index.js.map +1 -1
  113. package/lib/browser/filesystem-frontend-contribution.d.ts +6 -6
  114. package/lib/browser/filesystem-frontend-contribution.d.ts.map +1 -1
  115. package/lib/browser/filesystem-frontend-contribution.js +75 -90
  116. package/lib/browser/filesystem-frontend-contribution.js.map +1 -1
  117. package/lib/browser/filesystem-frontend-module.js +47 -50
  118. package/lib/browser/filesystem-frontend-module.js.map +1 -1
  119. package/lib/browser/filesystem-saveable-service.d.ts +2 -2
  120. package/lib/browser/filesystem-saveable-service.d.ts.map +1 -1
  121. package/lib/browser/filesystem-saveable-service.js +35 -44
  122. package/lib/browser/filesystem-saveable-service.js.map +1 -1
  123. package/lib/browser/filesystem-watcher-error-handler.js +13 -18
  124. package/lib/browser/filesystem-watcher-error-handler.js.map +1 -1
  125. package/lib/browser/index.d.ts +4 -4
  126. package/lib/browser/index.d.ts.map +1 -1
  127. package/lib/browser/index.js +4 -7
  128. package/lib/browser/index.js.map +1 -1
  129. package/lib/browser/location/index.d.ts +2 -2
  130. package/lib/browser/location/index.d.ts.map +1 -1
  131. package/lib/browser/location/index.js +2 -5
  132. package/lib/browser/location/index.js.map +1 -1
  133. package/lib/browser/location/location-renderer.d.ts +3 -3
  134. package/lib/browser/location/location-renderer.d.ts.map +1 -1
  135. package/lib/browser/location/location-renderer.js +42 -51
  136. package/lib/browser/location/location-renderer.js.map +1 -1
  137. package/lib/browser/location/location-renderer.spec.js +61 -63
  138. package/lib/browser/location/location-renderer.spec.js.map +1 -1
  139. package/lib/browser/location/location-service.js +1 -2
  140. package/lib/browser/location/location-service.js.map +1 -1
  141. package/lib/browser/remote-file-service-contribution.d.ts +2 -2
  142. package/lib/browser/remote-file-service-contribution.d.ts.map +1 -1
  143. package/lib/browser/remote-file-service-contribution.js +8 -12
  144. package/lib/browser/remote-file-service-contribution.js.map +1 -1
  145. package/lib/browser/upload/file-upload-service-impl.d.ts +3 -3
  146. package/lib/browser/upload/file-upload-service-impl.d.ts.map +1 -1
  147. package/lib/browser/upload/file-upload-service-impl.js +55 -64
  148. package/lib/browser/upload/file-upload-service-impl.js.map +1 -1
  149. package/lib/browser/vscode-file-service-contribution.d.ts +2 -2
  150. package/lib/browser/vscode-file-service-contribution.d.ts.map +1 -1
  151. package/lib/browser/vscode-file-service-contribution.js +23 -28
  152. package/lib/browser/vscode-file-service-contribution.js.map +1 -1
  153. package/lib/browser-only/browser-only-filesystem-frontend-module.js +21 -23
  154. package/lib/browser-only/browser-only-filesystem-frontend-module.js.map +1 -1
  155. package/lib/browser-only/browser-only-filesystem-provider-server.d.ts +1 -1
  156. package/lib/browser-only/browser-only-filesystem-provider-server.d.ts.map +1 -1
  157. package/lib/browser-only/browser-only-filesystem-provider-server.js +10 -13
  158. package/lib/browser-only/browser-only-filesystem-provider-server.js.map +1 -1
  159. package/lib/browser-only/download/file-download-command-contribution.d.ts +1 -1
  160. package/lib/browser-only/download/file-download-command-contribution.d.ts.map +1 -1
  161. package/lib/browser-only/download/file-download-command-contribution.js +14 -19
  162. package/lib/browser-only/download/file-download-command-contribution.js.map +1 -1
  163. package/lib/browser-only/download/file-download-frontend-module.js +8 -10
  164. package/lib/browser-only/download/file-download-frontend-module.js.map +1 -1
  165. package/lib/browser-only/download/file-download-service.d.ts +3 -3
  166. package/lib/browser-only/download/file-download-service.d.ts.map +1 -1
  167. package/lib/browser-only/download/file-download-service.js +26 -33
  168. package/lib/browser-only/download/file-download-service.js.map +1 -1
  169. package/lib/browser-only/file-search.d.ts.map +1 -1
  170. package/lib/browser-only/file-search.js +9 -14
  171. package/lib/browser-only/file-search.js.map +1 -1
  172. package/lib/browser-only/opfs-filesystem-initialization.d.ts +1 -1
  173. package/lib/browser-only/opfs-filesystem-initialization.d.ts.map +1 -1
  174. package/lib/browser-only/opfs-filesystem-initialization.js +6 -9
  175. package/lib/browser-only/opfs-filesystem-initialization.js.map +1 -1
  176. package/lib/browser-only/opfs-filesystem-provider.d.ts +2 -2
  177. package/lib/browser-only/opfs-filesystem-provider.d.ts.map +1 -1
  178. package/lib/browser-only/opfs-filesystem-provider.js +60 -68
  179. package/lib/browser-only/opfs-filesystem-provider.js.map +1 -1
  180. package/lib/browser-only/upload/file-upload-service-impl.d.ts +3 -3
  181. package/lib/browser-only/upload/file-upload-service-impl.d.ts.map +1 -1
  182. package/lib/browser-only/upload/file-upload-service-impl.js +51 -60
  183. package/lib/browser-only/upload/file-upload-service-impl.js.map +1 -1
  184. package/lib/common/delegating-file-system-provider.d.ts +1 -1
  185. package/lib/common/delegating-file-system-provider.d.ts.map +1 -1
  186. package/lib/common/delegating-file-system-provider.js +18 -22
  187. package/lib/common/delegating-file-system-provider.js.map +1 -1
  188. package/lib/common/download/file-download.js +5 -8
  189. package/lib/common/download/file-download.js.map +1 -1
  190. package/lib/common/file-upload.js +1 -4
  191. package/lib/common/file-upload.js.map +1 -1
  192. package/lib/common/files.js +38 -58
  193. package/lib/common/files.js.map +1 -1
  194. package/lib/common/files.spec.js +22 -24
  195. package/lib/common/files.spec.js.map +1 -1
  196. package/lib/common/filesystem-preferences.js +39 -44
  197. package/lib/common/filesystem-preferences.js.map +1 -1
  198. package/lib/common/filesystem-utils.d.ts +1 -1
  199. package/lib/common/filesystem-utils.d.ts.map +1 -1
  200. package/lib/common/filesystem-utils.js +2 -5
  201. package/lib/common/filesystem-utils.js.map +1 -1
  202. package/lib/common/filesystem-utils.spec.js +227 -229
  203. package/lib/common/filesystem-utils.spec.js.map +1 -1
  204. package/lib/common/filesystem-watcher-protocol.d.ts +5 -1
  205. package/lib/common/filesystem-watcher-protocol.d.ts.map +1 -1
  206. package/lib/common/filesystem-watcher-protocol.js +2 -5
  207. package/lib/common/filesystem-watcher-protocol.js.map +1 -1
  208. package/lib/common/filesystem.js +2 -5
  209. package/lib/common/filesystem.js.map +1 -1
  210. package/lib/common/index.d.ts +3 -3
  211. package/lib/common/index.d.ts.map +1 -1
  212. package/lib/common/index.js +3 -6
  213. package/lib/common/index.js.map +1 -1
  214. package/lib/common/io.d.ts +2 -2
  215. package/lib/common/io.d.ts.map +1 -1
  216. package/lib/common/io.js +10 -13
  217. package/lib/common/io.js.map +1 -1
  218. package/lib/common/remote-file-system-provider.d.ts +1 -1
  219. package/lib/common/remote-file-system-provider.d.ts.map +1 -1
  220. package/lib/common/remote-file-system-provider.js +81 -93
  221. package/lib/common/remote-file-system-provider.js.map +1 -1
  222. package/lib/common/upload/file-upload.js +1 -4
  223. package/lib/common/upload/file-upload.js.map +1 -1
  224. package/lib/electron-browser/file-dialog/electron-file-dialog-module.js +6 -8
  225. package/lib/electron-browser/file-dialog/electron-file-dialog-module.js.map +1 -1
  226. package/lib/electron-browser/file-dialog/electron-file-dialog-service.d.ts +3 -3
  227. package/lib/electron-browser/file-dialog/electron-file-dialog-service.d.ts.map +1 -1
  228. package/lib/electron-browser/file-dialog/electron-file-dialog-service.js +20 -24
  229. package/lib/electron-browser/file-dialog/electron-file-dialog-service.js.map +1 -1
  230. package/lib/electron-browser/file-dialog/electron-file-dialog-service.spec.d.ts +2 -0
  231. package/lib/electron-browser/file-dialog/electron-file-dialog-service.spec.d.ts.map +1 -0
  232. package/lib/electron-browser/file-dialog/electron-file-dialog-service.spec.js +46 -0
  233. package/lib/electron-browser/file-dialog/electron-file-dialog-service.spec.js.map +1 -0
  234. package/lib/electron-browser/preload.js +6 -9
  235. package/lib/electron-browser/preload.js.map +1 -1
  236. package/lib/electron-common/electron-api.js +2 -5
  237. package/lib/electron-common/electron-api.js.map +1 -1
  238. package/lib/electron-main/electron-api-main.js +15 -18
  239. package/lib/electron-main/electron-api-main.js.map +1 -1
  240. package/lib/electron-main/electron-main-module.js +6 -8
  241. package/lib/electron-main/electron-main-module.js.map +1 -1
  242. package/lib/node/disk-file-system-provider.d.ts +2 -2
  243. package/lib/node/disk-file-system-provider.d.ts.map +1 -1
  244. package/lib/node/disk-file-system-provider.js +116 -121
  245. package/lib/node/disk-file-system-provider.js.map +1 -1
  246. package/lib/node/disk-file-system-provider.spec.js +77 -54
  247. package/lib/node/disk-file-system-provider.spec.js.map +1 -1
  248. package/lib/node/download/directory-archiver.js +13 -16
  249. package/lib/node/download/directory-archiver.js.map +1 -1
  250. package/lib/node/download/directory-archiver.spec.js +20 -22
  251. package/lib/node/download/directory-archiver.spec.js.map +1 -1
  252. package/lib/node/download/file-download-backend-module.js +14 -16
  253. package/lib/node/download/file-download-backend-module.js.map +1 -1
  254. package/lib/node/download/file-download-cache.js +12 -16
  255. package/lib/node/download/file-download-cache.js.map +1 -1
  256. package/lib/node/download/file-download-endpoint.d.ts +1 -1
  257. package/lib/node/download/file-download-endpoint.d.ts.map +1 -1
  258. package/lib/node/download/file-download-endpoint.js +25 -31
  259. package/lib/node/download/file-download-endpoint.js.map +1 -1
  260. package/lib/node/download/file-download-handler.d.ts +2 -2
  261. package/lib/node/download/file-download-handler.d.ts.map +1 -1
  262. package/lib/node/download/file-download-handler.js +70 -77
  263. package/lib/node/download/file-download-handler.js.map +1 -1
  264. package/lib/node/download/test/mock-directory-archiver.d.ts +1 -1
  265. package/lib/node/download/test/mock-directory-archiver.d.ts.map +1 -1
  266. package/lib/node/download/test/mock-directory-archiver.js +2 -6
  267. package/lib/node/download/test/mock-directory-archiver.js.map +1 -1
  268. package/lib/node/file-change-collection.d.ts +1 -1
  269. package/lib/node/file-change-collection.d.ts.map +1 -1
  270. package/lib/node/file-change-collection.js +1 -5
  271. package/lib/node/file-change-collection.js.map +1 -1
  272. package/lib/node/file-change-collection.spec.js +5 -7
  273. package/lib/node/file-change-collection.spec.js.map +1 -1
  274. package/lib/node/filesystem-backend-module.d.ts +3 -3
  275. package/lib/node/filesystem-backend-module.d.ts.map +1 -1
  276. package/lib/node/filesystem-backend-module.js +57 -62
  277. package/lib/node/filesystem-backend-module.js.map +1 -1
  278. package/lib/node/filesystem-watcher-client.d.ts +2 -2
  279. package/lib/node/filesystem-watcher-client.d.ts.map +1 -1
  280. package/lib/node/filesystem-watcher-client.js +11 -16
  281. package/lib/node/filesystem-watcher-client.js.map +1 -1
  282. package/lib/node/filesystem-watcher-dispatcher.d.ts +1 -1
  283. package/lib/node/filesystem-watcher-dispatcher.d.ts.map +1 -1
  284. package/lib/node/filesystem-watcher-dispatcher.js +9 -13
  285. package/lib/node/filesystem-watcher-dispatcher.js.map +1 -1
  286. package/lib/node/filesystem-watcher-service-impl.d.ts +30 -0
  287. package/lib/node/filesystem-watcher-service-impl.d.ts.map +1 -0
  288. package/lib/node/filesystem-watcher-service-impl.js +88 -0
  289. package/lib/node/filesystem-watcher-service-impl.js.map +1 -0
  290. package/lib/node/filesystem-watcher-service-impl.spec.d.ts +2 -0
  291. package/lib/node/filesystem-watcher-service-impl.spec.d.ts.map +1 -0
  292. package/lib/node/filesystem-watcher-service-impl.spec.js +199 -0
  293. package/lib/node/filesystem-watcher-service-impl.spec.js.map +1 -0
  294. package/lib/node/filesystem-watcher.d.ts +93 -0
  295. package/lib/node/filesystem-watcher.d.ts.map +1 -0
  296. package/lib/node/filesystem-watcher.js +129 -0
  297. package/lib/node/filesystem-watcher.js.map +1 -0
  298. package/lib/node/nodejs-watcher/node-directory-watcher.d.ts +175 -0
  299. package/lib/node/nodejs-watcher/node-directory-watcher.d.ts.map +1 -0
  300. package/lib/node/nodejs-watcher/node-directory-watcher.js +574 -0
  301. package/lib/node/nodejs-watcher/node-directory-watcher.js.map +1 -0
  302. package/lib/node/nodejs-watcher/node-directory-watcher.spec.d.ts +2 -0
  303. package/lib/node/nodejs-watcher/node-directory-watcher.spec.d.ts.map +1 -0
  304. package/lib/node/nodejs-watcher/node-directory-watcher.spec.js +1281 -0
  305. package/lib/node/nodejs-watcher/node-directory-watcher.spec.js.map +1 -0
  306. package/lib/node/nodejs-watcher/watch-request-router.d.ts +63 -0
  307. package/lib/node/nodejs-watcher/watch-request-router.d.ts.map +1 -0
  308. package/lib/node/nodejs-watcher/watch-request-router.js +178 -0
  309. package/lib/node/nodejs-watcher/watch-request-router.js.map +1 -0
  310. package/lib/node/nodejs-watcher/watcher-host.d.ts +50 -0
  311. package/lib/node/nodejs-watcher/watcher-host.d.ts.map +1 -0
  312. package/lib/node/nodejs-watcher/watcher-host.js +94 -0
  313. package/lib/node/nodejs-watcher/watcher-host.js.map +1 -0
  314. package/lib/node/parcel-watcher/index.js +6 -8
  315. package/lib/node/parcel-watcher/index.js.map +1 -1
  316. package/lib/node/parcel-watcher/parcel-filesystem-service.d.ts +14 -194
  317. package/lib/node/parcel-watcher/parcel-filesystem-service.d.ts.map +1 -1
  318. package/lib/node/parcel-watcher/parcel-filesystem-service.js +5 -426
  319. package/lib/node/parcel-watcher/parcel-filesystem-service.js.map +1 -1
  320. package/lib/node/parcel-watcher/parcel-filesystem-watcher.spec.js +23 -25
  321. package/lib/node/parcel-watcher/parcel-filesystem-watcher.spec.js.map +1 -1
  322. package/lib/node/parcel-watcher/parcel-options.js +1 -4
  323. package/lib/node/parcel-watcher/parcel-options.js.map +1 -1
  324. package/lib/node/parcel-watcher/parcel-watcher-exclude.spec.js +12 -16
  325. package/lib/node/parcel-watcher/parcel-watcher-exclude.spec.js.map +1 -1
  326. package/lib/node/parcel-watcher/parcel-watcher-retry.spec.js +11 -15
  327. package/lib/node/parcel-watcher/parcel-watcher-retry.spec.js.map +1 -1
  328. package/lib/node/parcel-watcher/parcel-watcher.d.ts +165 -0
  329. package/lib/node/parcel-watcher/parcel-watcher.d.ts.map +1 -0
  330. package/lib/node/parcel-watcher/parcel-watcher.js +366 -0
  331. package/lib/node/parcel-watcher/parcel-watcher.js.map +1 -0
  332. package/lib/node/test/watcher-test-helper.d.ts +21 -0
  333. package/lib/node/test/watcher-test-helper.d.ts.map +1 -0
  334. package/lib/node/test/watcher-test-helper.js +51 -0
  335. package/lib/node/test/watcher-test-helper.js.map +1 -0
  336. package/lib/node/upload/node-file-upload-service.d.ts +1 -1
  337. package/lib/node/upload/node-file-upload-service.d.ts.map +1 -1
  338. package/lib/node/upload/node-file-upload-service.js +20 -25
  339. package/lib/node/upload/node-file-upload-service.js.map +1 -1
  340. package/lib/node/upload/node-file-upload-service.spec.js +21 -23
  341. package/lib/node/upload/node-file-upload-service.spec.js.map +1 -1
  342. package/package.json +21 -7
  343. package/src/browser/breadcrumbs/filepath-breadcrumb.ts +1 -1
  344. package/src/browser/breadcrumbs/filepath-breadcrumbs-container.ts +1 -1
  345. package/src/browser/breadcrumbs/filepath-breadcrumbs-contribution.ts +5 -5
  346. package/src/browser/download/file-download-command-contribution.ts +1 -1
  347. package/src/browser/download/file-download-frontend-module.ts +3 -3
  348. package/src/browser/download/file-download-service.ts +1 -2
  349. package/src/browser/file-dialog/file-dialog-container.ts +5 -5
  350. package/src/browser/file-dialog/file-dialog-hidden-files-renderer.tsx +1 -1
  351. package/src/browser/file-dialog/file-dialog-model.ts +2 -2
  352. package/src/browser/file-dialog/file-dialog-module.ts +5 -5
  353. package/src/browser/file-dialog/file-dialog-service.ts +4 -4
  354. package/src/browser/file-dialog/file-dialog-tree-filters-renderer.spec.ts +43 -0
  355. package/src/browser/file-dialog/file-dialog-tree-filters-renderer.tsx +4 -2
  356. package/src/browser/file-dialog/file-dialog-tree.ts +2 -2
  357. package/src/browser/file-dialog/file-dialog-widget.ts +2 -2
  358. package/src/browser/file-dialog/file-dialog.ts +17 -7
  359. package/src/browser/file-dialog/index.ts +4 -4
  360. package/src/browser/file-resource.spec.ts +3 -3
  361. package/src/browser/file-resource.ts +3 -3
  362. package/src/browser/file-selection.ts +1 -1
  363. package/src/browser/file-service-activation.spec.ts +93 -0
  364. package/src/browser/file-service-copy.spec.ts +226 -0
  365. package/src/browser/file-service-watcher.spec.ts +2 -2
  366. package/src/browser/file-service.ts +22 -11
  367. package/src/browser/file-tree/file-tree-container.ts +3 -3
  368. package/src/browser/file-tree/file-tree-decorator-adapter.spec.ts +1 -1
  369. package/src/browser/file-tree/file-tree-decorator-adapter.ts +1 -1
  370. package/src/browser/file-tree/file-tree-label-provider.ts +1 -1
  371. package/src/browser/file-tree/file-tree-model.ts +12 -6
  372. package/src/browser/file-tree/file-tree-widget.tsx +8 -5
  373. package/src/browser/file-tree/file-tree.ts +3 -3
  374. package/src/browser/file-tree/index.ts +6 -6
  375. package/src/browser/filesystem-frontend-contribution.ts +6 -6
  376. package/src/browser/filesystem-frontend-module.ts +14 -14
  377. package/src/browser/filesystem-saveable-service.ts +2 -2
  378. package/src/browser/index.ts +4 -4
  379. package/src/browser/location/index.ts +2 -2
  380. package/src/browser/location/location-renderer.spec.ts +3 -3
  381. package/src/browser/location/location-renderer.tsx +3 -3
  382. package/src/browser/remote-file-service-contribution.ts +2 -2
  383. package/src/browser/upload/file-upload-service-impl.ts +5 -5
  384. package/src/browser/vscode-file-service-contribution.ts +2 -2
  385. package/src/browser-only/browser-only-filesystem-frontend-module.ts +7 -7
  386. package/src/browser-only/browser-only-filesystem-provider-server.ts +1 -1
  387. package/src/browser-only/download/file-download-command-contribution.ts +2 -2
  388. package/src/browser-only/download/file-download-frontend-module.ts +3 -3
  389. package/src/browser-only/download/file-download-service.ts +3 -3
  390. package/src/browser-only/file-search.ts +2 -1
  391. package/src/browser-only/opfs-filesystem-initialization.ts +1 -1
  392. package/src/browser-only/opfs-filesystem-provider.ts +3 -3
  393. package/src/browser-only/upload/file-upload-service-impl.ts +4 -4
  394. package/src/common/delegating-file-system-provider.ts +1 -1
  395. package/src/common/files.spec.ts +1 -1
  396. package/src/common/filesystem-utils.spec.ts +2 -2
  397. package/src/common/filesystem-utils.ts +1 -1
  398. package/src/common/filesystem-watcher-protocol.ts +5 -1
  399. package/src/common/index.ts +3 -3
  400. package/src/common/io.ts +2 -2
  401. package/src/common/remote-file-system-provider.ts +1 -1
  402. package/src/electron-browser/file-dialog/electron-file-dialog-module.ts +2 -2
  403. package/src/electron-browser/file-dialog/electron-file-dialog-service.spec.ts +57 -0
  404. package/src/electron-browser/file-dialog/electron-file-dialog-service.ts +5 -5
  405. package/src/electron-browser/preload.ts +1 -1
  406. package/src/electron-main/electron-api-main.ts +1 -1
  407. package/src/electron-main/electron-main-module.ts +1 -1
  408. package/src/node/disk-file-system-provider.spec.ts +32 -3
  409. package/src/node/disk-file-system-provider.ts +12 -8
  410. package/src/node/download/directory-archiver.spec.ts +1 -1
  411. package/src/node/download/file-download-backend-module.ts +4 -4
  412. package/src/node/download/file-download-cache.ts +1 -1
  413. package/src/node/download/file-download-endpoint.ts +4 -3
  414. package/src/node/download/file-download-handler.ts +3 -4
  415. package/src/node/download/test/mock-directory-archiver.ts +1 -1
  416. package/src/node/file-change-collection.spec.ts +2 -2
  417. package/src/node/file-change-collection.ts +1 -1
  418. package/src/node/filesystem-backend-module.ts +15 -14
  419. package/src/node/filesystem-watcher-client.ts +2 -2
  420. package/src/node/filesystem-watcher-dispatcher.ts +1 -1
  421. package/src/node/filesystem-watcher-service-impl.spec.ts +272 -0
  422. package/src/node/filesystem-watcher-service-impl.ts +109 -0
  423. package/src/node/filesystem-watcher.ts +197 -0
  424. package/src/node/nodejs-watcher/node-directory-watcher.spec.ts +1594 -0
  425. package/src/node/nodejs-watcher/node-directory-watcher.ts +664 -0
  426. package/src/node/nodejs-watcher/watch-request-router.ts +224 -0
  427. package/src/node/nodejs-watcher/watcher-host.ts +126 -0
  428. package/src/node/parcel-watcher/index.ts +3 -3
  429. package/src/node/parcel-watcher/parcel-filesystem-service.ts +14 -500
  430. package/src/node/parcel-watcher/parcel-filesystem-watcher.spec.ts +5 -5
  431. package/src/node/parcel-watcher/parcel-watcher-exclude.spec.ts +7 -11
  432. package/src/node/parcel-watcher/parcel-watcher-retry.spec.ts +6 -8
  433. package/src/node/parcel-watcher/parcel-watcher.ts +433 -0
  434. package/src/node/test/watcher-test-helper.ts +58 -0
  435. package/src/node/upload/node-file-upload-service.spec.ts +1 -1
  436. package/src/node/upload/node-file-upload-service.ts +6 -6
@@ -16,8 +16,8 @@
16
16
 
17
17
  import * as assert from 'assert';
18
18
  import { FileUri } from '@theia/core/lib/common/file-uri';
19
- import { FileChangeCollection } from './file-change-collection';
20
- import { FileChangeType } from '../common/files';
19
+ import { FileChangeCollection } from './file-change-collection.js';
20
+ import { FileChangeType } from '../common/files.js';
21
21
 
22
22
  describe('FileChangeCollection', () => {
23
23
 
@@ -14,7 +14,7 @@
14
14
  // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
15
15
  // *****************************************************************************
16
16
 
17
- import { FileChange, FileChangeType } from '../common/filesystem-watcher-protocol';
17
+ import { FileChange, FileChangeType } from '../common/filesystem-watcher-protocol.js';
18
18
 
19
19
  /**
20
20
  * A file change collection guarantees that only one change is reported for each URI.
@@ -17,32 +17,33 @@
17
17
  import * as path from 'path';
18
18
  import { ContainerModule, interfaces } from '@theia/core/shared/inversify';
19
19
  import { ConnectionHandler, RpcConnectionHandler, ILogger } from '@theia/core/lib/common';
20
- import { FileSystemWatcherServer, FileSystemWatcherService } from '../common/filesystem-watcher-protocol';
21
- import { FileSystemWatcherServerClient } from './filesystem-watcher-client';
22
- import { ParcelFileSystemWatcherService, ParcelFileSystemWatcherServerOptions } from './parcel-watcher/parcel-filesystem-service';
23
- import { NodeFileUploadService } from './upload/node-file-upload-service';
24
- import { ParcelWatcherOptions } from './parcel-watcher/parcel-options';
25
- import { DiskFileSystemProvider } from './disk-file-system-provider';
20
+ import { FileSystemWatcherServer, FileSystemWatcherService } from '../common/filesystem-watcher-protocol.js';
21
+ import { FileSystemWatcherServerClient } from './filesystem-watcher-client.js';
22
+ import { FileSystemWatcherServiceImpl } from './filesystem-watcher-service-impl.js';
23
+ import { ParcelFileSystemWatcherServerOptions } from './parcel-watcher/parcel-watcher.js';
24
+ import { NodeFileUploadService } from './upload/node-file-upload-service.js';
25
+ import { ParcelWatcherOptions } from './parcel-watcher/parcel-options.js';
26
+ import { DiskFileSystemProvider } from './disk-file-system-provider.js';
26
27
  import {
27
28
  remoteFileSystemPath, RemoteFileSystemServer, RemoteFileSystemClient, FileSystemProviderServer, RemoteFileSystemProxyFactory
28
- } from '../common/remote-file-system-provider';
29
- import { FileSystemProvider } from '../common/files';
29
+ } from '../common/remote-file-system-provider.js';
30
+ import { FileSystemProvider } from '../common/files.js';
30
31
  import { EncodingService } from '@theia/core/lib/common/encoding-service';
31
32
  import { BackendApplicationContribution, IPCConnectionProvider } from '@theia/core/lib/node';
32
33
  import { RpcProxyFactory, ConnectionErrorHandler } from '@theia/core';
33
- import { FileSystemWatcherServiceDispatcher } from './filesystem-watcher-dispatcher';
34
- import { bindFileSystemPreferences } from '../common';
34
+ import { FileSystemWatcherServiceDispatcher } from './filesystem-watcher-dispatcher.js';
35
+ import { bindFileSystemPreferences } from '../common/index.js';
35
36
 
36
37
  export const WATCHER_SINGLE_THREADED = process.argv.includes('--no-cluster');
37
38
  export const WATCHER_VERBOSE = process.argv.includes('--watcher-verbose');
38
39
 
39
40
  export const FileSystemWatcherServiceProcessOptions = Symbol('FileSystemWatcherServiceProcessOptions');
40
41
  /**
41
- * Options to control the way the `ParcelFileSystemWatcherService` process is spawned.
42
+ * Options to control the way the `FileSystemWatcherServiceImpl` process is spawned.
42
43
  */
43
44
  export interface FileSystemWatcherServiceProcessOptions {
44
45
  /**
45
- * Path to the script that will run the `ParcelFileSystemWatcherService` in a new process.
46
+ * Path to the script that will run the `FileSystemWatcherServiceImpl` in a new process.
46
47
  */
47
48
  entryPoint: string;
48
49
  }
@@ -76,7 +77,7 @@ export function bindFileSystemWatcherServer(bind: interfaces.Bind): void {
76
77
  bind(FileSystemWatcherServer).toService(FileSystemWatcherServerClient);
77
78
 
78
79
  bind<FileSystemWatcherServiceProcessOptions>(FileSystemWatcherServiceProcessOptions).toDynamicValue(ctx => ({
79
- entryPoint: path.join(__dirname, 'parcel-watcher'),
80
+ entryPoint: path.join(import.meta.dirname, 'parcel-watcher'),
80
81
  })).inSingletonScope();
81
82
  bind<ParcelFileSystemWatcherServerOptions>(ParcelFileSystemWatcherServerOptions).toDynamicValue(ctx => {
82
83
  const logger = ctx.container.get<ILogger>(ILogger);
@@ -102,7 +103,7 @@ export function bindFileSystemWatcherServer(bind: interfaces.Bind): void {
102
103
  export function createParcelFileSystemWatcherService(ctx: interfaces.Context): FileSystemWatcherService {
103
104
  const options = ctx.container.get<ParcelFileSystemWatcherServerOptions>(ParcelFileSystemWatcherServerOptions);
104
105
  const dispatcher = ctx.container.get<FileSystemWatcherServiceDispatcher>(FileSystemWatcherServiceDispatcher);
105
- const server = new ParcelFileSystemWatcherService(options);
106
+ const server = new FileSystemWatcherServiceImpl(options);
106
107
  server.setClient(dispatcher);
107
108
  return server;
108
109
  }
@@ -15,8 +15,8 @@
15
15
  // *****************************************************************************
16
16
 
17
17
  import { injectable, inject } from '@theia/core/shared/inversify';
18
- import { FileSystemWatcherServer, WatchOptions, FileSystemWatcherClient, FileSystemWatcherService } from '../common/filesystem-watcher-protocol';
19
- import { FileSystemWatcherServiceDispatcher } from './filesystem-watcher-dispatcher';
18
+ import { FileSystemWatcherServer, WatchOptions, FileSystemWatcherClient, FileSystemWatcherService } from '../common/filesystem-watcher-protocol.js';
19
+ import { FileSystemWatcherServiceDispatcher } from './filesystem-watcher-dispatcher.js';
20
20
 
21
21
  /**
22
22
  * Wraps the watcher singleton service for each frontend.
@@ -18,7 +18,7 @@ import { injectable, inject, named } from '@theia/core/shared/inversify';
18
18
  import {
19
19
  FileSystemWatcherClient, FileSystemWatcherServiceClient,
20
20
  DidFilesChangedParams, FileSystemWatcherErrorParams
21
- } from '../common/filesystem-watcher-protocol';
21
+ } from '../common/filesystem-watcher-protocol.js';
22
22
  import { ILogger } from '@theia/core';
23
23
  /**
24
24
  * This component routes watch events to the right clients.
@@ -0,0 +1,272 @@
1
+ // *****************************************************************************
2
+ // Copyright (C) 2026 Ehab Younes 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 * as assert from 'assert';
18
+ import { wait } from '@theia/core/lib/common/promise-util';
19
+ import * as temp from 'temp';
20
+ import * as fs from '@theia/core/shared/fs-extra';
21
+ import { isWindows } from '@theia/core';
22
+ import { FileUri } from '@theia/core/lib/node';
23
+ import { DirectoryWatcherProvider, NodeDirectoryWatcher } from './nodejs-watcher/node-directory-watcher.js';
24
+ import { NO_LOGGING, TempDir, WATCHER_TIMINGS as TIMINGS } from './test/watcher-test-helper.js';
25
+ import { FileSystemWatcher, WatcherProvider } from './filesystem-watcher.js';
26
+ import {
27
+ FileSystemWatcherServiceImpl, ParcelFileSystemWatcherServerOptions, ParcelFileSystemWatcherService, ParcelWatcher, RecursiveWatcherProvider
28
+ } from './parcel-watcher/parcel-filesystem-service.js';
29
+ import { WatchOptions } from '../common/filesystem-watcher-protocol.js';
30
+
31
+ const track = temp.track();
32
+
33
+ const RECURSIVE: Readonly<WatchOptions> = { ignored: [], recursive: true };
34
+ const NON_RECURSIVE: Readonly<WatchOptions> = { ignored: [], recursive: false };
35
+
36
+ /** Exposes what a provider allocated and who serves what, so a test can tell sharing from double-allocation. */
37
+ interface TestProvider extends WatcherProvider {
38
+ readonly allocated: readonly FileSystemWatcher[];
39
+ watcherOf(watcherId: number): FileSystemWatcher | undefined;
40
+ }
41
+
42
+ class TestDirectoryProvider extends DirectoryWatcherProvider implements TestProvider {
43
+ get allocated(): readonly FileSystemWatcher[] {
44
+ return this.activeWatchers;
45
+ }
46
+
47
+ watcherOf(watcherId: number): FileSystemWatcher | undefined {
48
+ return this.watcherFor(watcherId);
49
+ }
50
+ }
51
+
52
+ class TestRecursiveProvider extends RecursiveWatcherProvider implements TestProvider {
53
+ get allocated(): readonly FileSystemWatcher[] {
54
+ return this.activeWatchers;
55
+ }
56
+
57
+ watcherOf(watcherId: number): FileSystemWatcher | undefined {
58
+ return this.watcherFor(watcherId);
59
+ }
60
+ }
61
+
62
+ function isTestProvider(provider: WatcherProvider): provider is TestProvider {
63
+ return provider instanceof TestDirectoryProvider || provider instanceof TestRecursiveProvider;
64
+ }
65
+
66
+ /** A temporary directory and a watcher service on it, one per test. */
67
+ class Sandbox extends FileSystemWatcherServiceImpl {
68
+
69
+ /** The directory the requests of this test point into. */
70
+ readonly files = new TempDir(fs.realpathSync.native(temp.mkdirSync('filesystem-watcher-service')));
71
+
72
+ protected readonly requested: number[] = [];
73
+
74
+ constructor() {
75
+ super(NO_LOGGING);
76
+ }
77
+
78
+ get root(): string {
79
+ return this.files.root;
80
+ }
81
+
82
+ watch(fsPath: string, options: WatchOptions): Promise<number> {
83
+ return this.watchFileChanges(1, FileUri.create(fsPath).toString(), options)
84
+ .then(watcherId => (this.requested.push(watcherId), watcherId));
85
+ }
86
+
87
+ /** The watchers currently allocated, one per distinct key, across both providers. */
88
+ get allocated(): readonly FileSystemWatcher[] {
89
+ return this.testProviders.flatMap(provider => provider.allocated);
90
+ }
91
+
92
+ protected get testProviders(): TestProvider[] {
93
+ return this.providers.filter(isTestProvider);
94
+ }
95
+
96
+ /** The watcher serving a request, asked of whichever provider holds it. */
97
+ watcherOf(watcherId: number): FileSystemWatcher | undefined {
98
+ return this.testProviders.map(provider => provider.watcherOf(watcherId)).find(Boolean);
99
+ }
100
+
101
+ async release(): Promise<void> {
102
+ const outstanding = this.requested.splice(0).filter(watcherId => this.watcherOf(watcherId));
103
+ const allocated = this.allocated;
104
+ await Promise.all(outstanding.map(watcherId => this.unwatchFileChanges(watcherId)));
105
+ await Promise.all(allocated.map(watcher => watcher.whenDisposed));
106
+ }
107
+
108
+ protected override createProviders(options: ParcelFileSystemWatcherServerOptions): WatcherProvider[] {
109
+ return [
110
+ new TestRecursiveProvider(options, this.maybeClient, TIMINGS.deferredDisposalTimeout),
111
+ new TestDirectoryProvider(options, this.maybeClient, TIMINGS)
112
+ ];
113
+ }
114
+ }
115
+
116
+ describe('filesystem-watcher-service', function (): void {
117
+
118
+ this.timeout(20000);
119
+
120
+ let box: Sandbox;
121
+
122
+ beforeEach(() => {
123
+ box = new Sandbox();
124
+ });
125
+
126
+ afterEach(async () => {
127
+ await box.release();
128
+ track.cleanupSync();
129
+ });
130
+
131
+ describe('routing', () => {
132
+
133
+ it('keeps the deprecated service name usable by adopters', () => {
134
+ assert.strictEqual(ParcelFileSystemWatcherService, FileSystemWatcherServiceImpl);
135
+ });
136
+
137
+ it('serves a recursive request, and one that does not say, with the parcel watcher', async () => {
138
+
139
+ const recursive = await box.watch(box.root, RECURSIVE);
140
+ const unspecified = await box.watch(box.files.mkdir('other'), { ignored: [] });
141
+
142
+ assert.ok(box.watcherOf(recursive) instanceof ParcelWatcher);
143
+ assert.ok(box.watcherOf(unspecified) instanceof ParcelWatcher);
144
+ });
145
+
146
+ it('serves a non-recursive request with a directory watcher', async () => {
147
+
148
+ const watcherId = await box.watch(box.root, NON_RECURSIVE);
149
+
150
+ assert.ok(box.watcherOf(watcherId) instanceof NodeDirectoryWatcher);
151
+ });
152
+
153
+ it('keeps a recursive and a non-recursive request on the same path apart', async () => {
154
+
155
+ const recursive = await box.watch(box.root, RECURSIVE);
156
+ const nonRecursive = await box.watch(box.root, NON_RECURSIVE);
157
+
158
+ assert.notStrictEqual(box.watcherOf(recursive), box.watcherOf(nonRecursive));
159
+ assert.strictEqual(box.allocated.length, 2);
160
+ });
161
+ });
162
+
163
+ describe('sharing', () => {
164
+
165
+ it('shares one watcher between a directory and the files inside it', async () => {
166
+
167
+ const directory = await box.watch(box.root, NON_RECURSIVE);
168
+ const first = await box.watch(box.files.write('a.txt'), NON_RECURSIVE);
169
+ const second = await box.watch(box.files.write('b.txt'), NON_RECURSIVE);
170
+
171
+ assert.strictEqual(box.allocated.length, 1);
172
+ assert.strictEqual(box.watcherOf(directory), box.watcherOf(first));
173
+ assert.strictEqual(box.watcherOf(first), box.watcherOf(second));
174
+ });
175
+
176
+ it('shares one watcher between requests with different excludes', async () => {
177
+
178
+ await box.watch(box.root, { ignored: ['**/node_modules'], recursive: false });
179
+ await box.watch(box.root, NON_RECURSIVE);
180
+
181
+ assert.strictEqual(box.allocated.length, 1);
182
+ });
183
+
184
+ it('shares one watcher between a directory and a symbolic link to it', async () => {
185
+ const real = box.files.mkdir('real');
186
+ fs.symlinkSync(real, box.files.path('link'), isWindows ? 'junction' : 'dir');
187
+
188
+ const direct = await box.watch(real, NON_RECURSIVE);
189
+ const linked = await box.watch(box.files.path('link'), NON_RECURSIVE);
190
+
191
+ assert.strictEqual(box.allocated.length, 1);
192
+ assert.strictEqual(box.watcherOf(direct), box.watcherOf(linked));
193
+ });
194
+
195
+ it('shares one watcher between concurrent requests for the same directory', async () => {
196
+ const [first, second] = [box.files.write('a.txt'), box.files.write('b.txt')];
197
+
198
+ const [one, two] = await Promise.all([box.watch(first, NON_RECURSIVE), box.watch(second, NON_RECURSIVE)]);
199
+
200
+ assert.strictEqual(box.allocated.length, 1);
201
+ assert.strictEqual(box.watcherOf(one), box.watcherOf(two));
202
+ });
203
+
204
+ it('moves a watcher to the parent once its path turns out to be a file', async () => {
205
+ const pending = await box.watch(box.files.path('later.txt'), NON_RECURSIVE);
206
+ box.files.write('later.txt');
207
+ await (box.watcherOf(pending) as NodeDirectoryWatcher).whenStarted;
208
+
209
+ const directory = await box.watch(box.root, NON_RECURSIVE);
210
+
211
+ assert.strictEqual(box.allocated.length, 1);
212
+ assert.strictEqual(box.watcherOf(pending), box.watcherOf(directory));
213
+ });
214
+
215
+ it('merges two watchers whose paths turn out to be files in one directory', async () => {
216
+ const [one, two] = await Promise.all([
217
+ box.watch(box.files.path('a.txt'), NON_RECURSIVE),
218
+ box.watch(box.files.path('b.txt'), NON_RECURSIVE)
219
+ ]);
220
+ box.files.write('a.txt');
221
+ box.files.write('b.txt');
222
+ await Promise.all([one, two].map(watcherId => (box.watcherOf(watcherId) as NodeDirectoryWatcher).whenStarted));
223
+
224
+ assert.strictEqual(box.allocated.length, 1);
225
+ assert.strictEqual(box.watcherOf(one), box.watcherOf(two));
226
+
227
+ // The handles have to follow the merge, or the moved request would never be released.
228
+ const survivor = box.watcherOf(one) as NodeDirectoryWatcher;
229
+ await Promise.all([one, two].map(watcherId => box.unwatchFileChanges(watcherId)));
230
+ await survivor.whenDisposed;
231
+ assert.strictEqual(box.allocated.length, 0);
232
+ });
233
+
234
+ it('does not attach a request to a watcher that is already disposed', async () => {
235
+ const first = await box.watch(box.root, NON_RECURSIVE);
236
+ const disposed = box.watcherOf(first) as NodeDirectoryWatcher;
237
+ disposed.dispose();
238
+
239
+ const second = await box.watch(box.root, NON_RECURSIVE);
240
+
241
+ assert.notStrictEqual(box.watcherOf(second), disposed);
242
+ assert.strictEqual(box.allocated.length, 1);
243
+ });
244
+ });
245
+
246
+ describe('releasing', () => {
247
+
248
+ it('disposes a directory watcher once its last request is unwatched', async () => {
249
+ const first = await box.watch(box.root, NON_RECURSIVE);
250
+ const second = await box.watch(box.root, NON_RECURSIVE);
251
+ const watcher = box.watcherOf(first) as NodeDirectoryWatcher;
252
+
253
+ await box.unwatchFileChanges(first);
254
+ await wait(TIMINGS.deferredDisposalTimeout * 2);
255
+ assert.strictEqual(watcher.isDisposed, false, 'the remaining request must keep the watcher alive');
256
+
257
+ await box.unwatchFileChanges(second);
258
+ await watcher.whenDisposed;
259
+ assert.strictEqual(box.allocated.length, 0);
260
+ });
261
+
262
+ it('releases the client reference of a recursive watcher', async () => {
263
+ const watcherId = await box.watch(box.root, RECURSIVE);
264
+ const watcher = box.watcherOf(watcherId) as ParcelWatcher;
265
+
266
+ await box.unwatchFileChanges(watcherId);
267
+ await watcher.whenDisposed;
268
+
269
+ assert.strictEqual(box.allocated.length, 0);
270
+ });
271
+ });
272
+ });
@@ -0,0 +1,109 @@
1
+ // *****************************************************************************
2
+ // Copyright (C) 2017-2018 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 { FileUri } from '@theia/core/lib/common/file-uri';
18
+ import { FileSystemWatcherService, FileSystemWatcherServiceClient, WatchOptions } from '../common/filesystem-watcher-protocol.js';
19
+ import { ResolvedWatchOptions, WatcherLogger, WatcherProvider } from './filesystem-watcher.js';
20
+ import { DirectoryWatcherProvider } from './nodejs-watcher/node-directory-watcher.js';
21
+ import { ParcelFileSystemWatcherServerOptions, RecursiveWatcherProvider } from './parcel-watcher/parcel-watcher.js';
22
+
23
+ /** Routes each request to the first provider that can handle it. The provider picks the watcher that serves it. */
24
+ export class FileSystemWatcherServiceImpl implements FileSystemWatcherService {
25
+
26
+ protected client: FileSystemWatcherServiceClient | undefined;
27
+
28
+ protected watcherId = 0;
29
+
30
+ protected readonly logger: WatcherLogger;
31
+
32
+ /** Checked in order. The first one whose `canHandle` returns `true` serves the request. */
33
+ protected readonly providers: readonly WatcherProvider[];
34
+
35
+ /**
36
+ * `this.client` is undefined until someone sets it.
37
+ */
38
+ protected readonly maybeClient: FileSystemWatcherServiceClient = {
39
+ onDidFilesChanged: event => this.client?.onDidFilesChanged(event),
40
+ onError: event => this.client?.onError(event),
41
+ };
42
+
43
+ constructor(options?: Partial<ParcelFileSystemWatcherServerOptions>) {
44
+ const resolved: ParcelFileSystemWatcherServerOptions = {
45
+ parcelOptions: {},
46
+ verbose: false,
47
+ info: (message, ...args) => console.info(message, ...args),
48
+ error: (message, ...args) => console.error(message, ...args),
49
+ ...options
50
+ };
51
+ this.logger = resolved;
52
+ this.providers = this.createProviders(resolved);
53
+ }
54
+
55
+ setClient(client: FileSystemWatcherServiceClient | undefined): void {
56
+ this.client = client;
57
+ }
58
+
59
+ /** Requests resolving to the same target share a watcher. */
60
+ async watchFileChanges(clientId: number, uri: string, options?: WatchOptions): Promise<number> {
61
+ const resolvedOptions = this.resolveWatchOptions(options);
62
+ const provider = this.providerFor(resolvedOptions);
63
+ const watcherId = this.watcherId++;
64
+ await provider.watch(watcherId, { clientId, path: FileUri.fsPath(uri), ignored: resolvedOptions.ignored });
65
+ return watcherId;
66
+ }
67
+
68
+ async unwatchFileChanges(watcherId: number): Promise<void> {
69
+ if (!this.providers.some(provider => provider.unwatch(watcherId))) {
70
+ console.warn(`tried to de-allocate a disposed watcher: watcherId=${watcherId}`);
71
+ }
72
+ }
73
+
74
+ /** `options` keeps the parcel shape that adopters already bind. Only the recursive provider reads `parcelOptions`. */
75
+ protected createProviders(options: ParcelFileSystemWatcherServerOptions): WatcherProvider[] {
76
+ return [
77
+ new RecursiveWatcherProvider(options, this.maybeClient),
78
+ new DirectoryWatcherProvider(options, this.maybeClient)
79
+ ];
80
+ }
81
+
82
+ protected providerFor(options: ResolvedWatchOptions): WatcherProvider {
83
+ const provider = this.providers.find(candidate => candidate.canHandle(options));
84
+ if (!provider) {
85
+ throw new Error(`No watcher provider takes options: ${JSON.stringify(options)}`);
86
+ }
87
+ return provider;
88
+ }
89
+
90
+ /**
91
+ * Return fully qualified options. Watchers created before `recursive` existed were always recursive.
92
+ */
93
+ protected resolveWatchOptions(options?: WatchOptions): ResolvedWatchOptions {
94
+ return {
95
+ ignored: options?.ignored ?? [],
96
+ recursive: options?.recursive ?? true
97
+ };
98
+ }
99
+
100
+ protected debug(message: string, ...params: unknown[]): void {
101
+ if (this.logger.verbose) {
102
+ this.logger.info(message, ...params);
103
+ }
104
+ }
105
+
106
+ dispose(): void {
107
+ // Singletons shouldn't be disposed...
108
+ }
109
+ }