@hydranium/core 1.0.0-next.23 → 1.0.0-next.230

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 (657) hide show
  1. package/README.md +21 -13
  2. package/lib/documents/ast-document-manager.d.ts +219 -122
  3. package/lib/documents/ast-document-manager.d.ts.map +1 -1
  4. package/lib/documents/ast-document-manager.js +241 -130
  5. package/lib/documents/ast-document-manager.js.map +1 -1
  6. package/lib/documents/client-ids.d.ts +5 -19
  7. package/lib/documents/client-ids.d.ts.map +1 -1
  8. package/lib/documents/client-ids.js +5 -19
  9. package/lib/documents/client-ids.js.map +1 -1
  10. package/lib/documents/client-session-errors.d.ts +15 -0
  11. package/lib/documents/client-session-errors.d.ts.map +1 -0
  12. package/lib/documents/client-session-errors.js +15 -0
  13. package/lib/documents/client-session-errors.js.map +1 -0
  14. package/lib/documents/client-session-registry.d.ts +146 -0
  15. package/lib/documents/client-session-registry.d.ts.map +1 -0
  16. package/lib/documents/client-session-registry.js +207 -0
  17. package/lib/documents/client-session-registry.js.map +1 -0
  18. package/lib/documents/dirty-state-tracker.d.ts +79 -0
  19. package/lib/documents/dirty-state-tracker.d.ts.map +1 -0
  20. package/lib/documents/dirty-state-tracker.js +69 -0
  21. package/lib/documents/dirty-state-tracker.js.map +1 -0
  22. package/lib/documents/document-release-handler.d.ts +179 -0
  23. package/lib/documents/document-release-handler.d.ts.map +1 -0
  24. package/lib/documents/document-release-handler.js +283 -0
  25. package/lib/documents/document-release-handler.js.map +1 -0
  26. package/lib/documents/document-release-scheduler.d.ts +67 -0
  27. package/lib/documents/document-release-scheduler.d.ts.map +1 -0
  28. package/lib/documents/document-release-scheduler.js +80 -0
  29. package/lib/documents/document-release-scheduler.js.map +1 -0
  30. package/lib/documents/file-system-task-queue.d.ts +49 -0
  31. package/lib/documents/file-system-task-queue.d.ts.map +1 -0
  32. package/lib/documents/file-system-task-queue.js +34 -0
  33. package/lib/documents/file-system-task-queue.js.map +1 -0
  34. package/lib/documents/hydranium-text-documents.d.ts +399 -282
  35. package/lib/documents/hydranium-text-documents.d.ts.map +1 -1
  36. package/lib/documents/hydranium-text-documents.js +816 -483
  37. package/lib/documents/hydranium-text-documents.js.map +1 -1
  38. package/lib/documents/index.d.ts +10 -2
  39. package/lib/documents/index.d.ts.map +1 -1
  40. package/lib/documents/index.js +10 -2
  41. package/lib/documents/index.js.map +1 -1
  42. package/lib/documents/language-client-shadow.d.ts +218 -0
  43. package/lib/documents/language-client-shadow.d.ts.map +1 -0
  44. package/lib/documents/language-client-shadow.js +283 -0
  45. package/lib/documents/language-client-shadow.js.map +1 -0
  46. package/lib/documents/model-ledger.d.ts +47 -0
  47. package/lib/documents/model-ledger.d.ts.map +1 -0
  48. package/lib/documents/model-ledger.js +30 -0
  49. package/lib/documents/model-ledger.js.map +1 -0
  50. package/lib/documents/text-ledger.d.ts +64 -0
  51. package/lib/documents/text-ledger.d.ts.map +1 -0
  52. package/lib/documents/text-ledger.js +63 -0
  53. package/lib/documents/text-ledger.js.map +1 -0
  54. package/lib/documents/version-sync-service.d.ts +134 -0
  55. package/lib/documents/version-sync-service.d.ts.map +1 -0
  56. package/lib/documents/version-sync-service.js +171 -0
  57. package/lib/documents/version-sync-service.js.map +1 -0
  58. package/lib/index.d.ts +5 -0
  59. package/lib/index.d.ts.map +1 -1
  60. package/lib/index.js +8 -0
  61. package/lib/index.js.map +1 -1
  62. package/lib/langium/ast-extension/ast-extension-service.d.ts.map +1 -1
  63. package/lib/langium/ast-extension/ast-extension-service.js.map +1 -1
  64. package/lib/langium/ast-extension/ast-node-builder.d.ts +32 -9
  65. package/lib/langium/ast-extension/ast-node-builder.d.ts.map +1 -1
  66. package/lib/langium/ast-extension/ast-node-builder.js +60 -22
  67. package/lib/langium/ast-extension/ast-node-builder.js.map +1 -1
  68. package/lib/langium/bootstrap.d.ts +23 -16
  69. package/lib/langium/bootstrap.d.ts.map +1 -1
  70. package/lib/langium/bootstrap.js +66 -28
  71. package/lib/langium/bootstrap.js.map +1 -1
  72. package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts.map +1 -1
  73. package/lib/langium/build-phase-pass/build-phase-pass-service.js.map +1 -1
  74. package/lib/langium/composite-ast-reflection.d.ts +46 -0
  75. package/lib/langium/composite-ast-reflection.d.ts.map +1 -0
  76. package/lib/langium/composite-ast-reflection.js +97 -0
  77. package/lib/langium/composite-ast-reflection.js.map +1 -0
  78. package/lib/langium/config/configuration-provider.d.ts +81 -0
  79. package/lib/langium/config/configuration-provider.d.ts.map +1 -0
  80. package/lib/langium/config/configuration-provider.js +112 -0
  81. package/lib/langium/config/configuration-provider.js.map +1 -0
  82. package/lib/langium/config/index.d.ts +1 -0
  83. package/lib/langium/config/index.d.ts.map +1 -1
  84. package/lib/langium/config/index.js +1 -0
  85. package/lib/langium/config/index.js.map +1 -1
  86. package/lib/langium/config/settings.js.map +1 -1
  87. package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts.map +1 -1
  88. package/lib/langium/diagnostics/hydranium-langium-profiler.js.map +1 -1
  89. package/lib/langium/diagnostics/logger.d.ts +10 -3
  90. package/lib/langium/diagnostics/logger.d.ts.map +1 -1
  91. package/lib/langium/diagnostics/logger.js +12 -5
  92. package/lib/langium/diagnostics/logger.js.map +1 -1
  93. package/lib/langium/diagnostics/lsp-logger.d.ts +17 -0
  94. package/lib/langium/diagnostics/lsp-logger.d.ts.map +1 -1
  95. package/lib/langium/diagnostics/lsp-logger.js +57 -16
  96. package/lib/langium/diagnostics/lsp-logger.js.map +1 -1
  97. package/lib/langium/diagnostics/server-tracer.d.ts.map +1 -1
  98. package/lib/langium/diagnostics/server-tracer.js.map +1 -1
  99. package/lib/langium/document-builder/build-pipeline-integration.d.ts +21 -1
  100. package/lib/langium/document-builder/build-pipeline-integration.d.ts.map +1 -1
  101. package/lib/langium/document-builder/build-pipeline-integration.js +32 -5
  102. package/lib/langium/document-builder/build-pipeline-integration.js.map +1 -1
  103. package/lib/langium/document-builder/build-session.d.ts +93 -0
  104. package/lib/langium/document-builder/build-session.d.ts.map +1 -0
  105. package/lib/langium/document-builder/build-session.js +72 -0
  106. package/lib/langium/document-builder/build-session.js.map +1 -0
  107. package/lib/langium/document-builder/document-builder.d.ts +401 -29
  108. package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
  109. package/lib/langium/document-builder/document-builder.js +698 -61
  110. package/lib/langium/document-builder/document-builder.js.map +1 -1
  111. package/lib/langium/document-builder/index.d.ts +1 -0
  112. package/lib/langium/document-builder/index.d.ts.map +1 -1
  113. package/lib/langium/document-builder/index.js +1 -0
  114. package/lib/langium/document-builder/index.js.map +1 -1
  115. package/lib/langium/documentation/comment-provider.d.ts.map +1 -1
  116. package/lib/langium/documentation/comment-provider.js.map +1 -1
  117. package/lib/langium/integration-services.d.ts +61 -19
  118. package/lib/langium/integration-services.d.ts.map +1 -1
  119. package/lib/langium/integration-services.js +10 -5
  120. package/lib/langium/integration-services.js.map +1 -1
  121. package/lib/langium/integrity/integrity-rule.d.ts +16 -8
  122. package/lib/langium/integrity/integrity-rule.d.ts.map +1 -1
  123. package/lib/langium/integrity/integrity-rule.js.map +1 -1
  124. package/lib/langium/integrity/integrity-service.d.ts +81 -24
  125. package/lib/langium/integrity/integrity-service.d.ts.map +1 -1
  126. package/lib/langium/integrity/integrity-service.js +264 -57
  127. package/lib/langium/integrity/integrity-service.js.map +1 -1
  128. package/lib/langium/keys/containment.d.ts +64 -0
  129. package/lib/langium/keys/containment.d.ts.map +1 -0
  130. package/lib/langium/keys/containment.js +53 -0
  131. package/lib/langium/keys/containment.js.map +1 -0
  132. package/lib/langium/keys/index.d.ts +1 -0
  133. package/lib/langium/keys/index.d.ts.map +1 -1
  134. package/lib/langium/keys/index.js +1 -0
  135. package/lib/langium/keys/index.js.map +1 -1
  136. package/lib/langium/keys/name-based-key-provider.d.ts +4 -0
  137. package/lib/langium/keys/name-based-key-provider.d.ts.map +1 -1
  138. package/lib/langium/keys/name-based-key-provider.js +4 -0
  139. package/lib/langium/keys/name-based-key-provider.js.map +1 -1
  140. package/lib/langium/keys/positional-key-provider.d.ts.map +1 -1
  141. package/lib/langium/keys/positional-key-provider.js.map +1 -1
  142. package/lib/langium/labeling/label-provider.d.ts.map +1 -1
  143. package/lib/langium/labeling/label-provider.js.map +1 -1
  144. package/lib/langium/language-module.d.ts +29 -4
  145. package/lib/langium/language-module.d.ts.map +1 -1
  146. package/lib/langium/language-module.js +18 -4
  147. package/lib/langium/language-module.js.map +1 -1
  148. package/lib/langium/model-service/client-session.d.ts +343 -0
  149. package/lib/langium/model-service/client-session.d.ts.map +1 -0
  150. package/lib/langium/model-service/client-session.js +411 -0
  151. package/lib/langium/model-service/client-session.js.map +1 -0
  152. package/lib/langium/model-service/index.d.ts +2 -0
  153. package/lib/langium/model-service/index.d.ts.map +1 -1
  154. package/lib/langium/model-service/index.js +2 -0
  155. package/lib/langium/model-service/index.js.map +1 -1
  156. package/lib/langium/model-service/model-events.d.ts +61 -0
  157. package/lib/langium/model-service/model-events.d.ts.map +1 -0
  158. package/lib/langium/model-service/model-events.js +10 -0
  159. package/lib/langium/model-service/model-events.js.map +1 -0
  160. package/lib/langium/model-service/model-service.d.ts +432 -282
  161. package/lib/langium/model-service/model-service.d.ts.map +1 -1
  162. package/lib/langium/model-service/model-service.js +504 -438
  163. package/lib/langium/model-service/model-service.js.map +1 -1
  164. package/lib/langium/module.d.ts +157 -35
  165. package/lib/langium/module.d.ts.map +1 -1
  166. package/lib/langium/module.js +52 -35
  167. package/lib/langium/module.js.map +1 -1
  168. package/lib/langium/naming/name-provider.d.ts +25 -4
  169. package/lib/langium/naming/name-provider.d.ts.map +1 -1
  170. package/lib/langium/naming/name-provider.js +2 -1
  171. package/lib/langium/naming/name-provider.js.map +1 -1
  172. package/lib/langium/naming/name-separator-validation.d.ts +23 -0
  173. package/lib/langium/naming/name-separator-validation.d.ts.map +1 -1
  174. package/lib/langium/naming/name-separator-validation.js +30 -1
  175. package/lib/langium/naming/name-separator-validation.js.map +1 -1
  176. package/lib/langium/project/abstract-project-manager.d.ts.map +1 -1
  177. package/lib/langium/project/abstract-project-manager.js +9 -2
  178. package/lib/langium/project/abstract-project-manager.js.map +1 -1
  179. package/lib/langium/project/project-change-event.d.ts +2 -2
  180. package/lib/langium/project/single-project-manager.d.ts.map +1 -1
  181. package/lib/langium/project/single-project-manager.js.map +1 -1
  182. package/lib/langium/residency/cst-residency-service.d.ts +31 -11
  183. package/lib/langium/residency/cst-residency-service.d.ts.map +1 -1
  184. package/lib/langium/residency/cst-residency-service.js +23 -57
  185. package/lib/langium/residency/cst-residency-service.js.map +1 -1
  186. package/lib/langium/scope/ast-node-description-provider.d.ts.map +1 -1
  187. package/lib/langium/scope/ast-node-description-provider.js.map +1 -1
  188. package/lib/langium/scope/hydranium-scope-computation.d.ts.map +1 -1
  189. package/lib/langium/scope/hydranium-scope-computation.js.map +1 -1
  190. package/lib/langium/scope/hydranium-scope-provider.d.ts +48 -13
  191. package/lib/langium/scope/hydranium-scope-provider.d.ts.map +1 -1
  192. package/lib/langium/scope/hydranium-scope-provider.js +56 -20
  193. package/lib/langium/scope/hydranium-scope-provider.js.map +1 -1
  194. package/lib/langium/scope/reference-builder.d.ts.map +1 -1
  195. package/lib/langium/scope/reference-builder.js.map +1 -1
  196. package/lib/langium/scope/reference-candidate-provider.d.ts.map +1 -1
  197. package/lib/langium/scope/reference-candidate-provider.js.map +1 -1
  198. package/lib/langium/scope/scope-extension-service.d.ts.map +1 -1
  199. package/lib/langium/scope/scope-extension-service.js.map +1 -1
  200. package/lib/langium/serialization/abstract-serializer.d.ts +11 -20
  201. package/lib/langium/serialization/abstract-serializer.d.ts.map +1 -1
  202. package/lib/langium/serialization/abstract-serializer.js +12 -21
  203. package/lib/langium/serialization/abstract-serializer.js.map +1 -1
  204. package/lib/langium/serialization/json-serializer.d.ts +1 -1
  205. package/lib/langium/serialization/json-serializer.d.ts.map +1 -1
  206. package/lib/langium/serialization/json-serializer.js.map +1 -1
  207. package/lib/langium/serialization/yaml-serializer.d.ts.map +1 -1
  208. package/lib/langium/serialization/yaml-serializer.js.map +1 -1
  209. package/lib/langium/service-registry.d.ts +29 -1
  210. package/lib/langium/service-registry.d.ts.map +1 -1
  211. package/lib/langium/service-registry.js +37 -0
  212. package/lib/langium/service-registry.js.map +1 -1
  213. package/lib/langium/shared-services.d.ts +23 -6
  214. package/lib/langium/shared-services.d.ts.map +1 -1
  215. package/lib/langium/shared-services.js.map +1 -1
  216. package/lib/langium/single-langium-copy.d.ts +22 -0
  217. package/lib/langium/single-langium-copy.d.ts.map +1 -0
  218. package/lib/langium/single-langium-copy.js +36 -0
  219. package/lib/langium/single-langium-copy.js.map +1 -0
  220. package/lib/langium/transfer/transfer-encoder.d.ts +77 -26
  221. package/lib/langium/transfer/transfer-encoder.d.ts.map +1 -1
  222. package/lib/langium/transfer/transfer-encoder.js +46 -24
  223. package/lib/langium/transfer/transfer-encoder.js.map +1 -1
  224. package/lib/langium/trivia/comment-preserver.d.ts +423 -0
  225. package/lib/langium/trivia/comment-preserver.d.ts.map +1 -0
  226. package/lib/langium/trivia/comment-preserver.js +906 -0
  227. package/lib/langium/trivia/comment-preserver.js.map +1 -0
  228. package/lib/langium/trivia/document-ending-preserver.d.ts +43 -0
  229. package/lib/langium/trivia/document-ending-preserver.d.ts.map +1 -0
  230. package/lib/langium/trivia/document-ending-preserver.js +48 -0
  231. package/lib/langium/trivia/document-ending-preserver.js.map +1 -0
  232. package/lib/langium/trivia/index.d.ts +14 -0
  233. package/lib/langium/trivia/index.d.ts.map +1 -0
  234. package/lib/langium/trivia/index.js +14 -0
  235. package/lib/langium/trivia/index.js.map +1 -0
  236. package/lib/langium/trivia/trivia-contribution.d.ts +37 -0
  237. package/lib/langium/trivia/trivia-contribution.d.ts.map +1 -0
  238. package/lib/langium/trivia/trivia-contribution.js +10 -0
  239. package/lib/langium/trivia/trivia-contribution.js.map +1 -0
  240. package/lib/langium/trivia/trivia-preserver.d.ts +50 -0
  241. package/lib/langium/trivia/trivia-preserver.d.ts.map +1 -0
  242. package/lib/langium/trivia/trivia-preserver.js +10 -0
  243. package/lib/langium/trivia/trivia-preserver.js.map +1 -0
  244. package/lib/langium/trivia/trivia-service.d.ts +70 -0
  245. package/lib/langium/trivia/trivia-service.d.ts.map +1 -0
  246. package/lib/langium/trivia/trivia-service.js +56 -0
  247. package/lib/langium/trivia/trivia-service.js.map +1 -0
  248. package/lib/langium/update-rewrite/normalize-empty-strings.d.ts.map +1 -1
  249. package/lib/langium/update-rewrite/update-rewrite-service.d.ts.map +1 -1
  250. package/lib/langium/update-rewrite/update-rewrite-service.js.map +1 -1
  251. package/lib/langium/update-rewrite/update-rewrite.d.ts +1 -1
  252. package/lib/langium/validation/document-validator.d.ts +294 -10
  253. package/lib/langium/validation/document-validator.d.ts.map +1 -1
  254. package/lib/langium/validation/document-validator.js +448 -5
  255. package/lib/langium/validation/document-validator.js.map +1 -1
  256. package/lib/langium/validation/validation-contribution-collector.d.ts +9 -1
  257. package/lib/langium/validation/validation-contribution-collector.d.ts.map +1 -1
  258. package/lib/langium/validation/validation-contribution-collector.js +1 -1
  259. package/lib/langium/validation/validation-contribution-collector.js.map +1 -1
  260. package/lib/langium/workspace/document-uri-policy.d.ts +18 -14
  261. package/lib/langium/workspace/document-uri-policy.d.ts.map +1 -1
  262. package/lib/langium/workspace/document-uri-policy.js +10 -9
  263. package/lib/langium/workspace/document-uri-policy.js.map +1 -1
  264. package/lib/langium/workspace/file-not-found.d.ts +23 -0
  265. package/lib/langium/workspace/file-not-found.d.ts.map +1 -0
  266. package/lib/langium/workspace/file-not-found.js +31 -0
  267. package/lib/langium/workspace/file-not-found.js.map +1 -0
  268. package/lib/langium/workspace/file-system-provider.d.ts +135 -9
  269. package/lib/langium/workspace/file-system-provider.d.ts.map +1 -1
  270. package/lib/langium/workspace/file-system-provider.js +93 -14
  271. package/lib/langium/workspace/file-system-provider.js.map +1 -1
  272. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts +56 -1
  273. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts.map +1 -1
  274. package/lib/langium/workspace/hydranium-langium-document-factory.js +79 -0
  275. package/lib/langium/workspace/hydranium-langium-document-factory.js.map +1 -1
  276. package/lib/langium/workspace/hydranium-workspace-lock.d.ts +43 -1
  277. package/lib/langium/workspace/hydranium-workspace-lock.d.ts.map +1 -1
  278. package/lib/langium/workspace/hydranium-workspace-lock.js +58 -1
  279. package/lib/langium/workspace/hydranium-workspace-lock.js.map +1 -1
  280. package/lib/langium/workspace/hydranium-workspace-manager.d.ts +82 -9
  281. package/lib/langium/workspace/hydranium-workspace-manager.d.ts.map +1 -1
  282. package/lib/langium/workspace/hydranium-workspace-manager.js +128 -10
  283. package/lib/langium/workspace/hydranium-workspace-manager.js.map +1 -1
  284. package/lib/langium/workspace/in-memory-file-system-provider.d.ts +26 -3
  285. package/lib/langium/workspace/in-memory-file-system-provider.d.ts.map +1 -1
  286. package/lib/langium/workspace/in-memory-file-system-provider.js +41 -15
  287. package/lib/langium/workspace/in-memory-file-system-provider.js.map +1 -1
  288. package/lib/langium/workspace/index-manager.d.ts.map +1 -1
  289. package/lib/langium/workspace/index-manager.js.map +1 -1
  290. package/lib/langium/workspace/index.d.ts +1 -0
  291. package/lib/langium/workspace/index.d.ts.map +1 -1
  292. package/lib/langium/workspace/index.js +1 -0
  293. package/lib/langium/workspace/index.js.map +1 -1
  294. package/lib/langium/workspace/initialize-workspace.d.ts +31 -2
  295. package/lib/langium/workspace/initialize-workspace.d.ts.map +1 -1
  296. package/lib/langium/workspace/initialize-workspace.js +13 -5
  297. package/lib/langium/workspace/initialize-workspace.js.map +1 -1
  298. package/lib/langium/workspace/langium-documents.d.ts +86 -17
  299. package/lib/langium/workspace/langium-documents.d.ts.map +1 -1
  300. package/lib/langium/workspace/langium-documents.js +101 -29
  301. package/lib/langium/workspace/langium-documents.js.map +1 -1
  302. package/lib/langium/workspace/persistent-file-system-provider.d.ts +1 -8
  303. package/lib/langium/workspace/persistent-file-system-provider.d.ts.map +1 -1
  304. package/lib/langium/workspace/persistent-file-system-provider.js +0 -7
  305. package/lib/langium/workspace/persistent-file-system-provider.js.map +1 -1
  306. package/lib/{documents → langium/workspace}/self-save-registry.d.ts +38 -7
  307. package/lib/langium/workspace/self-save-registry.d.ts.map +1 -0
  308. package/lib/{documents → langium/workspace}/self-save-registry.js +29 -16
  309. package/lib/langium/workspace/self-save-registry.js.map +1 -0
  310. package/lib/langium/workspace/virtual-document.d.ts +48 -15
  311. package/lib/langium/workspace/virtual-document.d.ts.map +1 -1
  312. package/lib/langium/workspace/virtual-document.js +78 -18
  313. package/lib/langium/workspace/virtual-document.js.map +1 -1
  314. package/lib/langium/workspace/write-lock-scope.d.ts +20 -10
  315. package/lib/langium/workspace/write-lock-scope.d.ts.map +1 -1
  316. package/lib/langium/workspace/write-lock-scope.js +12 -4
  317. package/lib/langium/workspace/write-lock-scope.js.map +1 -1
  318. package/lib/locale/index.d.ts +10 -0
  319. package/lib/locale/index.d.ts.map +1 -0
  320. package/lib/locale/index.js +10 -0
  321. package/lib/locale/index.js.map +1 -0
  322. package/lib/locale/server-locale.d.ts +73 -0
  323. package/lib/locale/server-locale.d.ts.map +1 -0
  324. package/lib/locale/server-locale.js +61 -0
  325. package/lib/locale/server-locale.js.map +1 -0
  326. package/lib/lsp/completion/hydranium-completion-provider.d.ts +44 -2
  327. package/lib/lsp/completion/hydranium-completion-provider.d.ts.map +1 -1
  328. package/lib/lsp/completion/hydranium-completion-provider.js +68 -0
  329. package/lib/lsp/completion/hydranium-completion-provider.js.map +1 -1
  330. package/lib/lsp/connection-features.d.ts +23 -0
  331. package/lib/lsp/connection-features.d.ts.map +1 -0
  332. package/lib/lsp/connection-features.js +60 -0
  333. package/lib/lsp/connection-features.js.map +1 -0
  334. package/lib/lsp/diagnostics-connection.d.ts +27 -0
  335. package/lib/lsp/diagnostics-connection.d.ts.map +1 -0
  336. package/lib/lsp/diagnostics-connection.js +53 -0
  337. package/lib/lsp/diagnostics-connection.js.map +1 -0
  338. package/lib/lsp/hydranium-document-update-handler.d.ts +92 -81
  339. package/lib/lsp/hydranium-document-update-handler.d.ts.map +1 -1
  340. package/lib/lsp/hydranium-document-update-handler.js +153 -99
  341. package/lib/lsp/hydranium-document-update-handler.js.map +1 -1
  342. package/lib/lsp/index.d.ts +3 -1
  343. package/lib/lsp/index.d.ts.map +1 -1
  344. package/lib/lsp/index.js +3 -1
  345. package/lib/lsp/index.js.map +1 -1
  346. package/lib/lsp/lsp-latency.d.ts +39 -0
  347. package/lib/lsp/lsp-latency.d.ts.map +1 -0
  348. package/lib/lsp/lsp-latency.js +58 -0
  349. package/lib/lsp/lsp-latency.js.map +1 -0
  350. package/lib/lsp/semantic-token-provider.d.ts +34 -1
  351. package/lib/lsp/semantic-token-provider.d.ts.map +1 -1
  352. package/lib/lsp/semantic-token-provider.js +55 -8
  353. package/lib/lsp/semantic-token-provider.js.map +1 -1
  354. package/lib/lsp/shared-module.d.ts +4 -8
  355. package/lib/lsp/shared-module.d.ts.map +1 -1
  356. package/lib/lsp/shared-module.js.map +1 -1
  357. package/lib/lsp/start-language-server.d.ts +8 -7
  358. package/lib/lsp/start-language-server.d.ts.map +1 -1
  359. package/lib/lsp/start-language-server.js +13 -7
  360. package/lib/lsp/start-language-server.js.map +1 -1
  361. package/lib/messages/carriers.d.ts +54 -0
  362. package/lib/messages/carriers.d.ts.map +1 -0
  363. package/lib/messages/carriers.js +62 -0
  364. package/lib/messages/carriers.js.map +1 -0
  365. package/lib/messages/index.d.ts +25 -0
  366. package/lib/messages/index.d.ts.map +1 -0
  367. package/lib/messages/index.js +25 -0
  368. package/lib/messages/index.js.map +1 -0
  369. package/lib/messages/renderer.d.ts +142 -0
  370. package/lib/messages/renderer.d.ts.map +1 -0
  371. package/lib/messages/renderer.js +165 -0
  372. package/lib/messages/renderer.js.map +1 -0
  373. package/lib/node/event-loop-monitor.js.map +1 -1
  374. package/lib/node/heap-ceiling.d.ts +61 -0
  375. package/lib/node/heap-ceiling.d.ts.map +1 -0
  376. package/lib/node/heap-ceiling.js +72 -0
  377. package/lib/node/heap-ceiling.js.map +1 -0
  378. package/lib/node/index.d.ts +1 -1
  379. package/lib/node/index.d.ts.map +1 -1
  380. package/lib/node/index.js +1 -1
  381. package/lib/node/index.js.map +1 -1
  382. package/lib/node/latency-from-env.d.ts +1 -1
  383. package/lib/node/latency-from-env.js +1 -1
  384. package/lib/node/lint-grammar.js.map +1 -1
  385. package/lib/node/measure-memory.d.ts.map +1 -1
  386. package/lib/node/measure-memory.js +1 -0
  387. package/lib/node/measure-memory.js.map +1 -1
  388. package/lib/node/memory-monitor.js.map +1 -1
  389. package/lib/node/node-file-system-provider.d.ts +41 -6
  390. package/lib/node/node-file-system-provider.d.ts.map +1 -1
  391. package/lib/node/node-file-system-provider.js +109 -49
  392. package/lib/node/node-file-system-provider.js.map +1 -1
  393. package/lib/node/profile-capture.d.ts +8 -2
  394. package/lib/node/profile-capture.d.ts.map +1 -1
  395. package/lib/node/profile-capture.js +1 -1
  396. package/lib/node/profile-capture.js.map +1 -1
  397. package/lib/node/profile-digest.js.map +1 -1
  398. package/lib/node/profiling-run.d.ts +13 -3
  399. package/lib/node/profiling-run.d.ts.map +1 -1
  400. package/lib/node/profiling-run.js +17 -8
  401. package/lib/node/profiling-run.js.map +1 -1
  402. package/lib/node/rename-over-open-readers.d.ts +52 -0
  403. package/lib/node/rename-over-open-readers.d.ts.map +1 -0
  404. package/lib/node/rename-over-open-readers.js +66 -0
  405. package/lib/node/rename-over-open-readers.js.map +1 -0
  406. package/lib/node/socket-launcher.d.ts +20 -4
  407. package/lib/node/socket-launcher.d.ts.map +1 -1
  408. package/lib/node/socket-launcher.js +5 -4
  409. package/lib/node/socket-launcher.js.map +1 -1
  410. package/lib/node/stdio-launcher.d.ts +6 -5
  411. package/lib/node/stdio-launcher.d.ts.map +1 -1
  412. package/lib/node/stdio-launcher.js +2 -2
  413. package/lib/node/stdio-launcher.js.map +1 -1
  414. package/lib/testing/document-uri-policy-conformance.js.map +1 -1
  415. package/lib/testing/fake-description.js.map +1 -1
  416. package/lib/testing/fake-document.d.ts +16 -4
  417. package/lib/testing/fake-document.d.ts.map +1 -1
  418. package/lib/testing/fake-document.js +18 -3
  419. package/lib/testing/fake-document.js.map +1 -1
  420. package/lib/testing/index.d.ts +1 -1
  421. package/lib/testing/index.d.ts.map +1 -1
  422. package/lib/testing/index.js +2 -1
  423. package/lib/testing/index.js.map +1 -1
  424. package/lib/testing/langium-test-helpers.d.ts.map +1 -1
  425. package/lib/testing/langium-test-helpers.js +1 -0
  426. package/lib/testing/langium-test-helpers.js.map +1 -1
  427. package/lib/testing/make-noop-language-services.js.map +1 -1
  428. package/lib/testing/make-noop-shared-services.d.ts +14 -0
  429. package/lib/testing/make-noop-shared-services.d.ts.map +1 -1
  430. package/lib/testing/make-noop-shared-services.js +28 -2
  431. package/lib/testing/make-noop-shared-services.js.map +1 -1
  432. package/lib/testing/make-test-services.d.ts +72 -14
  433. package/lib/testing/make-test-services.d.ts.map +1 -1
  434. package/lib/testing/make-test-services.js +42 -10
  435. package/lib/testing/make-test-services.js.map +1 -1
  436. package/lib/testing/make-test-tracer.d.ts +12 -0
  437. package/lib/testing/make-test-tracer.d.ts.map +1 -1
  438. package/lib/testing/make-test-tracer.js +13 -0
  439. package/lib/testing/make-test-tracer.js.map +1 -1
  440. package/lib/testing/node/golden-corpus.js.map +1 -1
  441. package/lib/testing/node/index.d.ts +1 -0
  442. package/lib/testing/node/index.d.ts.map +1 -1
  443. package/lib/testing/node/index.js +1 -0
  444. package/lib/testing/node/index.js.map +1 -1
  445. package/lib/testing/node/lsp-harness.d.ts.map +1 -1
  446. package/lib/testing/node/lsp-harness.js +2 -0
  447. package/lib/testing/node/lsp-harness.js.map +1 -1
  448. package/lib/testing/node/lsp-server-connection.d.ts +11 -3
  449. package/lib/testing/node/lsp-server-connection.d.ts.map +1 -1
  450. package/lib/testing/node/lsp-server-connection.js +43 -10
  451. package/lib/testing/node/lsp-server-connection.js.map +1 -1
  452. package/lib/testing/node/scratch-workspace.d.ts.map +1 -1
  453. package/lib/testing/node/scratch-workspace.js +10 -5
  454. package/lib/testing/node/scratch-workspace.js.map +1 -1
  455. package/lib/testing/node/spawned-server.d.ts +14 -0
  456. package/lib/testing/node/spawned-server.d.ts.map +1 -1
  457. package/lib/testing/node/spawned-server.js +34 -2
  458. package/lib/testing/node/spawned-server.js.map +1 -1
  459. package/lib/testing/node/unhandled-rejections.d.ts +20 -0
  460. package/lib/testing/node/unhandled-rejections.d.ts.map +1 -0
  461. package/lib/testing/node/unhandled-rejections.js +32 -0
  462. package/lib/testing/node/unhandled-rejections.js.map +1 -0
  463. package/lib/testing/playwright/browser-capture-bridge.js.map +1 -1
  464. package/lib/testing/playwright/e2e-profiling.js.map +1 -1
  465. package/lib/testing/playwright/flaky-network-proxy.d.ts +76 -0
  466. package/lib/testing/playwright/flaky-network-proxy.d.ts.map +1 -0
  467. package/lib/testing/playwright/flaky-network-proxy.js +164 -0
  468. package/lib/testing/playwright/flaky-network-proxy.js.map +1 -0
  469. package/lib/testing/playwright/index.d.ts +1 -0
  470. package/lib/testing/playwright/index.d.ts.map +1 -1
  471. package/lib/testing/playwright/index.js +1 -0
  472. package/lib/testing/playwright/index.js.map +1 -1
  473. package/lib/testing/playwright/server-log-capture.d.ts +24 -8
  474. package/lib/testing/playwright/server-log-capture.d.ts.map +1 -1
  475. package/lib/testing/playwright/server-log-capture.js +27 -6
  476. package/lib/testing/playwright/server-log-capture.js.map +1 -1
  477. package/lib/testing/playwright/server-log-rename-reporter.d.ts.map +1 -1
  478. package/lib/testing/playwright/server-log-rename-reporter.js +10 -1
  479. package/lib/testing/playwright/server-log-rename-reporter.js.map +1 -1
  480. package/lib/testing/run-update-pipeline.d.ts +4 -4
  481. package/lib/testing/run-update-pipeline.d.ts.map +1 -1
  482. package/lib/testing/stub-ast-document-manager.d.ts +11 -52
  483. package/lib/testing/stub-ast-document-manager.d.ts.map +1 -1
  484. package/lib/testing/stub-ast-document-manager.js +24 -65
  485. package/lib/testing/stub-ast-document-manager.js.map +1 -1
  486. package/lib/testing/stub-document-builder.d.ts +26 -11
  487. package/lib/testing/stub-document-builder.d.ts.map +1 -1
  488. package/lib/testing/stub-document-builder.js +78 -5
  489. package/lib/testing/stub-document-builder.js.map +1 -1
  490. package/lib/testing/stub-hydranium-text-documents.d.ts +33 -10
  491. package/lib/testing/stub-hydranium-text-documents.d.ts.map +1 -1
  492. package/lib/testing/stub-hydranium-text-documents.js +115 -16
  493. package/lib/testing/stub-hydranium-text-documents.js.map +1 -1
  494. package/lib/testing/stub-index-manager.js.map +1 -1
  495. package/lib/testing/stub-langium-documents.d.ts +3 -2
  496. package/lib/testing/stub-langium-documents.d.ts.map +1 -1
  497. package/lib/testing/stub-langium-documents.js.map +1 -1
  498. package/lib/testing/stub-model-service.d.ts +7 -6
  499. package/lib/testing/stub-model-service.d.ts.map +1 -1
  500. package/lib/testing/stub-model-service.js +4 -4
  501. package/lib/testing/stub-model-service.js.map +1 -1
  502. package/lib/testing/stub-project-manager.js.map +1 -1
  503. package/lib/testing/stub-self-save-registry.d.ts +1 -1
  504. package/lib/testing/stub-self-save-registry.d.ts.map +1 -1
  505. package/lib/testing/stub-service-registry.d.ts +1 -1
  506. package/lib/testing/stub-service-registry.js.map +1 -1
  507. package/lib/testing/stub-writable-file-system.d.ts +1 -1
  508. package/lib/testing/stub-writable-file-system.d.ts.map +1 -1
  509. package/lib/util/connection-liveness.d.ts +7 -6
  510. package/lib/util/connection-liveness.d.ts.map +1 -1
  511. package/lib/util/connection-liveness.js +35 -14
  512. package/lib/util/connection-liveness.js.map +1 -1
  513. package/lib/util/environment.d.ts.map +1 -1
  514. package/lib/util/environment.js.map +1 -1
  515. package/lib/util/registry.d.ts.map +1 -1
  516. package/package.json +32 -48
  517. package/src/documents/ast-document-manager.ts +379 -231
  518. package/src/documents/client-ids.ts +5 -22
  519. package/src/documents/client-session-errors.ts +24 -0
  520. package/src/documents/client-session-registry.ts +262 -0
  521. package/src/documents/dirty-state-tracker.ts +130 -0
  522. package/src/documents/document-release-handler.ts +365 -0
  523. package/src/documents/document-release-scheduler.ts +121 -0
  524. package/src/documents/file-system-task-queue.ts +68 -0
  525. package/src/documents/hydranium-text-documents.ts +931 -595
  526. package/src/documents/index.ts +10 -2
  527. package/src/documents/language-client-shadow.ts +451 -0
  528. package/src/documents/model-ledger.ts +66 -0
  529. package/src/documents/text-ledger.ts +112 -0
  530. package/src/documents/version-sync-service.ts +267 -0
  531. package/src/index.ts +8 -0
  532. package/src/langium/ast-extension/ast-node-builder.ts +66 -22
  533. package/src/langium/bootstrap.ts +66 -28
  534. package/src/langium/composite-ast-reflection.ts +112 -0
  535. package/src/langium/config/configuration-provider.ts +119 -0
  536. package/src/langium/config/index.ts +1 -0
  537. package/src/langium/diagnostics/logger.ts +12 -5
  538. package/src/langium/diagnostics/lsp-logger.ts +59 -15
  539. package/src/langium/document-builder/build-pipeline-integration.ts +50 -5
  540. package/src/langium/document-builder/build-session.ts +87 -0
  541. package/src/langium/document-builder/document-builder.ts +825 -59
  542. package/src/langium/document-builder/index.ts +1 -0
  543. package/src/langium/integration-services.ts +83 -24
  544. package/src/langium/integrity/integrity-rule.ts +16 -8
  545. package/src/langium/integrity/integrity-service.ts +287 -62
  546. package/src/langium/keys/containment.ts +87 -0
  547. package/src/langium/keys/index.ts +1 -0
  548. package/src/langium/keys/name-based-key-provider.ts +4 -0
  549. package/src/langium/language-module.ts +48 -7
  550. package/src/langium/model-service/client-session.ts +644 -0
  551. package/src/langium/model-service/index.ts +2 -0
  552. package/src/langium/model-service/model-events.ts +75 -0
  553. package/src/langium/model-service/model-service.ts +790 -468
  554. package/src/langium/module.ts +210 -64
  555. package/src/langium/naming/name-provider.ts +27 -5
  556. package/src/langium/naming/name-separator-validation.ts +34 -5
  557. package/src/langium/project/abstract-project-manager.ts +9 -1
  558. package/src/langium/project/project-change-event.ts +2 -2
  559. package/src/langium/residency/cst-residency-service.ts +46 -15
  560. package/src/langium/scope/hydranium-scope-provider.ts +60 -22
  561. package/src/langium/serialization/abstract-serializer.ts +13 -32
  562. package/src/langium/service-registry.ts +41 -2
  563. package/src/langium/shared-services.ts +27 -6
  564. package/src/langium/single-langium-copy.ts +42 -0
  565. package/src/langium/transfer/transfer-encoder.ts +104 -37
  566. package/src/langium/trivia/comment-preserver.ts +1100 -0
  567. package/src/langium/trivia/document-ending-preserver.ts +55 -0
  568. package/src/langium/trivia/index.ts +14 -0
  569. package/src/langium/trivia/trivia-contribution.ts +39 -0
  570. package/src/langium/trivia/trivia-preserver.ts +54 -0
  571. package/src/langium/trivia/trivia-service.ts +99 -0
  572. package/src/langium/update-rewrite/update-rewrite.ts +1 -1
  573. package/src/langium/validation/document-validator.ts +537 -11
  574. package/src/langium/validation/validation-contribution-collector.ts +10 -1
  575. package/src/langium/workspace/document-uri-policy.ts +18 -14
  576. package/src/langium/workspace/file-not-found.ts +35 -0
  577. package/src/langium/workspace/file-system-provider.ts +205 -17
  578. package/src/langium/workspace/hydranium-langium-document-factory.ts +117 -0
  579. package/src/langium/workspace/hydranium-workspace-lock.ts +86 -2
  580. package/src/langium/workspace/hydranium-workspace-manager.ts +154 -14
  581. package/src/langium/workspace/in-memory-file-system-provider.ts +48 -17
  582. package/src/langium/workspace/index.ts +1 -0
  583. package/src/langium/workspace/initialize-workspace.ts +43 -5
  584. package/src/langium/workspace/langium-documents.ts +124 -33
  585. package/src/langium/workspace/persistent-file-system-provider.ts +1 -8
  586. package/src/{documents → langium/workspace}/self-save-registry.ts +54 -15
  587. package/src/langium/workspace/virtual-document.ts +96 -19
  588. package/src/langium/workspace/write-lock-scope.ts +24 -11
  589. package/src/locale/index.ts +10 -0
  590. package/src/locale/server-locale.ts +86 -0
  591. package/src/lsp/completion/hydranium-completion-provider.ts +82 -2
  592. package/src/lsp/connection-features.ts +67 -0
  593. package/src/lsp/diagnostics-connection.ts +56 -0
  594. package/src/lsp/hydranium-document-update-handler.ts +187 -108
  595. package/src/lsp/index.ts +3 -1
  596. package/src/lsp/lsp-latency.ts +62 -0
  597. package/src/lsp/semantic-token-provider.ts +74 -7
  598. package/src/lsp/shared-module.ts +4 -8
  599. package/src/lsp/start-language-server.ts +13 -7
  600. package/src/messages/carriers.ts +78 -0
  601. package/src/messages/index.ts +36 -0
  602. package/src/messages/renderer.ts +212 -0
  603. package/src/node/heap-ceiling.ts +108 -0
  604. package/src/node/index.ts +1 -1
  605. package/src/node/latency-from-env.ts +1 -1
  606. package/src/node/measure-memory.ts +1 -0
  607. package/src/node/node-file-system-provider.ts +124 -53
  608. package/src/node/profile-capture.ts +9 -3
  609. package/src/node/profiling-run.ts +30 -8
  610. package/src/node/rename-over-open-readers.ts +78 -0
  611. package/src/node/socket-launcher.ts +24 -8
  612. package/src/node/stdio-launcher.ts +8 -7
  613. package/src/testing/fake-document.ts +24 -5
  614. package/src/testing/index.ts +2 -1
  615. package/src/testing/langium-test-helpers.ts +1 -0
  616. package/src/testing/make-noop-shared-services.ts +50 -2
  617. package/src/testing/make-test-services.ts +125 -31
  618. package/src/testing/make-test-tracer.ts +26 -0
  619. package/src/testing/node/index.ts +1 -0
  620. package/src/testing/node/lsp-harness.ts +2 -0
  621. package/src/testing/node/lsp-server-connection.ts +66 -12
  622. package/src/testing/node/scratch-workspace.ts +10 -5
  623. package/src/testing/node/spawned-server.ts +36 -2
  624. package/src/testing/node/unhandled-rejections.ts +31 -0
  625. package/src/testing/parse-semantic-root.ts +1 -1
  626. package/src/testing/playwright/flaky-network-proxy.ts +240 -0
  627. package/src/testing/playwright/index.ts +1 -0
  628. package/src/testing/playwright/server-log-capture.ts +45 -11
  629. package/src/testing/playwright/server-log-rename-reporter.ts +12 -1
  630. package/src/testing/run-update-pipeline.ts +4 -4
  631. package/src/testing/stub-ast-document-manager.ts +36 -138
  632. package/src/testing/stub-document-builder.ts +102 -18
  633. package/src/testing/stub-hydranium-text-documents.ts +165 -27
  634. package/src/testing/stub-langium-documents.ts +3 -2
  635. package/src/testing/stub-model-service.ts +9 -8
  636. package/src/testing/stub-self-save-registry.ts +1 -1
  637. package/src/testing/stub-service-registry.ts +1 -1
  638. package/src/testing/stub-writable-file-system.ts +1 -1
  639. package/src/util/connection-liveness.ts +37 -14
  640. package/src/util/environment.ts +9 -1
  641. package/lib/documents/language-client-text-shadow.d.ts +0 -101
  642. package/lib/documents/language-client-text-shadow.d.ts.map +0 -1
  643. package/lib/documents/language-client-text-shadow.js +0 -156
  644. package/lib/documents/language-client-text-shadow.js.map +0 -1
  645. package/lib/documents/self-save-registry.d.ts.map +0 -1
  646. package/lib/documents/self-save-registry.js.map +0 -1
  647. package/lib/lsp/instrument-connection.d.ts +0 -36
  648. package/lib/lsp/instrument-connection.d.ts.map +0 -1
  649. package/lib/lsp/instrument-connection.js +0 -62
  650. package/lib/lsp/instrument-connection.js.map +0 -1
  651. package/lib/node/process-memory.d.ts +0 -66
  652. package/lib/node/process-memory.d.ts.map +0 -1
  653. package/lib/node/process-memory.js +0 -252
  654. package/lib/node/process-memory.js.map +0 -1
  655. package/src/documents/language-client-text-shadow.ts +0 -175
  656. package/src/lsp/instrument-connection.ts +0 -66
  657. package/src/node/process-memory.ts +0 -299
