@hydranium/core 1.0.0-next.35 → 1.0.0-next.350

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 (779) hide show
  1. package/README.md +78 -82
  2. package/lib/browser/host-heads-in-worker.d.ts +77 -0
  3. package/lib/browser/host-heads-in-worker.d.ts.map +1 -0
  4. package/lib/browser/host-heads-in-worker.js +169 -0
  5. package/lib/browser/host-heads-in-worker.js.map +1 -0
  6. package/lib/browser/index.d.ts +12 -0
  7. package/lib/browser/index.d.ts.map +1 -0
  8. package/lib/browser/index.js +17 -0
  9. package/lib/browser/index.js.map +1 -0
  10. package/lib/browser/indexeddb-file-system-store.d.ts +82 -0
  11. package/lib/browser/indexeddb-file-system-store.d.ts.map +1 -0
  12. package/lib/browser/indexeddb-file-system-store.js +181 -0
  13. package/lib/browser/indexeddb-file-system-store.js.map +1 -0
  14. package/lib/browser/start-language-server-in-worker.d.ts +32 -0
  15. package/lib/browser/start-language-server-in-worker.d.ts.map +1 -0
  16. package/lib/browser/start-language-server-in-worker.js +40 -0
  17. package/lib/browser/start-language-server-in-worker.js.map +1 -0
  18. package/lib/documents/ast-document-manager.d.ts +266 -124
  19. package/lib/documents/ast-document-manager.d.ts.map +1 -1
  20. package/lib/documents/ast-document-manager.js +293 -132
  21. package/lib/documents/ast-document-manager.js.map +1 -1
  22. package/lib/documents/client-ids.d.ts +5 -19
  23. package/lib/documents/client-ids.d.ts.map +1 -1
  24. package/lib/documents/client-ids.js +5 -19
  25. package/lib/documents/client-ids.js.map +1 -1
  26. package/lib/documents/client-session-errors.d.ts +15 -0
  27. package/lib/documents/client-session-errors.d.ts.map +1 -0
  28. package/lib/documents/client-session-errors.js +15 -0
  29. package/lib/documents/client-session-errors.js.map +1 -0
  30. package/lib/documents/client-session-registry.d.ts +146 -0
  31. package/lib/documents/client-session-registry.d.ts.map +1 -0
  32. package/lib/documents/client-session-registry.js +207 -0
  33. package/lib/documents/client-session-registry.js.map +1 -0
  34. package/lib/documents/dirty-state-tracker.d.ts +101 -0
  35. package/lib/documents/dirty-state-tracker.d.ts.map +1 -0
  36. package/lib/documents/dirty-state-tracker.js +85 -0
  37. package/lib/documents/dirty-state-tracker.js.map +1 -0
  38. package/lib/documents/document-release-handler.d.ts +204 -0
  39. package/lib/documents/document-release-handler.d.ts.map +1 -0
  40. package/lib/documents/document-release-handler.js +317 -0
  41. package/lib/documents/document-release-handler.js.map +1 -0
  42. package/lib/documents/document-release-scheduler.d.ts +67 -0
  43. package/lib/documents/document-release-scheduler.d.ts.map +1 -0
  44. package/lib/documents/document-release-scheduler.js +80 -0
  45. package/lib/documents/document-release-scheduler.js.map +1 -0
  46. package/lib/documents/file-system-task-queue.d.ts +52 -0
  47. package/lib/documents/file-system-task-queue.d.ts.map +1 -0
  48. package/lib/documents/file-system-task-queue.js +37 -0
  49. package/lib/documents/file-system-task-queue.js.map +1 -0
  50. package/lib/documents/hydranium-text-documents.d.ts +445 -282
  51. package/lib/documents/hydranium-text-documents.d.ts.map +1 -1
  52. package/lib/documents/hydranium-text-documents.js +903 -483
  53. package/lib/documents/hydranium-text-documents.js.map +1 -1
  54. package/lib/documents/index.d.ts +10 -2
  55. package/lib/documents/index.d.ts.map +1 -1
  56. package/lib/documents/index.js +10 -2
  57. package/lib/documents/index.js.map +1 -1
  58. package/lib/documents/language-client-shadow.d.ts +234 -0
  59. package/lib/documents/language-client-shadow.d.ts.map +1 -0
  60. package/lib/documents/language-client-shadow.js +306 -0
  61. package/lib/documents/language-client-shadow.js.map +1 -0
  62. package/lib/documents/model-ledger.d.ts +47 -0
  63. package/lib/documents/model-ledger.d.ts.map +1 -0
  64. package/lib/documents/model-ledger.js +30 -0
  65. package/lib/documents/model-ledger.js.map +1 -0
  66. package/lib/documents/text-ledger.d.ts +64 -0
  67. package/lib/documents/text-ledger.d.ts.map +1 -0
  68. package/lib/documents/text-ledger.js +63 -0
  69. package/lib/documents/text-ledger.js.map +1 -0
  70. package/lib/documents/version-sync-service.d.ts +138 -0
  71. package/lib/documents/version-sync-service.d.ts.map +1 -0
  72. package/lib/documents/version-sync-service.js +173 -0
  73. package/lib/documents/version-sync-service.js.map +1 -0
  74. package/lib/index.d.ts +4 -0
  75. package/lib/index.d.ts.map +1 -1
  76. package/lib/index.js +7 -0
  77. package/lib/index.js.map +1 -1
  78. package/lib/langium/ast-extension/ast-extension-service.d.ts +42 -31
  79. package/lib/langium/ast-extension/ast-extension-service.d.ts.map +1 -1
  80. package/lib/langium/ast-extension/ast-extension-service.js +45 -19
  81. package/lib/langium/ast-extension/ast-extension-service.js.map +1 -1
  82. package/lib/langium/ast-extension/ast-node-builder.d.ts +12 -7
  83. package/lib/langium/ast-extension/ast-node-builder.d.ts.map +1 -1
  84. package/lib/langium/ast-extension/ast-node-builder.js +25 -9
  85. package/lib/langium/ast-extension/ast-node-builder.js.map +1 -1
  86. package/lib/langium/bootstrap.d.ts +49 -36
  87. package/lib/langium/bootstrap.d.ts.map +1 -1
  88. package/lib/langium/bootstrap.js +83 -44
  89. package/lib/langium/bootstrap.js.map +1 -1
  90. package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts +9 -9
  91. package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts.map +1 -1
  92. package/lib/langium/build-phase-pass/build-phase-pass-service.js +25 -16
  93. package/lib/langium/build-phase-pass/build-phase-pass-service.js.map +1 -1
  94. package/lib/langium/build-phase-pass/build-phase-pass.d.ts +20 -8
  95. package/lib/langium/build-phase-pass/build-phase-pass.d.ts.map +1 -1
  96. package/lib/langium/build-phase-pass/build-phase-pass.js +20 -0
  97. package/lib/langium/build-phase-pass/build-phase-pass.js.map +1 -1
  98. package/lib/langium/composite-ast-reflection.d.ts +46 -0
  99. package/lib/langium/composite-ast-reflection.d.ts.map +1 -0
  100. package/lib/langium/composite-ast-reflection.js +97 -0
  101. package/lib/langium/composite-ast-reflection.js.map +1 -0
  102. package/lib/langium/config/configuration-provider.d.ts +81 -0
  103. package/lib/langium/config/configuration-provider.d.ts.map +1 -0
  104. package/lib/langium/config/configuration-provider.js +112 -0
  105. package/lib/langium/config/configuration-provider.js.map +1 -0
  106. package/lib/langium/config/index.d.ts +1 -0
  107. package/lib/langium/config/index.d.ts.map +1 -1
  108. package/lib/langium/config/index.js +1 -0
  109. package/lib/langium/config/index.js.map +1 -1
  110. package/lib/langium/config/settings.js.map +1 -1
  111. package/lib/langium/diagnostics/console-tee.d.ts +27 -0
  112. package/lib/langium/diagnostics/console-tee.d.ts.map +1 -0
  113. package/lib/langium/diagnostics/console-tee.js +142 -0
  114. package/lib/langium/diagnostics/console-tee.js.map +1 -0
  115. package/lib/langium/diagnostics/format-log-arg.d.ts +18 -0
  116. package/lib/langium/diagnostics/format-log-arg.d.ts.map +1 -0
  117. package/lib/langium/diagnostics/format-log-arg.js +36 -0
  118. package/lib/langium/diagnostics/format-log-arg.js.map +1 -0
  119. package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts +9 -20
  120. package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts.map +1 -1
  121. package/lib/langium/diagnostics/hydranium-langium-profiler.js +15 -24
  122. package/lib/langium/diagnostics/hydranium-langium-profiler.js.map +1 -1
  123. package/lib/langium/diagnostics/log-preamble.js +1 -1
  124. package/lib/langium/diagnostics/log-preamble.js.map +1 -1
  125. package/lib/langium/diagnostics/logger.d.ts +25 -6
  126. package/lib/langium/diagnostics/logger.d.ts.map +1 -1
  127. package/lib/langium/diagnostics/logger.js +49 -17
  128. package/lib/langium/diagnostics/logger.js.map +1 -1
  129. package/lib/langium/diagnostics/lsp-logger.d.ts +25 -0
  130. package/lib/langium/diagnostics/lsp-logger.d.ts.map +1 -1
  131. package/lib/langium/diagnostics/lsp-logger.js +81 -45
  132. package/lib/langium/diagnostics/lsp-logger.js.map +1 -1
  133. package/lib/langium/diagnostics/server-tracer.d.ts.map +1 -1
  134. package/lib/langium/diagnostics/server-tracer.js.map +1 -1
  135. package/lib/langium/document-builder/build-pipeline-integration.d.ts +21 -1
  136. package/lib/langium/document-builder/build-pipeline-integration.d.ts.map +1 -1
  137. package/lib/langium/document-builder/build-pipeline-integration.js +28 -30
  138. package/lib/langium/document-builder/build-pipeline-integration.js.map +1 -1
  139. package/lib/langium/document-builder/build-session.d.ts +6 -5
  140. package/lib/langium/document-builder/build-session.d.ts.map +1 -1
  141. package/lib/langium/document-builder/build-session.js +5 -5
  142. package/lib/langium/document-builder/build-session.js.map +1 -1
  143. package/lib/langium/document-builder/document-builder.d.ts +310 -41
  144. package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
  145. package/lib/langium/document-builder/document-builder.js +490 -79
  146. package/lib/langium/document-builder/document-builder.js.map +1 -1
  147. package/lib/langium/documentation/comment-provider.d.ts.map +1 -1
  148. package/lib/langium/documentation/comment-provider.js.map +1 -1
  149. package/lib/langium/integration-services.d.ts +40 -24
  150. package/lib/langium/integration-services.d.ts.map +1 -1
  151. package/lib/langium/integration-services.js +7 -4
  152. package/lib/langium/integration-services.js.map +1 -1
  153. package/lib/langium/integrity/integrity-rule.d.ts +17 -8
  154. package/lib/langium/integrity/integrity-rule.d.ts.map +1 -1
  155. package/lib/langium/integrity/integrity-rule.js.map +1 -1
  156. package/lib/langium/integrity/integrity-service.d.ts +95 -27
  157. package/lib/langium/integrity/integrity-service.d.ts.map +1 -1
  158. package/lib/langium/integrity/integrity-service.js +303 -63
  159. package/lib/langium/integrity/integrity-service.js.map +1 -1
  160. package/lib/langium/keys/name-based-key-provider.d.ts.map +1 -1
  161. package/lib/langium/keys/name-based-key-provider.js.map +1 -1
  162. package/lib/langium/keys/positional-key-provider.d.ts.map +1 -1
  163. package/lib/langium/keys/positional-key-provider.js.map +1 -1
  164. package/lib/langium/labeling/label-provider.d.ts.map +1 -1
  165. package/lib/langium/labeling/label-provider.js.map +1 -1
  166. package/lib/langium/language-module.d.ts +30 -5
  167. package/lib/langium/language-module.d.ts.map +1 -1
  168. package/lib/langium/language-module.js +18 -4
  169. package/lib/langium/language-module.js.map +1 -1
  170. package/lib/langium/model-service/client-session.d.ts +383 -0
  171. package/lib/langium/model-service/client-session.d.ts.map +1 -0
  172. package/lib/langium/model-service/client-session.js +455 -0
  173. package/lib/langium/model-service/client-session.js.map +1 -0
  174. package/lib/langium/model-service/index.d.ts +2 -0
  175. package/lib/langium/model-service/index.d.ts.map +1 -1
  176. package/lib/langium/model-service/index.js +2 -0
  177. package/lib/langium/model-service/index.js.map +1 -1
  178. package/lib/langium/model-service/model-events.d.ts +66 -0
  179. package/lib/langium/model-service/model-events.d.ts.map +1 -0
  180. package/lib/langium/model-service/model-events.js +10 -0
  181. package/lib/langium/model-service/model-events.js.map +1 -0
  182. package/lib/langium/model-service/model-service.d.ts +456 -300
  183. package/lib/langium/model-service/model-service.d.ts.map +1 -1
  184. package/lib/langium/model-service/model-service.js +571 -466
  185. package/lib/langium/model-service/model-service.js.map +1 -1
  186. package/lib/langium/module.d.ts +141 -40
  187. package/lib/langium/module.d.ts.map +1 -1
  188. package/lib/langium/module.js +52 -40
  189. package/lib/langium/module.js.map +1 -1
  190. package/lib/langium/naming/name-provider.d.ts +32 -7
  191. package/lib/langium/naming/name-provider.d.ts.map +1 -1
  192. package/lib/langium/naming/name-provider.js +10 -4
  193. package/lib/langium/naming/name-provider.js.map +1 -1
  194. package/lib/langium/naming/name-separator-validation.d.ts.map +1 -1
  195. package/lib/langium/project/abstract-project-manager.d.ts.map +1 -1
  196. package/lib/langium/project/abstract-project-manager.js +13 -6
  197. package/lib/langium/project/abstract-project-manager.js.map +1 -1
  198. package/lib/langium/project/project-change-event.d.ts +2 -2
  199. package/lib/langium/project/single-project-manager.d.ts.map +1 -1
  200. package/lib/langium/project/single-project-manager.js.map +1 -1
  201. package/lib/langium/residency/cst-residency-service.d.ts +38 -14
  202. package/lib/langium/residency/cst-residency-service.d.ts.map +1 -1
  203. package/lib/langium/residency/cst-residency-service.js +24 -58
  204. package/lib/langium/residency/cst-residency-service.js.map +1 -1
  205. package/lib/langium/scope/ast-node-description-provider.d.ts.map +1 -1
  206. package/lib/langium/scope/ast-node-description-provider.js.map +1 -1
  207. package/lib/langium/scope/fallback-scope.d.ts +27 -0
  208. package/lib/langium/scope/fallback-scope.d.ts.map +1 -0
  209. package/lib/langium/scope/fallback-scope.js +35 -0
  210. package/lib/langium/scope/fallback-scope.js.map +1 -0
  211. package/lib/langium/scope/hydranium-scope-computation.d.ts +21 -18
  212. package/lib/langium/scope/hydranium-scope-computation.d.ts.map +1 -1
  213. package/lib/langium/scope/hydranium-scope-computation.js +38 -39
  214. package/lib/langium/scope/hydranium-scope-computation.js.map +1 -1
  215. package/lib/langium/scope/hydranium-scope-provider.d.ts +115 -32
  216. package/lib/langium/scope/hydranium-scope-provider.d.ts.map +1 -1
  217. package/lib/langium/scope/hydranium-scope-provider.js +201 -39
  218. package/lib/langium/scope/hydranium-scope-provider.js.map +1 -1
  219. package/lib/langium/scope/index.d.ts +1 -0
  220. package/lib/langium/scope/index.d.ts.map +1 -1
  221. package/lib/langium/scope/index.js +1 -0
  222. package/lib/langium/scope/index.js.map +1 -1
  223. package/lib/langium/scope/reference-builder.d.ts.map +1 -1
  224. package/lib/langium/scope/reference-builder.js.map +1 -1
  225. package/lib/langium/scope/reference-candidate-provider.d.ts +6 -5
  226. package/lib/langium/scope/reference-candidate-provider.d.ts.map +1 -1
  227. package/lib/langium/scope/reference-candidate-provider.js +3 -2
  228. package/lib/langium/scope/reference-candidate-provider.js.map +1 -1
  229. package/lib/langium/scope/scope-extension-service.d.ts +69 -37
  230. package/lib/langium/scope/scope-extension-service.d.ts.map +1 -1
  231. package/lib/langium/scope/scope-extension-service.js +102 -29
  232. package/lib/langium/scope/scope-extension-service.js.map +1 -1
  233. package/lib/langium/scope/scoped-ast-node-description.d.ts +1 -3
  234. package/lib/langium/scope/scoped-ast-node-description.d.ts.map +1 -1
  235. package/lib/langium/scope/scoped-ast-node-description.js +1 -3
  236. package/lib/langium/scope/scoped-ast-node-description.js.map +1 -1
  237. package/lib/langium/serialization/abstract-serializer.d.ts +38 -27
  238. package/lib/langium/serialization/abstract-serializer.d.ts.map +1 -1
  239. package/lib/langium/serialization/abstract-serializer.js +54 -30
  240. package/lib/langium/serialization/abstract-serializer.js.map +1 -1
  241. package/lib/langium/serialization/json-serializer.d.ts +8 -1
  242. package/lib/langium/serialization/json-serializer.d.ts.map +1 -1
  243. package/lib/langium/serialization/json-serializer.js +13 -3
  244. package/lib/langium/serialization/json-serializer.js.map +1 -1
  245. package/lib/langium/serialization/serializer.d.ts +1 -1
  246. package/lib/langium/serialization/yaml-serializer.d.ts +12 -0
  247. package/lib/langium/serialization/yaml-serializer.d.ts.map +1 -1
  248. package/lib/langium/serialization/yaml-serializer.js +24 -4
  249. package/lib/langium/serialization/yaml-serializer.js.map +1 -1
  250. package/lib/langium/service-registry.d.ts +29 -1
  251. package/lib/langium/service-registry.d.ts.map +1 -1
  252. package/lib/langium/service-registry.js +37 -0
  253. package/lib/langium/service-registry.js.map +1 -1
  254. package/lib/langium/shared-services.d.ts +13 -7
  255. package/lib/langium/shared-services.d.ts.map +1 -1
  256. package/lib/langium/shared-services.js.map +1 -1
  257. package/lib/langium/single-langium-copy.d.ts +22 -0
  258. package/lib/langium/single-langium-copy.d.ts.map +1 -0
  259. package/lib/langium/single-langium-copy.js +36 -0
  260. package/lib/langium/single-langium-copy.js.map +1 -0
  261. package/lib/langium/transfer/transfer-encoder.d.ts +86 -37
  262. package/lib/langium/transfer/transfer-encoder.d.ts.map +1 -1
  263. package/lib/langium/transfer/transfer-encoder.js +36 -25
  264. package/lib/langium/transfer/transfer-encoder.js.map +1 -1
  265. package/lib/langium/trivia/comment-preserver.d.ts +543 -0
  266. package/lib/langium/trivia/comment-preserver.d.ts.map +1 -0
  267. package/lib/langium/trivia/comment-preserver.js +1164 -0
  268. package/lib/langium/trivia/comment-preserver.js.map +1 -0
  269. package/lib/langium/trivia/document-ending-preserver.d.ts +51 -0
  270. package/lib/langium/trivia/document-ending-preserver.d.ts.map +1 -0
  271. package/lib/langium/trivia/document-ending-preserver.js +62 -0
  272. package/lib/langium/trivia/document-ending-preserver.js.map +1 -0
  273. package/lib/langium/trivia/index.d.ts +14 -0
  274. package/lib/langium/trivia/index.d.ts.map +1 -0
  275. package/lib/langium/trivia/index.js +14 -0
  276. package/lib/langium/trivia/index.js.map +1 -0
  277. package/lib/langium/trivia/trivia-contribution.d.ts +37 -0
  278. package/lib/langium/trivia/trivia-contribution.d.ts.map +1 -0
  279. package/lib/langium/trivia/trivia-contribution.js +10 -0
  280. package/lib/langium/trivia/trivia-contribution.js.map +1 -0
  281. package/lib/langium/trivia/trivia-preserver.d.ts +52 -0
  282. package/lib/langium/trivia/trivia-preserver.d.ts.map +1 -0
  283. package/lib/langium/trivia/trivia-preserver.js +10 -0
  284. package/lib/langium/trivia/trivia-preserver.js.map +1 -0
  285. package/lib/langium/trivia/trivia-service.d.ts +70 -0
  286. package/lib/langium/trivia/trivia-service.d.ts.map +1 -0
  287. package/lib/langium/trivia/trivia-service.js +56 -0
  288. package/lib/langium/trivia/trivia-service.js.map +1 -0
  289. package/lib/langium/update-rewrite/normalize-empty-strings.d.ts.map +1 -1
  290. package/lib/langium/update-rewrite/update-rewrite-service.d.ts +1 -1
  291. package/lib/langium/update-rewrite/update-rewrite-service.d.ts.map +1 -1
  292. package/lib/langium/update-rewrite/update-rewrite-service.js.map +1 -1
  293. package/lib/langium/update-rewrite/update-rewrite.d.ts +1 -1
  294. package/lib/langium/validation/document-validator.d.ts +168 -23
  295. package/lib/langium/validation/document-validator.d.ts.map +1 -1
  296. package/lib/langium/validation/document-validator.js +264 -26
  297. package/lib/langium/validation/document-validator.js.map +1 -1
  298. package/lib/langium/validation/validation-contribution-collector.d.ts +9 -1
  299. package/lib/langium/validation/validation-contribution-collector.d.ts.map +1 -1
  300. package/lib/langium/validation/validation-contribution-collector.js +1 -1
  301. package/lib/langium/validation/validation-contribution-collector.js.map +1 -1
  302. package/lib/langium/workspace/document-uri-policy.d.ts +24 -15
  303. package/lib/langium/workspace/document-uri-policy.d.ts.map +1 -1
  304. package/lib/langium/workspace/document-uri-policy.js +22 -13
  305. package/lib/langium/workspace/document-uri-policy.js.map +1 -1
  306. package/lib/langium/workspace/file-not-found.d.ts +23 -0
  307. package/lib/langium/workspace/file-not-found.d.ts.map +1 -0
  308. package/lib/langium/workspace/file-not-found.js +31 -0
  309. package/lib/langium/workspace/file-not-found.js.map +1 -0
  310. package/lib/langium/workspace/file-system-provider.d.ts +167 -8
  311. package/lib/langium/workspace/file-system-provider.d.ts.map +1 -1
  312. package/lib/langium/workspace/file-system-provider.js +115 -13
  313. package/lib/langium/workspace/file-system-provider.js.map +1 -1
  314. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts +31 -1
  315. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts.map +1 -1
  316. package/lib/langium/workspace/hydranium-langium-document-factory.js +54 -0
  317. package/lib/langium/workspace/hydranium-langium-document-factory.js.map +1 -1
  318. package/lib/langium/workspace/hydranium-workspace-lock.d.ts +43 -1
  319. package/lib/langium/workspace/hydranium-workspace-lock.d.ts.map +1 -1
  320. package/lib/langium/workspace/hydranium-workspace-lock.js +58 -1
  321. package/lib/langium/workspace/hydranium-workspace-lock.js.map +1 -1
  322. package/lib/langium/workspace/hydranium-workspace-manager.d.ts +103 -21
  323. package/lib/langium/workspace/hydranium-workspace-manager.d.ts.map +1 -1
  324. package/lib/langium/workspace/hydranium-workspace-manager.js +184 -31
  325. package/lib/langium/workspace/hydranium-workspace-manager.js.map +1 -1
  326. package/lib/langium/workspace/in-memory-file-system-provider.d.ts +26 -9
  327. package/lib/langium/workspace/in-memory-file-system-provider.d.ts.map +1 -1
  328. package/lib/langium/workspace/in-memory-file-system-provider.js +45 -22
  329. package/lib/langium/workspace/in-memory-file-system-provider.js.map +1 -1
  330. package/lib/langium/workspace/index-manager.d.ts.map +1 -1
  331. package/lib/langium/workspace/index-manager.js.map +1 -1
  332. package/lib/langium/workspace/index.d.ts +1 -0
  333. package/lib/langium/workspace/index.d.ts.map +1 -1
  334. package/lib/langium/workspace/index.js +1 -0
  335. package/lib/langium/workspace/index.js.map +1 -1
  336. package/lib/langium/workspace/initialize-workspace.d.ts +40 -3
  337. package/lib/langium/workspace/initialize-workspace.d.ts.map +1 -1
  338. package/lib/langium/workspace/initialize-workspace.js +68 -3
  339. package/lib/langium/workspace/initialize-workspace.js.map +1 -1
  340. package/lib/langium/workspace/langium-documents.d.ts +7 -0
  341. package/lib/langium/workspace/langium-documents.d.ts.map +1 -1
  342. package/lib/langium/workspace/langium-documents.js +18 -1
  343. package/lib/langium/workspace/langium-documents.js.map +1 -1
  344. package/lib/langium/workspace/persistent-file-system-provider.d.ts +16 -10
  345. package/lib/langium/workspace/persistent-file-system-provider.d.ts.map +1 -1
  346. package/lib/langium/workspace/persistent-file-system-provider.js +25 -13
  347. package/lib/langium/workspace/persistent-file-system-provider.js.map +1 -1
  348. package/lib/langium/workspace/self-save-registry.d.ts +84 -0
  349. package/lib/langium/workspace/self-save-registry.d.ts.map +1 -0
  350. package/lib/{documents → langium/workspace}/self-save-registry.js +33 -22
  351. package/lib/langium/workspace/self-save-registry.js.map +1 -0
  352. package/lib/langium/workspace/virtual-document.d.ts +55 -21
  353. package/lib/langium/workspace/virtual-document.d.ts.map +1 -1
  354. package/lib/langium/workspace/virtual-document.js +87 -24
  355. package/lib/langium/workspace/virtual-document.js.map +1 -1
  356. package/lib/langium/workspace/write-lock-scope.d.ts +22 -10
  357. package/lib/langium/workspace/write-lock-scope.d.ts.map +1 -1
  358. package/lib/langium/workspace/write-lock-scope.js +15 -5
  359. package/lib/langium/workspace/write-lock-scope.js.map +1 -1
  360. package/lib/launcher/integrated-server.d.ts +3 -1
  361. package/lib/launcher/integrated-server.d.ts.map +1 -1
  362. package/lib/locale/server-locale.d.ts +19 -5
  363. package/lib/locale/server-locale.d.ts.map +1 -1
  364. package/lib/locale/server-locale.js +1 -1
  365. package/lib/locale/server-locale.js.map +1 -1
  366. package/lib/lsp/completion/hydranium-completion-provider.d.ts +44 -2
  367. package/lib/lsp/completion/hydranium-completion-provider.d.ts.map +1 -1
  368. package/lib/lsp/completion/hydranium-completion-provider.js +68 -0
  369. package/lib/lsp/completion/hydranium-completion-provider.js.map +1 -1
  370. package/lib/lsp/connection-features.d.ts +23 -0
  371. package/lib/lsp/connection-features.d.ts.map +1 -0
  372. package/lib/lsp/connection-features.js +60 -0
  373. package/lib/lsp/connection-features.js.map +1 -0
  374. package/lib/lsp/diagnostics-connection.d.ts +27 -0
  375. package/lib/lsp/diagnostics-connection.d.ts.map +1 -0
  376. package/lib/lsp/diagnostics-connection.js +53 -0
  377. package/lib/lsp/diagnostics-connection.js.map +1 -0
  378. package/lib/lsp/edit-requests-guard.d.ts +31 -0
  379. package/lib/lsp/edit-requests-guard.d.ts.map +1 -0
  380. package/lib/lsp/edit-requests-guard.js +125 -0
  381. package/lib/lsp/edit-requests-guard.js.map +1 -0
  382. package/lib/lsp/hydranium-document-update-handler.d.ts +126 -82
  383. package/lib/lsp/hydranium-document-update-handler.d.ts.map +1 -1
  384. package/lib/lsp/hydranium-document-update-handler.js +235 -102
  385. package/lib/lsp/hydranium-document-update-handler.js.map +1 -1
  386. package/lib/lsp/index.d.ts +6 -2
  387. package/lib/lsp/index.d.ts.map +1 -1
  388. package/lib/lsp/index.js +6 -2
  389. package/lib/lsp/index.js.map +1 -1
  390. package/lib/lsp/lsp-latency.d.ts +39 -0
  391. package/lib/lsp/lsp-latency.d.ts.map +1 -0
  392. package/lib/lsp/lsp-latency.js +58 -0
  393. package/lib/lsp/lsp-latency.js.map +1 -0
  394. package/lib/lsp/save-text-document.d.ts +31 -0
  395. package/lib/lsp/save-text-document.d.ts.map +1 -0
  396. package/lib/lsp/save-text-document.js +52 -0
  397. package/lib/lsp/save-text-document.js.map +1 -0
  398. package/lib/lsp/semantic-token-provider.d.ts +58 -2
  399. package/lib/lsp/semantic-token-provider.d.ts.map +1 -1
  400. package/lib/lsp/semantic-token-provider.js +98 -9
  401. package/lib/lsp/semantic-token-provider.js.map +1 -1
  402. package/lib/lsp/shared-module.d.ts +4 -8
  403. package/lib/lsp/shared-module.d.ts.map +1 -1
  404. package/lib/lsp/shared-module.js.map +1 -1
  405. package/lib/lsp/start-language-server.d.ts +12 -7
  406. package/lib/lsp/start-language-server.d.ts.map +1 -1
  407. package/lib/lsp/start-language-server.js +21 -7
  408. package/lib/lsp/start-language-server.js.map +1 -1
  409. package/lib/messages/carriers.d.ts +4 -6
  410. package/lib/messages/carriers.d.ts.map +1 -1
  411. package/lib/messages/carriers.js +4 -6
  412. package/lib/messages/carriers.js.map +1 -1
  413. package/lib/messages/index.d.ts +2 -2
  414. package/lib/messages/index.d.ts.map +1 -1
  415. package/lib/messages/index.js +2 -2
  416. package/lib/messages/index.js.map +1 -1
  417. package/lib/messages/renderer.d.ts +32 -7
  418. package/lib/messages/renderer.d.ts.map +1 -1
  419. package/lib/messages/renderer.js +7 -1
  420. package/lib/messages/renderer.js.map +1 -1
  421. package/lib/node/event-loop-monitor.d.ts.map +1 -1
  422. package/lib/node/event-loop-monitor.js +2 -1
  423. package/lib/node/event-loop-monitor.js.map +1 -1
  424. package/lib/node/heap-ceiling.d.ts +61 -0
  425. package/lib/node/heap-ceiling.d.ts.map +1 -0
  426. package/lib/node/heap-ceiling.js +72 -0
  427. package/lib/node/heap-ceiling.js.map +1 -0
  428. package/lib/node/index.d.ts +1 -1
  429. package/lib/node/index.d.ts.map +1 -1
  430. package/lib/node/index.js +5 -1
  431. package/lib/node/index.js.map +1 -1
  432. package/lib/node/latency-from-env.d.ts +1 -1
  433. package/lib/node/latency-from-env.js +1 -1
  434. package/lib/node/lint-grammar.js.map +1 -1
  435. package/lib/node/log-file-sink.d.ts +3 -2
  436. package/lib/node/log-file-sink.d.ts.map +1 -1
  437. package/lib/node/log-file-sink.js +6 -2
  438. package/lib/node/log-file-sink.js.map +1 -1
  439. package/lib/node/log-preamble-node.d.ts +5 -3
  440. package/lib/node/log-preamble-node.d.ts.map +1 -1
  441. package/lib/node/log-preamble-node.js +13 -10
  442. package/lib/node/log-preamble-node.js.map +1 -1
  443. package/lib/node/measure-memory.d.ts.map +1 -1
  444. package/lib/node/measure-memory.js +5 -4
  445. package/lib/node/measure-memory.js.map +1 -1
  446. package/lib/node/memory-monitor.d.ts +2 -2
  447. package/lib/node/memory-monitor.d.ts.map +1 -1
  448. package/lib/node/memory-monitor.js +9 -10
  449. package/lib/node/memory-monitor.js.map +1 -1
  450. package/lib/node/node-file-system-provider.d.ts +67 -9
  451. package/lib/node/node-file-system-provider.d.ts.map +1 -1
  452. package/lib/node/node-file-system-provider.js +198 -53
  453. package/lib/node/node-file-system-provider.js.map +1 -1
  454. package/lib/node/profile-capture.d.ts +12 -4
  455. package/lib/node/profile-capture.d.ts.map +1 -1
  456. package/lib/node/profile-capture.js +8 -6
  457. package/lib/node/profile-capture.js.map +1 -1
  458. package/lib/node/profile-digest.js.map +1 -1
  459. package/lib/node/profiling-run.d.ts +13 -3
  460. package/lib/node/profiling-run.d.ts.map +1 -1
  461. package/lib/node/profiling-run.js +17 -8
  462. package/lib/node/profiling-run.js.map +1 -1
  463. package/lib/node/rename-over-open-readers.d.ts +61 -0
  464. package/lib/node/rename-over-open-readers.d.ts.map +1 -0
  465. package/lib/node/rename-over-open-readers.js +80 -0
  466. package/lib/node/rename-over-open-readers.js.map +1 -0
  467. package/lib/node/server-diagnostics.js +1 -1
  468. package/lib/node/server-diagnostics.js.map +1 -1
  469. package/lib/node/server-state-snapshot.js +4 -4
  470. package/lib/node/server-state-snapshot.js.map +1 -1
  471. package/lib/node/socket-launcher.d.ts +43 -7
  472. package/lib/node/socket-launcher.d.ts.map +1 -1
  473. package/lib/node/socket-launcher.js +42 -7
  474. package/lib/node/socket-launcher.js.map +1 -1
  475. package/lib/node/startup-cpu-profile.d.ts +29 -0
  476. package/lib/node/startup-cpu-profile.d.ts.map +1 -0
  477. package/lib/node/startup-cpu-profile.js +91 -0
  478. package/lib/node/startup-cpu-profile.js.map +1 -0
  479. package/lib/node/stdio-launcher.d.ts +13 -13
  480. package/lib/node/stdio-launcher.d.ts.map +1 -1
  481. package/lib/node/stdio-launcher.js +21 -11
  482. package/lib/node/stdio-launcher.js.map +1 -1
  483. package/lib/node/validate-workspace.d.ts +1 -1
  484. package/lib/node/validate-workspace.d.ts.map +1 -1
  485. package/lib/node/validate-workspace.js +5 -1
  486. package/lib/node/validate-workspace.js.map +1 -1
  487. package/lib/testing/document-uri-policy-conformance.js +1 -1
  488. package/lib/testing/document-uri-policy-conformance.js.map +1 -1
  489. package/lib/testing/fake-description.js.map +1 -1
  490. package/lib/testing/fake-document.d.ts +2 -1
  491. package/lib/testing/fake-document.d.ts.map +1 -1
  492. package/lib/testing/fake-document.js.map +1 -1
  493. package/lib/testing/index.d.ts +1 -1
  494. package/lib/testing/index.d.ts.map +1 -1
  495. package/lib/testing/index.js +2 -1
  496. package/lib/testing/index.js.map +1 -1
  497. package/lib/testing/langium-test-helpers.d.ts.map +1 -1
  498. package/lib/testing/langium-test-helpers.js +1 -0
  499. package/lib/testing/langium-test-helpers.js.map +1 -1
  500. package/lib/testing/make-noop-language-services.js.map +1 -1
  501. package/lib/testing/make-noop-shared-services.d.ts +4 -4
  502. package/lib/testing/make-noop-shared-services.d.ts.map +1 -1
  503. package/lib/testing/make-noop-shared-services.js +4 -4
  504. package/lib/testing/make-noop-shared-services.js.map +1 -1
  505. package/lib/testing/make-test-services.d.ts +51 -20
  506. package/lib/testing/make-test-services.d.ts.map +1 -1
  507. package/lib/testing/make-test-services.js +29 -13
  508. package/lib/testing/make-test-services.js.map +1 -1
  509. package/lib/testing/make-test-tracer.d.ts +12 -0
  510. package/lib/testing/make-test-tracer.d.ts.map +1 -1
  511. package/lib/testing/make-test-tracer.js +13 -0
  512. package/lib/testing/make-test-tracer.js.map +1 -1
  513. package/lib/testing/node/applied-edit-capture.d.ts +29 -0
  514. package/lib/testing/node/applied-edit-capture.d.ts.map +1 -0
  515. package/lib/testing/node/applied-edit-capture.js +117 -0
  516. package/lib/testing/node/applied-edit-capture.js.map +1 -0
  517. package/lib/testing/node/golden-corpus.js.map +1 -1
  518. package/lib/testing/node/index.d.ts +1 -0
  519. package/lib/testing/node/index.d.ts.map +1 -1
  520. package/lib/testing/node/index.js +1 -0
  521. package/lib/testing/node/index.js.map +1 -1
  522. package/lib/testing/node/lsp-harness.d.ts.map +1 -1
  523. package/lib/testing/node/lsp-harness.js +2 -0
  524. package/lib/testing/node/lsp-harness.js.map +1 -1
  525. package/lib/testing/node/lsp-server-connection.d.ts +21 -6
  526. package/lib/testing/node/lsp-server-connection.d.ts.map +1 -1
  527. package/lib/testing/node/lsp-server-connection.js +49 -106
  528. package/lib/testing/node/lsp-server-connection.js.map +1 -1
  529. package/lib/testing/node/scratch-workspace.d.ts.map +1 -1
  530. package/lib/testing/node/scratch-workspace.js +10 -5
  531. package/lib/testing/node/scratch-workspace.js.map +1 -1
  532. package/lib/testing/node/spawned-server.d.ts +30 -1
  533. package/lib/testing/node/spawned-server.d.ts.map +1 -1
  534. package/lib/testing/node/spawned-server.js +39 -2
  535. package/lib/testing/node/spawned-server.js.map +1 -1
  536. package/lib/testing/node/unhandled-rejections.d.ts +20 -0
  537. package/lib/testing/node/unhandled-rejections.d.ts.map +1 -0
  538. package/lib/testing/node/unhandled-rejections.js +32 -0
  539. package/lib/testing/node/unhandled-rejections.js.map +1 -0
  540. package/lib/testing/playwright/browser-capture-bridge.js.map +1 -1
  541. package/lib/testing/playwright/e2e-profiling.js.map +1 -1
  542. package/lib/testing/playwright/flaky-network-proxy.d.ts +76 -0
  543. package/lib/testing/playwright/flaky-network-proxy.d.ts.map +1 -0
  544. package/lib/testing/playwright/flaky-network-proxy.js +164 -0
  545. package/lib/testing/playwright/flaky-network-proxy.js.map +1 -0
  546. package/lib/testing/playwright/index.d.ts +1 -0
  547. package/lib/testing/playwright/index.d.ts.map +1 -1
  548. package/lib/testing/playwright/index.js +1 -0
  549. package/lib/testing/playwright/index.js.map +1 -1
  550. package/lib/testing/playwright/server-log-capture.d.ts +46 -16
  551. package/lib/testing/playwright/server-log-capture.d.ts.map +1 -1
  552. package/lib/testing/playwright/server-log-capture.js +111 -40
  553. package/lib/testing/playwright/server-log-capture.js.map +1 -1
  554. package/lib/testing/playwright/server-log-fixture.d.ts +16 -0
  555. package/lib/testing/playwright/server-log-fixture.d.ts.map +1 -1
  556. package/lib/testing/playwright/server-log-fixture.js +25 -6
  557. package/lib/testing/playwright/server-log-fixture.js.map +1 -1
  558. package/lib/testing/playwright/server-log-region.d.ts +15 -0
  559. package/lib/testing/playwright/server-log-region.d.ts.map +1 -0
  560. package/lib/testing/playwright/server-log-region.js +30 -0
  561. package/lib/testing/playwright/server-log-region.js.map +1 -0
  562. package/lib/testing/playwright/server-log-rename-reporter.d.ts.map +1 -1
  563. package/lib/testing/playwright/server-log-rename-reporter.js +4 -3
  564. package/lib/testing/playwright/server-log-rename-reporter.js.map +1 -1
  565. package/lib/testing/run-update-pipeline.d.ts +8 -5
  566. package/lib/testing/run-update-pipeline.d.ts.map +1 -1
  567. package/lib/testing/run-update-pipeline.js.map +1 -1
  568. package/lib/testing/stub-ast-document-manager.d.ts +11 -52
  569. package/lib/testing/stub-ast-document-manager.d.ts.map +1 -1
  570. package/lib/testing/stub-ast-document-manager.js +31 -62
  571. package/lib/testing/stub-ast-document-manager.js.map +1 -1
  572. package/lib/testing/stub-document-builder.d.ts +33 -11
  573. package/lib/testing/stub-document-builder.d.ts.map +1 -1
  574. package/lib/testing/stub-document-builder.js +103 -5
  575. package/lib/testing/stub-document-builder.js.map +1 -1
  576. package/lib/testing/stub-hydranium-text-documents.d.ts +33 -10
  577. package/lib/testing/stub-hydranium-text-documents.d.ts.map +1 -1
  578. package/lib/testing/stub-hydranium-text-documents.js +132 -16
  579. package/lib/testing/stub-hydranium-text-documents.js.map +1 -1
  580. package/lib/testing/stub-index-manager.js.map +1 -1
  581. package/lib/testing/stub-langium-documents.d.ts +3 -2
  582. package/lib/testing/stub-langium-documents.d.ts.map +1 -1
  583. package/lib/testing/stub-langium-documents.js.map +1 -1
  584. package/lib/testing/stub-model-service.d.ts +9 -8
  585. package/lib/testing/stub-model-service.d.ts.map +1 -1
  586. package/lib/testing/stub-model-service.js +6 -6
  587. package/lib/testing/stub-model-service.js.map +1 -1
  588. package/lib/testing/stub-project-manager.js.map +1 -1
  589. package/lib/testing/stub-self-save-registry.d.ts +1 -1
  590. package/lib/testing/stub-self-save-registry.d.ts.map +1 -1
  591. package/lib/testing/stub-service-registry.d.ts +1 -1
  592. package/lib/testing/stub-service-registry.js.map +1 -1
  593. package/lib/testing/stub-writable-file-system.d.ts +1 -1
  594. package/lib/testing/stub-writable-file-system.d.ts.map +1 -1
  595. package/lib/testing/stub-writable-file-system.js +2 -1
  596. package/lib/testing/stub-writable-file-system.js.map +1 -1
  597. package/lib/util/connection-liveness.d.ts +22 -6
  598. package/lib/util/connection-liveness.d.ts.map +1 -1
  599. package/lib/util/connection-liveness.js +74 -15
  600. package/lib/util/connection-liveness.js.map +1 -1
  601. package/lib/util/environment.d.ts +7 -0
  602. package/lib/util/environment.d.ts.map +1 -1
  603. package/lib/util/environment.js +15 -1
  604. package/lib/util/environment.js.map +1 -1
  605. package/lib/util/registry.d.ts.map +1 -1
  606. package/package.json +41 -60
  607. package/src/browser/host-heads-in-worker.ts +218 -0
  608. package/src/browser/index.ts +17 -0
  609. package/src/browser/indexeddb-file-system-store.ts +192 -0
  610. package/src/browser/start-language-server-in-worker.ts +56 -0
  611. package/src/documents/ast-document-manager.ts +479 -233
  612. package/src/documents/client-ids.ts +5 -22
  613. package/src/documents/client-session-errors.ts +24 -0
  614. package/src/documents/client-session-registry.ts +262 -0
  615. package/src/documents/dirty-state-tracker.ts +167 -0
  616. package/src/documents/document-release-handler.ts +404 -0
  617. package/src/documents/document-release-scheduler.ts +121 -0
  618. package/src/documents/file-system-task-queue.ts +74 -0
  619. package/src/documents/hydranium-text-documents.ts +1029 -595
  620. package/src/documents/index.ts +10 -2
  621. package/src/documents/language-client-shadow.ts +501 -0
  622. package/src/documents/model-ledger.ts +66 -0
  623. package/src/documents/text-ledger.ts +112 -0
  624. package/src/documents/version-sync-service.ts +275 -0
  625. package/src/index.ts +7 -0
  626. package/src/langium/ast-extension/ast-extension-service.ts +77 -41
  627. package/src/langium/ast-extension/ast-node-builder.ts +35 -13
  628. package/src/langium/bootstrap.ts +87 -51
  629. package/src/langium/build-phase-pass/build-phase-pass-service.ts +29 -19
  630. package/src/langium/build-phase-pass/build-phase-pass.ts +37 -8
  631. package/src/langium/composite-ast-reflection.ts +112 -0
  632. package/src/langium/config/configuration-provider.ts +119 -0
  633. package/src/langium/config/index.ts +1 -0
  634. package/src/langium/diagnostics/console-tee.ts +151 -0
  635. package/src/langium/diagnostics/format-log-arg.ts +36 -0
  636. package/src/langium/diagnostics/hydranium-langium-profiler.ts +15 -39
  637. package/src/langium/diagnostics/log-preamble.ts +1 -1
  638. package/src/langium/diagnostics/logger.ts +51 -17
  639. package/src/langium/diagnostics/lsp-logger.ts +83 -44
  640. package/src/langium/document-builder/build-pipeline-integration.ts +46 -32
  641. package/src/langium/document-builder/build-session.ts +4 -3
  642. package/src/langium/document-builder/document-builder.ts +615 -79
  643. package/src/langium/integration-services.ts +59 -28
  644. package/src/langium/integrity/integrity-rule.ts +17 -8
  645. package/src/langium/integrity/integrity-service.ts +332 -69
  646. package/src/langium/language-module.ts +49 -8
  647. package/src/langium/model-service/client-session.ts +726 -0
  648. package/src/langium/model-service/index.ts +2 -0
  649. package/src/langium/model-service/model-events.ts +80 -0
  650. package/src/langium/model-service/model-service.ts +878 -494
  651. package/src/langium/module.ts +195 -72
  652. package/src/langium/naming/name-provider.ts +34 -8
  653. package/src/langium/project/abstract-project-manager.ts +13 -5
  654. package/src/langium/project/project-change-event.ts +2 -2
  655. package/src/langium/residency/cst-residency-service.ts +54 -19
  656. package/src/langium/scope/fallback-scope.ts +38 -0
  657. package/src/langium/scope/hydranium-scope-computation.ts +45 -44
  658. package/src/langium/scope/hydranium-scope-provider.ts +228 -41
  659. package/src/langium/scope/index.ts +1 -0
  660. package/src/langium/scope/reference-candidate-provider.ts +6 -5
  661. package/src/langium/scope/scope-extension-service.ts +148 -56
  662. package/src/langium/scope/scoped-ast-node-description.ts +1 -3
  663. package/src/langium/serialization/abstract-serializer.ts +57 -41
  664. package/src/langium/serialization/json-serializer.ts +14 -3
  665. package/src/langium/serialization/serializer.ts +1 -1
  666. package/src/langium/serialization/yaml-serializer.ts +26 -4
  667. package/src/langium/service-registry.ts +41 -2
  668. package/src/langium/shared-services.ts +16 -7
  669. package/src/langium/single-langium-copy.ts +42 -0
  670. package/src/langium/transfer/transfer-encoder.ts +104 -47
  671. package/src/langium/trivia/comment-preserver.ts +1409 -0
  672. package/src/langium/trivia/document-ending-preserver.ts +71 -0
  673. package/src/langium/trivia/index.ts +14 -0
  674. package/src/langium/trivia/trivia-contribution.ts +39 -0
  675. package/src/langium/trivia/trivia-preserver.ts +56 -0
  676. package/src/langium/trivia/trivia-service.ts +99 -0
  677. package/src/langium/update-rewrite/update-rewrite-service.ts +1 -1
  678. package/src/langium/update-rewrite/update-rewrite.ts +1 -1
  679. package/src/langium/validation/document-validator.ts +312 -31
  680. package/src/langium/validation/validation-contribution-collector.ts +10 -1
  681. package/src/langium/workspace/document-uri-policy.ts +32 -18
  682. package/src/langium/workspace/file-not-found.ts +35 -0
  683. package/src/langium/workspace/file-system-provider.ts +258 -16
  684. package/src/langium/workspace/hydranium-langium-document-factory.ts +83 -0
  685. package/src/langium/workspace/hydranium-workspace-lock.ts +86 -2
  686. package/src/langium/workspace/hydranium-workspace-manager.ts +212 -35
  687. package/src/langium/workspace/in-memory-file-system-provider.ts +54 -23
  688. package/src/langium/workspace/index.ts +1 -0
  689. package/src/langium/workspace/initialize-workspace.ts +96 -4
  690. package/src/langium/workspace/langium-documents.ts +19 -1
  691. package/src/langium/workspace/persistent-file-system-provider.ts +27 -15
  692. package/src/langium/workspace/self-save-registry.ts +118 -0
  693. package/src/langium/workspace/virtual-document.ts +106 -25
  694. package/src/langium/workspace/write-lock-scope.ts +27 -12
  695. package/src/launcher/integrated-server.ts +3 -1
  696. package/src/locale/server-locale.ts +20 -5
  697. package/src/lsp/completion/hydranium-completion-provider.ts +82 -2
  698. package/src/lsp/connection-features.ts +67 -0
  699. package/src/lsp/diagnostics-connection.ts +56 -0
  700. package/src/lsp/edit-requests-guard.ts +152 -0
  701. package/src/lsp/hydranium-document-update-handler.ts +285 -111
  702. package/src/lsp/index.ts +6 -2
  703. package/src/lsp/lsp-latency.ts +62 -0
  704. package/src/lsp/save-text-document.ts +63 -0
  705. package/src/lsp/semantic-token-provider.ts +146 -8
  706. package/src/lsp/shared-module.ts +4 -8
  707. package/src/lsp/start-language-server.ts +21 -7
  708. package/src/messages/carriers.ts +4 -6
  709. package/src/messages/index.ts +11 -2
  710. package/src/messages/renderer.ts +34 -6
  711. package/src/node/event-loop-monitor.ts +2 -1
  712. package/src/node/heap-ceiling.ts +108 -0
  713. package/src/node/index.ts +5 -1
  714. package/src/node/latency-from-env.ts +1 -1
  715. package/src/node/log-file-sink.ts +6 -2
  716. package/src/node/log-preamble-node.ts +20 -10
  717. package/src/node/measure-memory.ts +5 -4
  718. package/src/node/memory-monitor.ts +10 -10
  719. package/src/node/node-file-system-provider.ts +214 -57
  720. package/src/node/profile-capture.ts +16 -15
  721. package/src/node/profiling-run.ts +30 -8
  722. package/src/node/rename-over-open-readers.ts +94 -0
  723. package/src/node/server-diagnostics.ts +1 -1
  724. package/src/node/server-state-snapshot.ts +5 -5
  725. package/src/node/socket-launcher.ts +78 -14
  726. package/src/node/startup-cpu-profile.ts +94 -0
  727. package/src/node/stdio-launcher.ts +29 -19
  728. package/src/node/validate-workspace.ts +8 -2
  729. package/src/testing/document-uri-policy-conformance.ts +1 -1
  730. package/src/testing/fake-document.ts +2 -1
  731. package/src/testing/index.ts +2 -1
  732. package/src/testing/langium-test-helpers.ts +1 -0
  733. package/src/testing/make-noop-shared-services.ts +6 -6
  734. package/src/testing/make-test-services.ts +93 -41
  735. package/src/testing/make-test-tracer.ts +26 -0
  736. package/src/testing/node/applied-edit-capture.ts +141 -0
  737. package/src/testing/node/index.ts +1 -0
  738. package/src/testing/node/lsp-harness.ts +2 -0
  739. package/src/testing/node/lsp-server-connection.ts +83 -119
  740. package/src/testing/node/scratch-workspace.ts +10 -5
  741. package/src/testing/node/spawned-server.ts +57 -3
  742. package/src/testing/node/unhandled-rejections.ts +31 -0
  743. package/src/testing/parse-semantic-root.ts +1 -1
  744. package/src/testing/playwright/flaky-network-proxy.ts +240 -0
  745. package/src/testing/playwright/index.ts +1 -0
  746. package/src/testing/playwright/server-log-capture.ts +137 -47
  747. package/src/testing/playwright/server-log-fixture.ts +46 -6
  748. package/src/testing/playwright/server-log-region.ts +32 -0
  749. package/src/testing/playwright/server-log-rename-reporter.ts +4 -3
  750. package/src/testing/run-update-pipeline.ts +8 -5
  751. package/src/testing/stub-ast-document-manager.ts +47 -128
  752. package/src/testing/stub-document-builder.ts +138 -18
  753. package/src/testing/stub-hydranium-text-documents.ts +184 -27
  754. package/src/testing/stub-langium-documents.ts +3 -2
  755. package/src/testing/stub-model-service.ts +11 -10
  756. package/src/testing/stub-self-save-registry.ts +1 -1
  757. package/src/testing/stub-service-registry.ts +1 -1
  758. package/src/testing/stub-writable-file-system.ts +3 -2
  759. package/src/util/connection-liveness.ts +80 -15
  760. package/src/util/environment.ts +24 -2
  761. package/lib/documents/language-client-text-shadow.d.ts +0 -101
  762. package/lib/documents/language-client-text-shadow.d.ts.map +0 -1
  763. package/lib/documents/language-client-text-shadow.js +0 -156
  764. package/lib/documents/language-client-text-shadow.js.map +0 -1
  765. package/lib/documents/self-save-registry.d.ts +0 -55
  766. package/lib/documents/self-save-registry.d.ts.map +0 -1
  767. package/lib/documents/self-save-registry.js.map +0 -1
  768. package/lib/lsp/instrument-connection.d.ts +0 -36
  769. package/lib/lsp/instrument-connection.d.ts.map +0 -1
  770. package/lib/lsp/instrument-connection.js +0 -62
  771. package/lib/lsp/instrument-connection.js.map +0 -1
  772. package/lib/node/process-memory.d.ts +0 -66
  773. package/lib/node/process-memory.d.ts.map +0 -1
  774. package/lib/node/process-memory.js +0 -252
  775. package/lib/node/process-memory.js.map +0 -1
  776. package/src/documents/language-client-text-shadow.ts +0 -175
  777. package/src/documents/self-save-registry.ts +0 -81
  778. package/src/lsp/instrument-connection.ts +0 -66
  779. package/src/node/process-memory.ts +0 -299