@@ -7,8 +7,7 @@
7
7
  * SPDX-License-Identifier: MIT
8
8
  ********************************************************************************/
9
9
 
10
- import { Deferred } from '@hydranium/langium';
11
- import type { Disposable, Logger } from '@hydranium/protocol';
10
+ import { Deferred, type Disposable, type Logger } from '@hydranium/protocol';
12
11
  import type { MessageConnection } from 'vscode-jsonrpc';
13
12
  import { createMessageConnection, StreamMessageReader, StreamMessageWriter } from 'vscode-jsonrpc/node';
14
13
  import type { IntegratedServer } from '../launcher/integrated-server.js';
@@ -30,10 +29,11 @@ export interface StdioServerOptions {
30
29
  */
31
30
  readonly workspace?: WorkspaceFolderInput | ReadonlyArray<WorkspaceFolderInput>;
32
31
  /**
33
- * Optional logger for lifecycle lines. Omitted means silent — note that a
34
- * logger writing to **stdout** would corrupt this head's protocol stream, so
35
- * anything passed here must sink elsewhere. The framework's own `LspLogger`
36
- * writes to stderr when no LSP connection is bound, which is correct here.
32
+ * Optional logger for lifecycle lines and the connection's protocol
33
+ * faults. Omitted means silent — note that a logger writing to **stdout**
34
+ * would corrupt this head's protocol stream, so anything passed here must
35
+ * sink elsewhere. The framework's own `LspLogger` writes to stderr when no
36
+ * LSP connection is bound, which is correct here.
37
37
  */
38
38
  readonly logger?: Logger;
39
39
  /** Tag included in lifecycle log lines. Default `"StdioServer"`. */
@@ -101,7 +101,8 @@ export function startStdioServer(
101
101
 
102
102
  const connection = createMessageConnection(
103
103
  new StreamMessageReader(options.input ?? process.stdin),
104
- new StreamMessageWriter(options.output ?? process.stdout)
104
+ new StreamMessageWriter(options.output ?? process.stdout),
105
+ logger?.with(tag)
105
106
  );
106
107
  const adopterDisposable = onConnection(connection);
107
108
 
@@ -7,7 +7,9 @@
7
7
  * SPDX-License-Identifier: MIT
8
8
  ********************************************************************************/
9
9
 
10
- import { DocumentState, type AstNode, type LangiumDocument, UriUtils, type URI } from '@hydranium/langium';
10
+ import { DocumentState, type AstNode, type AstReflection, type LangiumDocument, UriUtils, type URI } from '@hydranium/langium';
11
+ import { buildAstNode } from '../langium/ast-extension/ast-node-builder.js';
12
+ import { type AstDiagnostic } from '../langium/validation/document-validator.js';
11
13
 
12
14
  /**
13
15
  * Build a typed AST-node fixture for unit tests.
@@ -23,12 +25,29 @@ import { DocumentState, type AstNode, type LangiumDocument, UriUtils, type URI }
23
25
  * framework synthetic node, and marking it would change scope/index behaviour.
24
26
  * A test that wants a genuine synthetic node calls `markSynthetic` explicitly.
25
27
  *
28
+ * **Without a `reflection`, the fixture carries only what the test spells out**,
29
+ * which is a shape production never produces: a parsed or built node always has
30
+ * its grammar-declared containment arrays, so a fixture that omits one lets a
31
+ * test pass against an impossible node, and lets code that walks a list crash
32
+ * only under test. Pass the grammar's reflection whenever the type is a real
33
+ * one and the code under test reads a collection off it. Fixtures typed against
34
+ * ad-hoc names have no reflection to pass and keep the plain form.
35
+ *
26
36
  * @param node the node shape — `$type` is required; every other property is a
27
37
  * value the test cares about (`$container`, cross-reference values, internal
28
- * `_id` fields, …). The object is returned by reference, not copied.
38
+ * `_id` fields, …).
39
+ * @param reflection when given, pre-fills the grammar's declared defaults the
40
+ * same way {@link buildAstNode} does, and the result is a fresh object rather
41
+ * than `node` itself. Omitted, `node` is returned by reference.
29
42
  */
30
- export function makeFakeAstNode<TAst extends AstNode = AstNode>(node: { $type: string } & Record<string, unknown>): TAst {
31
- return node as unknown as TAst;
43
+ export function makeFakeAstNode<TAst extends AstNode = AstNode>(
44
+ node: { $type: string } & Record<string, unknown>,
45
+ reflection?: AstReflection
46
+ ): TAst {
47
+ if (!reflection) {
48
+ return node as unknown as TAst;
49
+ }
50
+ return buildAstNode<TAst>(reflection, node.$type, node);
32
51
  }
33
52
 
34
53
  /**
@@ -86,7 +105,7 @@ function stringifyFakeRoot(root: unknown): string {
86
105
  * staging. Override via `options.state` for tests that gate on earlier
87
106
  * phases.
88
107
  */
89
- export function makeFakeDocument<TAst extends AstNode = AstNode, TDiagnostic = unknown>(
108
+ export function makeFakeDocument<TAst extends AstNode = AstNode, TDiagnostic extends AstDiagnostic = AstDiagnostic>(
90
109
  uri: string | URI,
91
110
  root: TAst,
92
111
  options: FakeDocumentOptions<TAst, TDiagnostic> = {}
@@ -14,7 +14,7 @@
14
14
  * builders, the snapshot and URI-policy conformance primitives, the
15
15
  * structured-write pipeline driver, and a re-export of `langium/test`.
16
16
  *
17
- * Neutrality is gated (`scripts/check-neutral-bundles.mjs`). The test support
17
+ * Neutrality is gated (`scripts/check-neutral-bundles.mts`). The test support
18
18
  * that needs a real filesystem or a Node stream transport — the scratch
19
19
  * workspace, the golden corpus, the LSP transport and its harness — lives at
20
20
  * `@hydranium/core/testing/node`, on the same rule the package surface uses:
@@ -26,6 +26,7 @@ export * from './document-uri-policy-conformance.js';
26
26
  export * from './fake-description.js';
27
27
  export * from './fake-document.js';
28
28
  export * from './fake-reflection.js';
29
+ // oxlint-disable-next-line import/export -- misreads export * from an npm package: https://github.com/oxc-project/oxc/pull/26872
29
30
  export * from './langium-test-helpers.js';
30
31
  export * from './make-noop-language-services.js';
31
32
  export * from './make-noop-shared-services.js';
@@ -23,4 +23,5 @@
23
23
  * contracts stays Langium upstream, so a rename there surfaces here rather than
24
24
  * being absorbed by a hand-maintained list.
25
25
  */
26
+ // oxlint-disable-next-line import/export -- misreads export * from an npm package: https://github.com/oxc-project/oxc/pull/26872
26
27
  export * from '@hydranium/langium/test';
@@ -9,6 +9,8 @@
9
9
 
10
10
  import { type Clock, DefaultTracer, type Logger, NoopLogger, SystemClock, type Tracer } from '@hydranium/protocol';
11
11
  import type { ServerSharedServicesMinimal } from '../langium/shared-services.js';
12
+ import { DefaultServerLocale, type ServerLocale } from '../locale/server-locale.js';
13
+ import { DefaultMessageRenderer, type MessageRenderer } from '../messages/renderer.js';
12
14
 
13
15
  /**
14
16
  * Overrides for {@link makeNoopSharedServices}. The three observability slots
@@ -29,6 +31,18 @@ export interface NoopSharedServicesOverrides {
29
31
  Logger?: Logger;
30
32
  /** Bound on the top-level `Tracer` slot. Default: a `DefaultTracer` over `Logger` + `Clock`. */
31
33
  Tracer?: Tracer;
34
+ /** Factory for the `ServerLocale` slot. Default: a real one, reporting no locale. */
35
+ ServerLocale?: (services: ServerSharedServicesMinimal) => ServerLocale;
36
+ /**
37
+ * Factory for the `MessageRenderer` slot. Default: the real
38
+ * {@link DefaultMessageRenderer}, whose no-catalogue behaviour is a
39
+ * pass-through — so the default is the framework's own behaviour, not a stub.
40
+ *
41
+ * A factory rather than an instance, because a renderer reads the tree it is
42
+ * bound into. Both slots are resolved lazily, so an override is honoured
43
+ * however late the caller reads them.
44
+ */
45
+ MessageRenderer?: (services: ServerSharedServicesMinimal) => MessageRenderer;
32
46
  /** Per-slot `workspace` overrides. Slots left out resolve to `undefined`. */
33
47
  workspace?: Record<string, unknown>;
34
48
  /** Any other minimal slot (`ServiceRegistry`, `AstReflection`, `additionalDocuments`, …). */
@@ -63,11 +77,21 @@ export interface NoopSharedServicesOverrides {
63
77
  export function makeNoopSharedServices<T extends ServerSharedServicesMinimal = ServerSharedServicesMinimal>(
64
78
  overrides: NoopSharedServicesOverrides = {}
65
79
  ): T {
66
- const { Clock: clock, Logger: logger, Tracer: tracer, workspace, additionalDocuments, ...restTop } = overrides;
80
+ const {
81
+ Clock: clock,
82
+ Logger: logger,
83
+ Tracer: tracer,
84
+ ServerLocale: serverLocale,
85
+ MessageRenderer: messageRenderer,
86
+ workspace,
87
+ additionalDocuments,
88
+ ...restTop
89
+ } = overrides;
67
90
  const resolvedClock = clock ?? new SystemClock();
68
91
  const resolvedLogger = logger ?? new NoopLogger();
69
92
  const resolvedTracer = tracer ?? new DefaultTracer(resolvedLogger, resolvedClock);
70
- return {
93
+ // Assembled in two steps, because both defaults read the tree they belong to.
94
+ const services = {
71
95
  Clock: resolvedClock,
72
96
  Logger: resolvedLogger,
73
97
  Tracer: resolvedTracer,
@@ -75,4 +99,28 @@ export function makeNoopSharedServices<T extends ServerSharedServicesMinimal = S
75
99
  ...restTop,
76
100
  workspace: { ...(workspace ?? {}) }
77
101
  } as unknown as T;
102
+ // Lazy, like Langium's own per-slot construction — and load-bearing here:
103
+ // both services emit an `instantiated` trace, so building them eagerly puts
104
+ // two lines into the capture of every test that passes a capturing logger
105
+ // and asserts on emptiness.
106
+ defineLazySlot(services, 'ServerLocale', () => serverLocale?.(services) ?? new DefaultServerLocale(services));
107
+ defineLazySlot(services, 'MessageRenderer', () => messageRenderer?.(services) ?? new DefaultMessageRenderer(services));
108
+ return services;
109
+ }
110
+
111
+ /** Install `name` as a memoized getter, so nothing is constructed until it is read. */
112
+ function defineLazySlot(target: object, name: string, create: () => unknown): void {
113
+ let resolved: unknown;
114
+ let built = false;
115
+ Object.defineProperty(target, name, {
116
+ configurable: true,
117
+ enumerable: true,
118
+ get: () => {
119
+ if (!built) {
120
+ resolved = create();
121
+ built = true;
122
+ }
123
+ return resolved;
124
+ }
125
+ });
78
126
  }
@@ -10,6 +10,7 @@
10
10
  import {
11
11
  type Clock,
12
12
  DefaultTracer,
13
+ type Locale,
13
14
  type Logger,
14
15
  NoopLogger,
15
16
  type Project,
@@ -18,13 +19,25 @@ import {
18
19
  type TransferDiagnostic,
19
20
  type TransferElement
20
21
  } from '@hydranium/protocol';
22
+ import { DefaultServerLocale, type ServerLocale } from '../locale/server-locale.js';
23
+ import { DefaultMessageRenderer, type MessageRenderer } from '../messages/renderer.js';
21
24
  import type { Harness } from '@hydranium/protocol/testing';
22
25
  import { type AstNode, type AstNodeDescription, type WorkspaceLock } from '@hydranium/langium';
26
+ import {
27
+ type ClientSessionFactory,
28
+ type ClientSessionFactoryOptions,
29
+ DefaultClientSessionFactory
30
+ } from '../langium/model-service/client-session.js';
23
31
  import type { ModelService, ModelServiceOptions } from '../langium/model-service/model-service.js';
24
32
  import type { ServerSharedServices } from '../langium/module.js';
25
- import { TransferEncoder } from '../langium/transfer/transfer-encoder.js';
33
+ import type { AstDiagnostic } from '../langium/validation/document-validator.js';
34
+ import { DefaultTransferEncoder, type TransferEncoder } from '../langium/transfer/transfer-encoder.js';
26
35
  import { DefaultDocumentUriPolicy, type DocumentUriPolicy } from '../langium/workspace/document-uri-policy.js';
27
36
  import { HydraniumWorkspaceLock } from '../langium/workspace/hydranium-workspace-lock.js';
37
+ import { DefaultFileSystemTaskQueue, type FileSystemTaskQueue } from '../documents/file-system-task-queue.js';
38
+ import { DefaultModelLedger, type ModelLedger } from '../documents/model-ledger.js';
39
+ import { DefaultDocumentReleaseHandler, type DocumentReleaseHandler } from '../documents/document-release-handler.js';
40
+ import { DefaultVersionSyncService, type VersionSyncService } from '../documents/version-sync-service.js';
28
41
  import type { FakeDocumentOptions } from './fake-document.js';
29
42
  import { makeStubDocumentBuilder, type StubDocumentBuilder } from './stub-document-builder.js';
30
43
  import { makeStubIndexManager, type StubIndexManager } from './stub-index-manager.js';
@@ -46,12 +59,21 @@ import { makeStubWritableFileSystem, type StubWritableFileSystem } from './stub-
46
59
  * to `ServerSharedServices` in {@link makeTestServices} is therefore the
47
60
  * single named place where the "stub stands in for the full service tree"
48
61
  * assertion happens.
62
+ *
63
+ * **`TDiagnostic` and `TTransferDiagnostic` are the two ends of a conversion
64
+ * and must stay separate.** The first is what the build left on
65
+ * `LangiumDocument.diagnostics` and what `ModelService` hands back on an
66
+ * `AstDocument`; the second is what `TransferEncoder.toTransferDiagnostic`
67
+ * produces for the wire. One parameter serving both makes the tree
68
+ * unbindable for an adopter who extends either shape, since extending one
69
+ * says nothing about the other.
49
70
  */
50
71
  export interface TestSharedServices<
51
72
  TAst extends AstNode = AstNode,
52
- TDiagnostic extends TransferDiagnostic = TransferDiagnostic,
73
+ TDiagnostic extends AstDiagnostic = AstDiagnostic,
53
74
  TTransfer extends TransferElement = TransferElement,
54
- TProject extends Project = Project
75
+ TProject extends Project = Project,
76
+ TTransferDiagnostic extends TransferDiagnostic = TransferDiagnostic
55
77
  > {
56
78
  readonly Clock: Clock;
57
79
  readonly Logger: Logger;
@@ -72,6 +94,8 @@ export interface TestSharedServices<
72
94
  SelfSaveRegistry: StubSelfSaveRegistry;
73
95
  ProjectManager: StubProjectManager<TProject>;
74
96
  DocumentUriPolicy: DocumentUriPolicy;
97
+ /** The REAL queue: a stub that runs each task at once hides the save interleaving the queue exists to prevent. */
98
+ FileSystemTaskQueue: FileSystemTaskQueue;
75
99
  /**
76
100
  * Present only when {@link MakeTestServicesOptions.seedIndex} was passed.
77
101
  * Omitted otherwise for the same reason as `ServiceRegistry` — see that
@@ -88,19 +112,36 @@ export interface TestSharedServices<
88
112
  * through this tree and let a reentrant write pass unnoticed.
89
113
  */
90
114
  WorkspaceLock: WorkspaceLock;
115
+ /** The REAL ledger: it is a weak map with no dependencies. */
116
+ ModelLedger: ModelLedger;
117
+ /** The REAL service, over this tree's stubs; it reconciles nothing against the stub store. */
118
+ VersionSyncService: VersionSyncService;
119
+ /** The REAL handler, over this tree's stubs; the stub store releases nothing to it. */
120
+ DocumentReleaseHandler: DocumentReleaseHandler;
91
121
  };
92
122
  readonly model: {
93
- TransferEncoder: TransferEncoder<unknown, TDiagnostic>;
123
+ TransferEncoder: TransferEncoder<TTransferDiagnostic>;
94
124
  ModelService: ModelService<TAst, TDiagnostic, TTransfer>;
125
+ ClientSessionFactory: ClientSessionFactory;
95
126
  };
127
+ /**
128
+ * The REAL services, not stubs — the framework renderer's no-catalogue
129
+ * behaviour is a pass-through, so the stub tree agrees with a production one
130
+ * unless a test installs a catalogue. Bound rather than omitted because
131
+ * `HydraniumDocumentBuilder` renders through the renderer on every
132
+ * `Validated` phase, where an omitted slot is a `TypeError`.
133
+ */
134
+ readonly ServerLocale: ServerLocale;
135
+ readonly MessageRenderer: MessageRenderer;
96
136
  }
97
137
 
98
138
  /** Optional configuration for {@link makeTestServices}. */
99
139
  export interface MakeTestServicesOptions<
100
140
  TAst extends AstNode = AstNode,
101
- TDiagnostic extends TransferDiagnostic = TransferDiagnostic,
141
+ TDiagnostic extends AstDiagnostic = AstDiagnostic,
102
142
  TTransfer extends TransferElement = TransferElement,
103
- TProject extends Project = Project
143
+ TProject extends Project = Project,
144
+ TTransferDiagnostic extends TransferDiagnostic = TransferDiagnostic
104
145
  > {
105
146
  /**
106
147
  * Serialiser used by the bundled `StubModelService`. The stub tree
@@ -112,6 +153,14 @@ export interface MakeTestServicesOptions<
112
153
  * for tests that don't assert on the produced text.
113
154
  */
114
155
  serialize?: (uri: string, root: TTransfer) => string;
156
+ /**
157
+ * Renderer bound on `MessageRenderer`. Default: the framework's own, which
158
+ * passes every sentence through unchanged. Supply one to install a catalogue
159
+ * or to drive the throwing path.
160
+ */
161
+ messageRenderer?: (services: ServerSharedServices<TProject>) => MessageRenderer;
162
+ /** Locale handed to the bundle's {@link ServerLocale}. Default: none, i.e. the framework's English. */
163
+ locale?: Locale;
115
164
  /**
116
165
  * Languages to register on a {@link StubServiceRegistry} bound on the
117
166
  * `ServiceRegistry` slot. This is how a test gets multi-language routing:
@@ -120,7 +169,7 @@ export interface MakeTestServicesOptions<
120
169
  *
121
170
  * **Default: no `ServiceRegistry` slot at all.** Binding an empty registry
122
171
  * by default would silently change behaviour for the tests that rely on the
123
- * slot being absent — `ModelService.updateRewriteService` optional-chains it
172
+ * slot being absent — `ModelService.rewriteModel` optional-chains it
124
173
  * precisely for those bundles — so a registry appears only when a test asks
125
174
  * for one.
126
175
  */
@@ -178,16 +227,23 @@ export interface MakeTestServicesOptions<
178
227
  modelService?: (services: ServerSharedServices<TProject>) => ModelService<TAst, TDiagnostic, TTransfer>;
179
228
  /**
180
229
  * Framework {@link ModelServiceOptions} for the DEFAULT stub service, so a
181
- * test can reach an option-gated path (`serializeBuilds`, the slow-warn
182
- * threshold) without supplying a whole {@link modelService} factory. Ignored
183
- * when `modelService` is given — that factory owns its own construction.
230
+ * test can reach an option-gated path (`allowReentrantBuilds`) without supplying
231
+ * a whole {@link modelService} factory. Ignored when `modelService` is
232
+ * given — that factory owns its own construction.
184
233
  */
185
234
  modelServiceOptions?: ModelServiceOptions;
235
+ /**
236
+ * Options of the {@link DefaultClientSessionFactory} bound on
237
+ * `model.ClientSessionFactory`, so a test can reach the slow-update warn.
238
+ * Its sessions serialise and rebuild through the `model.ModelService` slot,
239
+ * so a test of a model service subclass passes it as {@link modelService}.
240
+ */
241
+ clientSessionFactoryOptions?: ClientSessionFactoryOptions;
186
242
  /**
187
243
  * Override the {@link TransferEncoder} factory. Default: framework
188
244
  * {@link TransferEncoder} with no overrides.
189
245
  */
190
- transferEncoder?: (services: ServerSharedServices<TProject>) => TransferEncoder<unknown, TDiagnostic>;
246
+ transferEncoder?: (services: ServerSharedServices<TProject, TTransferDiagnostic>) => TransferEncoder<TTransferDiagnostic>;
191
247
  }
192
248
 
193
249
  /**
@@ -205,11 +261,12 @@ export interface MakeTestServicesOptions<
205
261
  */
206
262
  export interface TestServicesBundle<
207
263
  TAst extends AstNode = AstNode,
208
- TDiagnostic extends TransferDiagnostic = TransferDiagnostic,
264
+ TDiagnostic extends AstDiagnostic = AstDiagnostic,
209
265
  TTransfer extends TransferElement = TransferElement,
210
- TProject extends Project = Project
266
+ TProject extends Project = Project,
267
+ TTransferDiagnostic extends TransferDiagnostic = TransferDiagnostic
211
268
  > extends Harness {
212
- readonly services: ServerSharedServices<TProject>;
269
+ readonly services: ServerSharedServices<TProject, TTransferDiagnostic>;
213
270
  readonly documents: StubLangiumDocuments<TAst, TDiagnostic>;
214
271
  readonly textDocuments: StubHydraniumTextDocuments;
215
272
  readonly astDocumentManager: StubAstDocumentManager<TAst, TDiagnostic>;
@@ -218,6 +275,7 @@ export interface TestServicesBundle<
218
275
  readonly selfSaveRegistry: StubSelfSaveRegistry;
219
276
  readonly projectManager: StubProjectManager<TProject>;
220
277
  readonly documentUriPolicy: DocumentUriPolicy;
278
+ readonly modelLedger: ModelLedger;
221
279
  /**
222
280
  * The registry bound on the `ServiceRegistry` slot, or `undefined` when no
223
281
  * {@link MakeTestServicesOptions.languages} were declared.
@@ -229,10 +287,18 @@ export interface TestServicesBundle<
229
287
  */
230
288
  readonly indexManager: StubIndexManager | undefined;
231
289
  readonly modelService: ModelService<TAst, TDiagnostic, TTransfer>;
232
- readonly transferEncoder: TransferEncoder<unknown, TDiagnostic>;
290
+ readonly transferEncoder: TransferEncoder<TTransferDiagnostic>;
233
291
  readonly logger: Logger;
234
292
  /** The clock bound on the `Clock` slot — a `makeFakeClock()` if one was passed. */
235
293
  readonly clock: Clock;
294
+ /**
295
+ * The service bound on `ServerLocale`, so a test can hand over a locale
296
+ * mid-run — which is also how it verifies the renderer reads the locale per
297
+ * render rather than caching it at construction.
298
+ */
299
+ readonly serverLocale: ServerLocale;
300
+ /** The renderer bound on `MessageRenderer` — the framework's own unless one was supplied. */
301
+ readonly messageRenderer: MessageRenderer;
236
302
  }
237
303
 
238
304
  /**
@@ -247,22 +313,25 @@ export interface TestServicesBundle<
247
313
  */
248
314
  export function makeTestServices<
249
315
  TAst extends AstNode = AstNode,
250
- TDiagnostic extends TransferDiagnostic = TransferDiagnostic,
316
+ TDiagnostic extends AstDiagnostic = AstDiagnostic,
251
317
  TTransfer extends TransferElement = TransferElement,
252
- TProject extends Project = Project
318
+ TProject extends Project = Project,
319
+ TTransferDiagnostic extends TransferDiagnostic = TransferDiagnostic
253
320
  >(
254
- options: MakeTestServicesOptions<TAst, TDiagnostic, TTransfer, TProject> = {}
255
- ): TestServicesBundle<TAst, TDiagnostic, TTransfer, TProject> {
321
+ options: MakeTestServicesOptions<TAst, TDiagnostic, TTransfer, TProject, TTransferDiagnostic> = {}
322
+ ): TestServicesBundle<TAst, TDiagnostic, TTransfer, TProject, TTransferDiagnostic> {
256
323
  const documents = makeStubLangiumDocuments<TAst, TDiagnostic>(options.seedDocuments);
257
324
  const textDocuments = makeStubHydraniumTextDocuments();
258
- const documentBuilder = makeStubDocumentBuilder();
259
- const selfSaveRegistry = makeStubSelfSaveRegistry();
260
- const fileSystem = makeStubWritableFileSystem(selfSaveRegistry);
261
- const projectManager = makeStubProjectManager<TProject>(options.seedProjects);
262
- const astDocumentManager = makeStubAstDocumentManager<TAst, TDiagnostic>(textDocuments, fileSystem, documents);
263
325
  const logger = options.logger ?? new NoopLogger();
264
326
  const clock = options.clock ?? new SystemClock();
265
327
  const tracer = new DefaultTracer(logger, clock);
328
+ const workspaceLock = new HydraniumWorkspaceLock({ Clock: clock, Tracer: tracer });
329
+ const documentBuilder = makeStubDocumentBuilder(workspaceLock);
330
+ const selfSaveRegistry = makeStubSelfSaveRegistry();
331
+ const fileSystem = makeStubWritableFileSystem(selfSaveRegistry);
332
+ const projectManager = makeStubProjectManager<TProject>(options.seedProjects);
333
+ const modelLedger = new DefaultModelLedger();
334
+ const astDocumentManager = makeStubAstDocumentManager<TAst, TDiagnostic>(textDocuments, fileSystem, documents, modelLedger);
266
335
  const documentUriPolicy = options.documentUriPolicy ?? new DefaultDocumentUriPolicy();
267
336
  const serviceRegistry = options.languages
268
337
  ? makeStubServiceRegistry(options.languages, { openLanguageIds: options.openLanguageIds })
@@ -285,11 +354,11 @@ export function makeTestServices<
285
354
  // is dependency-free (as `HydraniumWorkspaceLock` is) — a no-op stub of a
286
355
  // synchronisation primitive hides the very interleaving it exists to prevent.
287
356
  //
288
- // `model.TransferEncoder` / `model.ModelService` are populated below
357
+ // The `model` slots are populated below
289
358
  // (after the factories run); the literal uses unsafe casts to
290
359
  // partially-built objects to satisfy TestSharedServices, then patches
291
360
  // them in.
292
- const services: TestSharedServices<TAst, TDiagnostic, TTransfer, TProject> = {
361
+ const services: TestSharedServices<TAst, TDiagnostic, TTransfer, TProject, TTransferDiagnostic> = {
293
362
  Clock: clock,
294
363
  Logger: logger,
295
364
  Tracer: tracer,
@@ -309,26 +378,48 @@ export function makeTestServices<
309
378
  // Spread for the same reason as `ServiceRegistry` above — the slot must
310
379
  // be genuinely ABSENT, not present-and-undefined, when no index was seeded.
311
380
  ...(indexManager ? { IndexManager: indexManager } : {}),
312
- WorkspaceLock: new HydraniumWorkspaceLock()
381
+ WorkspaceLock: workspaceLock,
382
+ FileSystemTaskQueue: new DefaultFileSystemTaskQueue({ workspace: { DocumentUriPolicy: documentUriPolicy } }),
383
+ ModelLedger: modelLedger,
384
+ // Patched in below, as both read the tree they belong to.
385
+ VersionSyncService: {} as VersionSyncService,
386
+ DocumentReleaseHandler: {} as DocumentReleaseHandler
313
387
  },
314
- model: {} as TestSharedServices<TAst, TDiagnostic, TTransfer, TProject>['model']
388
+ model: {} as TestSharedServices<TAst, TDiagnostic, TTransfer, TProject, TTransferDiagnostic>['model'],
389
+ ServerLocale: {} as ServerLocale,
390
+ MessageRenderer: {} as DefaultMessageRenderer
315
391
  };
316
- const sharedServices = services as unknown as ServerSharedServices<TProject>;
392
+ const sharedServices = services as unknown as ServerSharedServices<TProject, TTransferDiagnostic>;
393
+
394
+ // Patched in after the literal, like `model` below: both read the tree they
395
+ // belong to, and the renderer reads the locale service.
396
+ services.workspace.VersionSyncService = new DefaultVersionSyncService(sharedServices);
397
+ services.workspace.DocumentReleaseHandler = new DefaultDocumentReleaseHandler(sharedServices);
398
+ const mutableMessages = services as { ServerLocale: ServerLocale; MessageRenderer: MessageRenderer };
399
+ const serverLocale = new DefaultServerLocale(sharedServices);
400
+ if (options.locale) {
401
+ serverLocale.accept(options.locale);
402
+ }
403
+ mutableMessages.ServerLocale = serverLocale;
404
+ const messageRenderer = options.messageRenderer?.(sharedServices) ?? new DefaultMessageRenderer(sharedServices);
405
+ mutableMessages.MessageRenderer = messageRenderer;
317
406
 
318
407
  const serialize = options.serialize ?? ((_uri: string, root: TTransfer) => JSON.stringify(root));
319
408
  const transferEncoder = options.transferEncoder
320
409
  ? options.transferEncoder(sharedServices)
321
- : new TransferEncoder<unknown, TDiagnostic>(sharedServices);
410
+ : new DefaultTransferEncoder<unknown, TTransferDiagnostic>(sharedServices);
322
411
  const modelService = options.modelService
323
412
  ? options.modelService(sharedServices)
324
413
  : makeStubModelService<TAst, TDiagnostic, TTransfer>(sharedServices, serialize, options.modelServiceOptions);
325
414
 
326
415
  const mutableModel = services.model as {
327
- TransferEncoder: TransferEncoder<unknown, TDiagnostic>;
416
+ TransferEncoder: TransferEncoder<TTransferDiagnostic>;
328
417
  ModelService: ModelService<TAst, TDiagnostic, TTransfer>;
418
+ ClientSessionFactory: ClientSessionFactory;
329
419
  };
330
420
  mutableModel.TransferEncoder = transferEncoder;
331
421
  mutableModel.ModelService = modelService;
422
+ mutableModel.ClientSessionFactory = new DefaultClientSessionFactory(sharedServices, options.clientSessionFactoryOptions);
332
423
 
333
424
  return {
334
425
  services: sharedServices,
@@ -340,12 +431,15 @@ export function makeTestServices<
340
431
  selfSaveRegistry,
341
432
  projectManager,
342
433
  documentUriPolicy,
434
+ modelLedger,
343
435
  serviceRegistry,
344
436
  indexManager,
345
437
  modelService,
346
438
  transferEncoder,
347
439
  logger,
348
440
  clock,
441
+ serverLocale,
442
+ messageRenderer,
349
443
  dispose: () => {
350
444
  // No-op: the bundled stubs hold only in-memory state (maps, arrays),
351
445
  // released with the bundle when it goes out of scope. The hook exists
@@ -71,6 +71,32 @@ export function makeCapturingLogger(): CapturingLogger {
71
71
  return { logger: new Capturing(), lines };
72
72
  }
73
73
 
74
+ /** A captured line with the logger component it was emitted under. */
75
+ export interface AttributedLine extends CapturedLine {
76
+ readonly component: string | undefined;
77
+ }
78
+
79
+ /** A {@link Logger} whose emitted lines are captured with their component. */
80
+ export interface AttributingLogger {
81
+ readonly logger: Logger;
82
+ /** Every line emitted through the logger (and its derived children), in order. */
83
+ readonly lines: AttributedLine[];
84
+ }
85
+
86
+ /** A capturing logger that also records each line's component, which {@link makeCapturingLogger} drops. */
87
+ export function makeAttributingLogger(): AttributingLogger {
88
+ const lines: AttributedLine[] = [];
89
+ class Attributing extends NoopLogger {
90
+ protected override emit(level: LogLevel, _label: string, message: string): void {
91
+ lines.push({ level, message, component: this.component });
92
+ }
93
+ protected override derive(component: string): this {
94
+ return new Attributing(component) as this;
95
+ }
96
+ }
97
+ return { logger: new Attributing(), lines };
98
+ }
99
+
74
100
  /** A {@link Tracer} whose emitted lines are captured for assertions. */
75
101
  export interface CapturingTracer {
76
102
  readonly tracer: Tracer;
@@ -27,3 +27,4 @@ export * from './lsp-harness.js';
27
27
  export * from './lsp-server-connection.js';
28
28
  export * from './scratch-workspace.js';
29
29
  export * from './spawned-server.js';
30
+ export * from './unhandled-rejections.js';
@@ -216,12 +216,14 @@ export function makeLspHarness(options: MakeLspHarnessOptions): LspHarness {
216
216
  },
217
217
  shutdown: transport.shutdown,
218
218
  openDocument: transport.openDocument,
219
+ closeDocument: transport.closeDocument,
219
220
  changeDocument: transport.changeDocument,
220
221
  completion: transport.completion,
221
222
  hover: transport.hover,
222
223
  semanticTokens: transport.semanticTokens,
223
224
  nextDiagnostics: transport.nextDiagnostics,
224
225
  appliedEdits: transport.appliedEdits,
226
+ wireBytes: transport.wireBytes,
225
227
  nextAppliedEdit: transport.nextAppliedEdit,
226
228
  setApplyEditHandler: transport.setApplyEditHandler,
227
229
  buildWorkspace: folders => buildWorkspaceProgrammatically(services, folders),