@@ -8,17 +8,17 @@
8
8
  ********************************************************************************/
9
9
 
10
10
  import { type Harness } from '@hydranium/protocol/testing';
11
- import { makeDuplexStreamPair } from '@hydranium/protocol/testing/node';
11
+ import { PassThrough, type TransformCallback } from 'node:stream';
12
12
  import { StreamMessageReader, StreamMessageWriter } from 'vscode-jsonrpc/node';
13
13
  import { type Connection, ProposedFeatures } from 'vscode-languageserver/node';
14
+ import { withHydraniumLspFeatures } from '../../lsp/connection-features.js';
15
+ import { captureAppliedEdits } from './applied-edit-capture.js';
14
16
  // The node `createConnection` from `vscode-languageserver/node` is built for a
15
17
  // standalone server PROCESS: it wires `process.exit()` onto the input stream's
16
18
  // `end`/`close` events, onto the `exit` notification (via its watchDog), and onto
17
- // a parent-pid liveness timer, and it calls `endProtocolConnection()` (a write)
18
- // on stream close. In-process every one of those is fatal — destroying the
19
- // streams at teardown trips the `close` handler, which writes into the destroyed
20
- // stream (an uncatchable synchronous `ERR_STREAM_DESTROYED`) and/or exits the host
21
- // test runner. The lower-level common `createConnection(connectionFactory,
19
+ // a parent-pid liveness timer. In-process every one of those is fatal —
20
+ // destroying the streams at teardown trips the `close` handler, which exits the
21
+ // host test runner. The lower-level common `createConnection(connectionFactory,
22
22
  // watchDog, features)` form does none of that: it lets us inject a no-op-`exit`
23
23
  // WatchDog and build the connection over the in-memory streams, so teardown is the
24
24
  // primitive's responsibility alone.
@@ -27,9 +27,9 @@ import { type Connection, ProposedFeatures } from 'vscode-languageserver/node';
27
27
  // package map the LSP 3.18 libs ship.)
28
28
  import { createConnection, type WatchDog } from 'vscode-languageserver';
29
29
  import {
30
- ApplyWorkspaceEditRequest,
31
30
  CompletionRequest,
32
31
  DidChangeTextDocumentNotification,
32
+ DidCloseTextDocumentNotification,
33
33
  DidOpenTextDocumentNotification,
34
34
  HoverRequest,
35
35
  InitializeRequest,
@@ -48,8 +48,7 @@ import {
48
48
  type Position,
49
49
  type ProtocolConnection,
50
50
  type PublishDiagnosticsParams,
51
- type SemanticTokens,
52
- type WorkspaceEdit
51
+ type SemanticTokens
53
52
  } from 'vscode-languageserver-protocol/node';
54
53
 
55
54
  /**
@@ -122,7 +121,7 @@ export interface NextAppliedEditOptions {
122
121
  * and needed for the same reason: one write can fan out to several pushes.
123
122
  */
124
123
  readonly fromIndex?: number;
125
- /** Reject after this long. Defaults to the in-process publish timeout. */
124
+ /** Reject after this long. Defaults to the harness's own timeout, which differs by tier. */
126
125
  readonly timeoutMs?: number;
127
126
  /**
128
127
  * Additional predicate the edit must satisfy. The framework coalesces
@@ -133,45 +132,9 @@ export interface NextAppliedEditOptions {
133
132
  readonly match?: (edit: AppliedEdit) => boolean;
134
133
  }
135
134
 
136
- /** Every URI a {@link WorkspaceEdit} addresses, in `documentChanges` then `changes` order. */
137
- function editedUris(edit: WorkspaceEdit): string[] {
138
- const uris: string[] = [];
139
- for (const change of edit.documentChanges ?? []) {
140
- if ('textDocument' in change) {
141
- uris.push(change.textDocument.uri);
142
- } else if ('oldUri' in change) {
143
- uris.push(change.oldUri, change.newUri);
144
- } else {
145
- uris.push(change.uri);
146
- }
147
- }
148
- uris.push(...Object.keys(edit.changes ?? {}));
149
- return uris;
150
- }
151
-
152
- /** Every text edit's `newText` in a {@link WorkspaceEdit}, concatenated in edit order. */
153
- function insertedText(edit: WorkspaceEdit): string {
154
- const parts: string[] = [];
155
- for (const change of edit.documentChanges ?? []) {
156
- if ('edits' in change) {
157
- for (const textEdit of change.edits) {
158
- if ('newText' in textEdit) {
159
- parts.push(textEdit.newText);
160
- }
161
- }
162
- }
163
- }
164
- for (const textEdits of Object.values(edit.changes ?? {})) {
165
- for (const textEdit of textEdits) {
166
- parts.push(textEdit.newText);
167
- }
168
- }
169
- return parts.join('');
170
- }
171
-
172
135
  /**
173
- * The in-process LSP transport seam — a real `Connection` over the in-memory
174
- * {@link makeDuplexStreamPair}, plus the client side, the diagnostics capture,
136
+ * The in-process LSP transport seam — a real `Connection` over a crossed pair
137
+ * of in-memory streams, plus the client side, the diagnostics capture,
175
138
  * and the typed request facades — with NO services attached. It is the lower
176
139
  * half of `makeLspHarness`, factored out so a caller can OWN the services
177
140
  * tree: build the tree around {@link serverConnection} (`createXxxServices({
@@ -192,7 +155,9 @@ export interface LspServerConnection extends Harness {
192
155
  * Seam: the server-side `Connection`, NOT yet attached to a server. The caller
193
156
  * composes the services tree onto it (`createXxxServices({ connection })`) and
194
157
  * calls `startLanguageServer(services.shared)`, which wires the LSP handlers
195
- * and calls `connection.listen()`.
158
+ * and calls `connection.listen()`; a caller recording only applied edits
159
+ * skips `startLanguageServer` but still calls `listen()`, as
160
+ * {@link makeLspServerConnection} says.
196
161
  */
197
162
  readonly serverConnection: Connection;
198
163
  /** Seam: the raw client connection over the in-memory wire; escape hatch for unwrapped requests. */
@@ -226,6 +191,12 @@ export interface LspServerConnection extends Harness {
226
191
  * unhandled method.
227
192
  */
228
193
  readonly appliedEdits: ReadonlyArray<AppliedEdit>;
194
+ /** Bytes written in each direction of the in-process JSON-RPC wire. */
195
+ readonly wireBytes: () => {
196
+ readonly clientToServer: number;
197
+ readonly serverToClient: number;
198
+ readonly total: number;
199
+ };
229
200
 
230
201
  /**
231
202
  * Drive the real LSP `initialize` → `initialized` handshake and return the
@@ -247,6 +218,8 @@ export interface LspServerConnection extends Harness {
247
218
  * associates with a language (silent no-diagnostics). `version` defaults to 1.
248
219
  */
249
220
  openDocument(uri: string, text: string, languageId: string, version?: number): void;
221
+ /** Send `textDocument/didClose` for a document opened through this harness. */
222
+ closeDocument(uri: string): Promise<void>;
250
223
  /** Send `textDocument/didChange` for `uri` as a single full-text replacement at `version`. */
251
224
  changeDocument(uri: string, text: string, version: number): void;
252
225
 
@@ -293,7 +266,7 @@ export interface LspServerConnection extends Harness {
293
266
  *
294
267
  * **An egress push is asynchronous well past the call that triggers it** —
295
268
  * the framework coalesces per URI and drives the sync from a build-phase
296
- * settle, so a `ModelService.update` resolves long before the push is sent.
269
+ * settle, so a session's `update` resolves long before the push is sent.
297
270
  * Record `appliedEdits.length`, drive the edit, then await this; reading the
298
271
  * capture on the line after the write proves nothing.
299
272
  */
@@ -308,8 +281,9 @@ export interface LspServerConnection extends Harness {
308
281
  *
309
282
  * Throwing from the handler surfaces to the server as an RPC failure, which
310
283
  * is the other branch (`applyEditToLanguageClient` invalidates and rethrows).
284
+ * A handler returning a promise holds the answer until it settles.
311
285
  */
312
- setApplyEditHandler(handler: (params: ApplyWorkspaceEditParams) => ApplyWorkspaceEditResult): void;
286
+ setApplyEditHandler(handler: (params: ApplyWorkspaceEditParams) => ApplyWorkspaceEditResult | Promise<ApplyWorkspaceEditResult>): void;
313
287
 
314
288
  /**
315
289
  * Release every resource: the diagnostics and applyEdit subscriptions, the
@@ -319,6 +293,39 @@ export interface LspServerConnection extends Harness {
319
293
  dispose(): void;
320
294
  }
321
295
 
296
+ /**
297
+ * A `PassThrough` that counts the bytes written through it. Counting here
298
+ * rather than in a `'data'` listener is what keeps the wire buffering: a
299
+ * listener switches the stream to flowing mode, and a message written before
300
+ * the server calls `listen()` is then delivered to the counter alone and lost.
301
+ */
302
+ class CountingPassThrough extends PassThrough {
303
+ bytes = 0;
304
+
305
+ override _transform(chunk: Buffer, _encoding: BufferEncoding, callback: TransformCallback): void {
306
+ this.bytes += chunk.length;
307
+ callback(null, chunk);
308
+ }
309
+ }
310
+
311
+ /** A crossed pair of {@link CountingPassThrough}s, disposed as one. */
312
+ function makeCountingStreamPair(): {
313
+ readonly clientToServer: CountingPassThrough;
314
+ readonly serverToClient: CountingPassThrough;
315
+ dispose(): void;
316
+ } {
317
+ const clientToServer = new CountingPassThrough();
318
+ const serverToClient = new CountingPassThrough();
319
+ return {
320
+ clientToServer,
321
+ serverToClient,
322
+ dispose(): void {
323
+ clientToServer.destroy();
324
+ serverToClient.destroy();
325
+ }
326
+ };
327
+ }
328
+
322
329
  /**
323
330
  * Build the in-process LSP transport seam (server `Connection` + client + wire +
324
331
  * diagnostics capture + typed facades) WITHOUT attaching a server. The caller
@@ -329,9 +336,13 @@ export interface LspServerConnection extends Harness {
329
336
  * (it owns the `createServices` callback + `startLanguageServer` + `buildWorkspace`);
330
337
  * use this primitive directly when the CALLER must own the tree — e.g. to attach
331
338
  * additional protocol heads (data-server, GLSP) onto the same `shared` services.
339
+ *
340
+ * To record only {@link LspServerConnection.appliedEdits}, skip
341
+ * `startLanguageServer`, call `serverConnection.listen()`, and open through
342
+ * `TextDocuments.notifyDidOpenTextDocument`.
332
343
  */
333
344
  export function makeLspServerConnection(): LspServerConnection {
334
- const pair = makeDuplexStreamPair();
345
+ const pair = makeCountingStreamPair();
335
346
 
336
347
  // No-op watchDog: in-process, no LSP lifecycle event (parent-pid liveness, the
337
348
  // `exit` notification, …) may exit the host test runner — `dispose()` owns
@@ -347,11 +358,15 @@ export function makeLspServerConnection(): LspServerConnection {
347
358
  logger =>
348
359
  createProtocolConnection(new StreamMessageReader(pair.clientToServer), new StreamMessageWriter(pair.serverToClient), logger),
349
360
  watchDog,
350
- ProposedFeatures.all
361
+ withHydraniumLspFeatures(ProposedFeatures.all)
351
362
  );
352
363
 
353
364
  // Client side mirrors the directions: reads serverToClient, writes clientToServer.
354
- const client = createProtocolConnection(new StreamMessageReader(pair.serverToClient), new StreamMessageWriter(pair.clientToServer));
365
+ const client = createProtocolConnection(
366
+ new StreamMessageReader(pair.serverToClient),
367
+ new StreamMessageWriter(pair.clientToServer),
368
+ console
369
+ );
355
370
  client.listen();
356
371
 
357
372
  const diagnostics: PublishDiagnosticsParams[] = [];
@@ -381,32 +396,7 @@ export function makeLspServerConnection(): LspServerConnection {
381
396
  }
382
397
  });
383
398
 
384
- const appliedEdits: AppliedEdit[] = [];
385
- /**
386
- * Waiters armed by {@link LspServerConnection.nextAppliedEdit}, fanned out to
387
- * from the ONE handler below — `vscode-jsonrpc` keeps a single handler per
388
- * REQUEST type just as it does per notification type, so a second
389
- * `onRequest` would displace this one and leave the server's `applyEdit`
390
- * unanswered.
391
- */
392
- const appliedEditWaiters: Array<(edit: AppliedEdit) => boolean> = [];
393
- let applyEditHandler: (params: ApplyWorkspaceEditParams) => ApplyWorkspaceEditResult = () => ({ applied: true });
394
- const appliedEditSubscription = client.onRequest(ApplyWorkspaceEditRequest.type, (params: ApplyWorkspaceEditParams) => {
395
- const edit: AppliedEdit = { params, uris: editedUris(params.edit), text: insertedText(params.edit) };
396
- // Record BEFORE the handler runs, so a handler that rejects the edit or
397
- // throws still leaves the push observable — the send is what the egress
398
- // assertion is about.
399
- appliedEdits.push(edit);
400
- for (const waiter of [...appliedEditWaiters]) {
401
- if (waiter(edit)) {
402
- const at = appliedEditWaiters.indexOf(waiter);
403
- if (at >= 0) {
404
- appliedEditWaiters.splice(at, 1);
405
- }
406
- }
407
- }
408
- return applyEditHandler(params);
409
- });
399
+ const appliedEditCapture = captureAppliedEdits(client, DEFAULT_DIAGNOSTICS_TIMEOUT_MS);
410
400
 
411
401
  let disposed = false;
412
402
 
@@ -414,7 +404,12 @@ export function makeLspServerConnection(): LspServerConnection {
414
404
  serverConnection,
415
405
  client,
416
406
  diagnostics,
417
- appliedEdits,
407
+ appliedEdits: appliedEditCapture.appliedEdits,
408
+ wireBytes: () => ({
409
+ clientToServer: pair.clientToServer.bytes,
410
+ serverToClient: pair.serverToClient.bytes,
411
+ total: pair.clientToServer.bytes + pair.serverToClient.bytes
412
+ }),
418
413
 
419
414
  async initialize(params?: Partial<InitializeParams>): Promise<InitializeResult> {
420
415
  const initializeParams: InitializeParams = {
@@ -455,6 +450,10 @@ export function makeLspServerConnection(): LspServerConnection {
455
450
  });
456
451
  },
457
452
 
453
+ async closeDocument(uri: string): Promise<void> {
454
+ await client.sendNotification(DidCloseTextDocumentNotification.type, { textDocument: { uri } });
455
+ },
456
+
458
457
  changeDocument(uri: string, text: string, version: number): void {
459
458
  client.sendNotification(DidChangeTextDocumentNotification.type, {
460
459
  textDocument: { uri, version },
@@ -521,51 +520,16 @@ export function makeLspServerConnection(): LspServerConnection {
521
520
  });
522
521
  },
523
522
 
524
- nextAppliedEdit(uri: string, timeoutMsOrOptions?: number | NextAppliedEditOptions): Promise<AppliedEdit> {
525
- const options: NextAppliedEditOptions =
526
- typeof timeoutMsOrOptions === 'number' ? { timeoutMs: timeoutMsOrOptions } : (timeoutMsOrOptions ?? {});
527
- const timeoutMs = options.timeoutMs ?? DEFAULT_DIAGNOSTICS_TIMEOUT_MS;
528
- const { fromIndex, match } = options;
529
- const matches = (edit: AppliedEdit): boolean => edit.uris.includes(uri) && (match?.(edit) ?? true);
530
- if (fromIndex !== undefined) {
531
- // Replay from the capture first, for the same reason
532
- // `nextDiagnostics` does: the push may already have arrived, and a
533
- // waiter only ever sees later ones.
534
- const captured = appliedEdits.slice(Math.max(0, fromIndex)).find(matches);
535
- if (captured) {
536
- return Promise.resolve(captured);
537
- }
538
- }
539
- return new Promise<AppliedEdit>((resolve, reject) => {
540
- const waiter = (edit: AppliedEdit): boolean => {
541
- if (!matches(edit)) {
542
- return false;
543
- }
544
- clearTimeout(timer);
545
- resolve(edit);
546
- return true;
547
- };
548
- const timer = setTimeout(() => {
549
- const at = appliedEditWaiters.indexOf(waiter);
550
- if (at >= 0) {
551
- appliedEditWaiters.splice(at, 1);
552
- }
553
- reject(new Error(`Timed out waiting for a workspace/applyEdit addressing ${uri}`));
554
- }, timeoutMs);
555
- appliedEditWaiters.push(waiter);
556
- });
557
- },
523
+ nextAppliedEdit: appliedEditCapture.nextAppliedEdit,
558
524
 
559
- setApplyEditHandler(handler: (params: ApplyWorkspaceEditParams) => ApplyWorkspaceEditResult): void {
560
- applyEditHandler = handler;
561
- },
525
+ setApplyEditHandler: appliedEditCapture.setApplyEditHandler,
562
526
 
563
527
  dispose(): void {
564
528
  if (disposed) {
565
529
  return;
566
530
  }
567
531
  disposed = true;
568
- appliedEditSubscription.dispose();
532
+ appliedEditCapture.dispose();
569
533
  diagnosticsSubscription.dispose();
570
534
  client.dispose();
571
535
  serverConnection.dispose();
@@ -14,15 +14,15 @@
14
14
  *
15
15
  * Any test that drives a **write path** needs one, and the reason is not
16
16
  * obvious enough to rediscover per suite. The writes themselves are usually
17
- * in-memory — `ModelService.update` goes to the multi-client text store, and
17
+ * in-memory — a session's `update` goes to the multi-client text store, and
18
18
  * only `save` reaches disk — but a rebuild also runs the integrity rules, and
19
19
  * their default `'silent'` sync mode persists repairs through
20
20
  * `WritableFileSystemProvider.writeFile`. So a write-path test pointed at a
21
21
  * committed sample workspace can **rewrite the sample files**, after which
22
22
  * every later run asserts against already-repaired input: a suite that passes
23
23
  * while testing nothing. The same applies to a fixture built in place, which
24
- * additionally loses its explanatory comments, because the write-back goes
25
- * through the serializer.
24
+ * additionally comes back in the serializer's layout, because the write-back
25
+ * goes through it.
26
26
  *
27
27
  * The second reason is cleanup. Hand-rolled `mkdtempSync` without a matching
28
28
  * `rmSync` leaks a directory per test run into the OS temp dir, which nobody
@@ -49,7 +49,7 @@
49
49
  */
50
50
 
51
51
  import { URI } from '@hydranium/langium';
52
- import { cpSync, mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
52
+ import { cpSync, mkdirSync, mkdtempSync, realpathSync, rmSync, writeFileSync } from 'node:fs';
53
53
  import { tmpdir } from 'node:os';
54
54
  import * as path from 'node:path';
55
55
 
@@ -106,7 +106,12 @@ export interface ScratchWorkspace {
106
106
  * returned {@link ScratchWorkspace.dispose} with an `afterEach`.
107
107
  */
108
108
  export function makeScratchWorkspace(options: ScratchWorkspaceOptions = {}): ScratchWorkspace {
109
- const root = mkdtempSync(path.join(tmpdir(), options.prefix ?? 'hydranium-scratch-'));
109
+ // RESOLVED, because `tmpdir()` can itself be a symlink — on macOS it answers
110
+ // `/tmp`, which links to `/private/tmp`. A root the server canonicalises to a
111
+ // different path than the one it was handed registers documents under one
112
+ // spelling and reads them under the other, failing initialization with an
113
+ // ENOENT that names neither the link nor this call.
114
+ const root = realpathSync(mkdtempSync(path.join(tmpdir(), options.prefix ?? 'hydranium-scratch-')));
110
115
  if (options.seed) {
111
116
  cpSync(options.seed, root, { recursive: true });
112
117
  }
@@ -61,7 +61,8 @@ import {
61
61
  type ProtocolConnection,
62
62
  type PublishDiagnosticsParams
63
63
  } from 'vscode-languageserver-protocol/node';
64
- import { type NextDiagnosticsOptions } from './lsp-server-connection.js';
64
+ import { captureAppliedEdits } from './applied-edit-capture.js';
65
+ import { type AppliedEdit, type NextAppliedEditOptions, type NextDiagnosticsOptions } from './lsp-server-connection.js';
65
66
 
66
67
  /**
67
68
  * Default bound on the `initialize` handshake, and the reason there is one at
@@ -195,6 +196,21 @@ export interface SpawnedServer extends Harness {
195
196
  * whenever one action fans out.
196
197
  */
197
198
  nextDiagnostics(uri: string, timeoutMsOrOptions?: number | NextDiagnosticsOptions): Promise<Diagnostic[]>;
199
+ /**
200
+ * Every `workspace/applyEdit` the child sent, in arrival order; append-only,
201
+ * each answered `{ applied: true }` as a real language client does.
202
+ *
203
+ * A Hydranium server mirrors an edit only for a document this connection has
204
+ * opened, so a write to one never sent `didOpen` here produces no entry. A
205
+ * second `applyEdit` handler registered on {@link connection} displaces this
206
+ * capture.
207
+ */
208
+ readonly appliedEdits: ReadonlyArray<AppliedEdit>;
209
+ /**
210
+ * Resolve with the next captured `workspace/applyEdit` addressing `uri`,
211
+ * with the same `fromIndex` and `match` contract as the in-process tier's.
212
+ */
213
+ nextAppliedEdit(uri: string, timeoutMsOrOptions?: number | NextAppliedEditOptions): Promise<AppliedEdit>;
198
214
  /**
199
215
  * Graceful `shutdown` / `exit`, each bounded, then `SIGKILL`. Resolves with
200
216
  * the child's exit code — `null` when a signal ended it, which is itself the
@@ -203,6 +219,37 @@ export interface SpawnedServer extends Harness {
203
219
  dispose(): Promise<number | null>;
204
220
  }
205
221
 
222
+ /**
223
+ * Every server started and not yet disposed, so {@link disposeSpawnedServers}
224
+ * can reach one a test forgot.
225
+ *
226
+ * Holds the server — and through it the `ChildProcess` — rather than a pid. A
227
+ * pid identifies a process only while that process is alive: once it exits the
228
+ * OS may reissue the number, and Windows does so within seconds. A teardown
229
+ * that signalled a recorded pid would therefore reach whatever holds it now,
230
+ * which on a concurrent build is another task's compiler or test runner.
231
+ */
232
+ const liveServers = new Set<SpawnedServer>();
233
+
234
+ /**
235
+ * Terminate every server this module started that has not been disposed, and
236
+ * forget them.
237
+ *
238
+ * Safe to call when none are outstanding, and safe to call twice. Nothing here
239
+ * can reach a process this module did not spawn, because every kill goes
240
+ * through the `ChildProcess` handle libuv holds and libuv will not signal a
241
+ * child it has already reaped.
242
+ *
243
+ * A suite that disposes each server as it finishes needs this only as a net; a
244
+ * suite that does not needs it, because an orphan holding a port or a pipe
245
+ * makes the NEXT run's verdict meaningless.
246
+ */
247
+ export async function disposeSpawnedServers(): Promise<void> {
248
+ const outstanding = [...liveServers];
249
+ liveServers.clear();
250
+ await Promise.all(outstanding.map(server => server.dispose()));
251
+ }
252
+
206
253
  /** The captured streams, quoted into a boot-failure message. */
207
254
  function bootDiagnosis(stdoutPrefix: string, stderr: string): string {
208
255
  return (
@@ -253,7 +300,7 @@ export async function startSpawnedServer(options: SpawnedServerOptions): Promise
253
300
  }
254
301
  });
255
302
 
256
- const connection = createProtocolConnection(child.stdout, child.stdin);
303
+ const connection = createProtocolConnection(child.stdout, child.stdin, console);
257
304
  const diagnostics: PublishDiagnosticsParams[] = [];
258
305
  /**
259
306
  * Waiters armed by {@link SpawnedServer.nextDiagnostics}, fanned out to from
@@ -272,6 +319,7 @@ export async function startSpawnedServer(options: SpawnedServerOptions): Promise
272
319
  connection.onNotification(LogMessageNotification.type, params => {
273
320
  logMessages.push(params);
274
321
  });
322
+ const appliedEditCapture = captureAppliedEdits(connection, RESPONSE_TIMEOUT_MS);
275
323
  connection.listen();
276
324
 
277
325
  const killTimeoutMs = options.killTimeoutMs ?? DEFAULT_KILL_TIMEOUT_MS;
@@ -390,7 +438,7 @@ export async function startSpawnedServer(options: SpawnedServerOptions): Promise
390
438
  return exitCode;
391
439
  }
392
440
 
393
- return {
441
+ const server: SpawnedServer = {
394
442
  connection,
395
443
  pid: child.pid,
396
444
  initializeResult,
@@ -439,9 +487,15 @@ export async function startSpawnedServer(options: SpawnedServerOptions): Promise
439
487
  waiters.add(notify);
440
488
  });
441
489
  },
490
+ appliedEdits: appliedEditCapture.appliedEdits,
491
+ nextAppliedEdit: appliedEditCapture.nextAppliedEdit,
442
492
  dispose(): Promise<number | null> {
493
+ appliedEditCapture.dispose();
494
+ liveServers.delete(server);
443
495
  disposal ??= terminate();
444
496
  return disposal;
445
497
  }
446
498
  };
499
+ liveServers.add(server);
500
+ return server;
447
501
  }
@@ -0,0 +1,31 @@
1
+ /********************************************************************************
2
+ * Copyright (c) 2026 CrossBreeze, EclipseSource and others.
3
+ *
4
+ * This program and the accompanying materials are made available under the
5
+ * terms of the MIT License which is available in the project root.
6
+ *
7
+ * SPDX-License-Identifier: MIT
8
+ ********************************************************************************/
9
+
10
+ /**
11
+ * Run a Node-only assertion while collecting process-level unhandled rejection
12
+ * events. The callback owns the event-loop drain and can therefore choose the
13
+ * right observation window for the operation under test.
14
+ *
15
+ * Inside the window a rejection reaches only the array: while any listener is
16
+ * registered, Node hands none to its default handler and Vitest reports none as
17
+ * an error. A callback that never asserts on the array therefore hides every
18
+ * rejection it provokes.
19
+ */
20
+ export async function captureUnhandledRejections<T>(callback: (rejections: unknown[]) => Promise<T>): Promise<T> {
21
+ const rejections: unknown[] = [];
22
+ const listener = (reason: unknown): void => {
23
+ rejections.push(reason);
24
+ };
25
+ process.on('unhandledRejection', listener);
26
+ try {
27
+ return await callback(rejections);
28
+ } finally {
29
+ process.off('unhandledRejection', listener);
30
+ }
31
+ }
@@ -55,7 +55,7 @@
55
55
 
56
56
  import { type AstNode, AstUtils, type LangiumCoreServices, URI } from '@hydranium/langium';
57
57
  import { type ParseHelperOptions, parseHelper } from '@hydranium/langium/test';
58
- import type { WritableFileSystemProvider } from '../documents/ast-document-manager.js';
58
+ import type { WritableFileSystemProvider } from '../langium/workspace/file-system-provider.js';
59
59
 
60
60
  /** The one field this module reads off a lexer or parser error. */
61
61
  interface ParseErrorMessage {