@hydranium/core 1.0.0-next.27 → 1.0.0-next.271

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 (735) hide show
  1. package/README.md +64 -82
  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 +242 -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 +86 -0
  19. package/lib/documents/dirty-state-tracker.d.ts.map +1 -0
  20. package/lib/documents/dirty-state-tracker.js +72 -0
  21. package/lib/documents/dirty-state-tracker.js.map +1 -0
  22. package/lib/documents/document-release-handler.d.ts +204 -0
  23. package/lib/documents/document-release-handler.d.ts.map +1 -0
  24. package/lib/documents/document-release-handler.js +317 -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 +401 -282
  35. package/lib/documents/hydranium-text-documents.d.ts.map +1 -1
  36. package/lib/documents/hydranium-text-documents.js +827 -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 +284 -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 +138 -0
  55. package/lib/documents/version-sync-service.d.ts.map +1 -0
  56. package/lib/documents/version-sync-service.js +173 -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 +3 -0
  63. package/lib/langium/ast-extension/ast-extension-service.d.ts.map +1 -1
  64. package/lib/langium/ast-extension/ast-extension-service.js.map +1 -1
  65. package/lib/langium/ast-extension/ast-node-builder.d.ts +32 -9
  66. package/lib/langium/ast-extension/ast-node-builder.d.ts.map +1 -1
  67. package/lib/langium/ast-extension/ast-node-builder.js +60 -22
  68. package/lib/langium/ast-extension/ast-node-builder.js.map +1 -1
  69. package/lib/langium/bootstrap.d.ts +34 -25
  70. package/lib/langium/bootstrap.d.ts.map +1 -1
  71. package/lib/langium/bootstrap.js +77 -37
  72. package/lib/langium/bootstrap.js.map +1 -1
  73. package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts +1 -1
  74. package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts.map +1 -1
  75. package/lib/langium/build-phase-pass/build-phase-pass-service.js.map +1 -1
  76. package/lib/langium/build-phase-pass/build-phase-pass.d.ts +1 -1
  77. package/lib/langium/composite-ast-reflection.d.ts +46 -0
  78. package/lib/langium/composite-ast-reflection.d.ts.map +1 -0
  79. package/lib/langium/composite-ast-reflection.js +97 -0
  80. package/lib/langium/composite-ast-reflection.js.map +1 -0
  81. package/lib/langium/config/configuration-provider.d.ts +81 -0
  82. package/lib/langium/config/configuration-provider.d.ts.map +1 -0
  83. package/lib/langium/config/configuration-provider.js +112 -0
  84. package/lib/langium/config/configuration-provider.js.map +1 -0
  85. package/lib/langium/config/index.d.ts +1 -0
  86. package/lib/langium/config/index.d.ts.map +1 -1
  87. package/lib/langium/config/index.js +1 -0
  88. package/lib/langium/config/index.js.map +1 -1
  89. package/lib/langium/config/settings.js.map +1 -1
  90. package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts +9 -20
  91. package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts.map +1 -1
  92. package/lib/langium/diagnostics/hydranium-langium-profiler.js +15 -24
  93. package/lib/langium/diagnostics/hydranium-langium-profiler.js.map +1 -1
  94. package/lib/langium/diagnostics/log-preamble.js +1 -1
  95. package/lib/langium/diagnostics/log-preamble.js.map +1 -1
  96. package/lib/langium/diagnostics/logger.d.ts +10 -3
  97. package/lib/langium/diagnostics/logger.d.ts.map +1 -1
  98. package/lib/langium/diagnostics/logger.js +12 -5
  99. package/lib/langium/diagnostics/logger.js.map +1 -1
  100. package/lib/langium/diagnostics/lsp-logger.d.ts +17 -0
  101. package/lib/langium/diagnostics/lsp-logger.d.ts.map +1 -1
  102. package/lib/langium/diagnostics/lsp-logger.js +58 -17
  103. package/lib/langium/diagnostics/lsp-logger.js.map +1 -1
  104. package/lib/langium/diagnostics/server-tracer.d.ts.map +1 -1
  105. package/lib/langium/diagnostics/server-tracer.js.map +1 -1
  106. package/lib/langium/document-builder/build-pipeline-integration.d.ts +21 -1
  107. package/lib/langium/document-builder/build-pipeline-integration.d.ts.map +1 -1
  108. package/lib/langium/document-builder/build-pipeline-integration.js +32 -5
  109. package/lib/langium/document-builder/build-pipeline-integration.js.map +1 -1
  110. package/lib/langium/document-builder/build-session.d.ts +6 -5
  111. package/lib/langium/document-builder/build-session.d.ts.map +1 -1
  112. package/lib/langium/document-builder/build-session.js +5 -5
  113. package/lib/langium/document-builder/build-session.js.map +1 -1
  114. package/lib/langium/document-builder/document-builder.d.ts +309 -35
  115. package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
  116. package/lib/langium/document-builder/document-builder.js +511 -75
  117. package/lib/langium/document-builder/document-builder.js.map +1 -1
  118. package/lib/langium/documentation/comment-provider.d.ts.map +1 -1
  119. package/lib/langium/documentation/comment-provider.js.map +1 -1
  120. package/lib/langium/integration-services.d.ts +61 -19
  121. package/lib/langium/integration-services.d.ts.map +1 -1
  122. package/lib/langium/integration-services.js +10 -5
  123. package/lib/langium/integration-services.js.map +1 -1
  124. package/lib/langium/integrity/integrity-rule.d.ts +16 -8
  125. package/lib/langium/integrity/integrity-rule.d.ts.map +1 -1
  126. package/lib/langium/integrity/integrity-rule.js.map +1 -1
  127. package/lib/langium/integrity/integrity-service.d.ts +83 -27
  128. package/lib/langium/integrity/integrity-service.d.ts.map +1 -1
  129. package/lib/langium/integrity/integrity-service.js +273 -63
  130. package/lib/langium/integrity/integrity-service.js.map +1 -1
  131. package/lib/langium/keys/containment.d.ts +64 -0
  132. package/lib/langium/keys/containment.d.ts.map +1 -0
  133. package/lib/langium/keys/containment.js +53 -0
  134. package/lib/langium/keys/containment.js.map +1 -0
  135. package/lib/langium/keys/index.d.ts +1 -0
  136. package/lib/langium/keys/index.d.ts.map +1 -1
  137. package/lib/langium/keys/index.js +1 -0
  138. package/lib/langium/keys/index.js.map +1 -1
  139. package/lib/langium/keys/name-based-key-provider.d.ts +4 -0
  140. package/lib/langium/keys/name-based-key-provider.d.ts.map +1 -1
  141. package/lib/langium/keys/name-based-key-provider.js +4 -0
  142. package/lib/langium/keys/name-based-key-provider.js.map +1 -1
  143. package/lib/langium/keys/positional-key-provider.d.ts.map +1 -1
  144. package/lib/langium/keys/positional-key-provider.js.map +1 -1
  145. package/lib/langium/labeling/label-provider.d.ts.map +1 -1
  146. package/lib/langium/labeling/label-provider.js.map +1 -1
  147. package/lib/langium/language-module.d.ts +30 -5
  148. package/lib/langium/language-module.d.ts.map +1 -1
  149. package/lib/langium/language-module.js +18 -4
  150. package/lib/langium/language-module.js.map +1 -1
  151. package/lib/langium/model-service/client-session.d.ts +343 -0
  152. package/lib/langium/model-service/client-session.d.ts.map +1 -0
  153. package/lib/langium/model-service/client-session.js +428 -0
  154. package/lib/langium/model-service/client-session.js.map +1 -0
  155. package/lib/langium/model-service/index.d.ts +2 -0
  156. package/lib/langium/model-service/index.d.ts.map +1 -1
  157. package/lib/langium/model-service/index.js +2 -0
  158. package/lib/langium/model-service/index.js.map +1 -1
  159. package/lib/langium/model-service/model-events.d.ts +61 -0
  160. package/lib/langium/model-service/model-events.d.ts.map +1 -0
  161. package/lib/langium/model-service/model-events.js +10 -0
  162. package/lib/langium/model-service/model-events.js.map +1 -0
  163. package/lib/langium/model-service/model-service.d.ts +433 -282
  164. package/lib/langium/model-service/model-service.d.ts.map +1 -1
  165. package/lib/langium/model-service/model-service.js +537 -441
  166. package/lib/langium/model-service/model-service.js.map +1 -1
  167. package/lib/langium/module.d.ts +151 -36
  168. package/lib/langium/module.d.ts.map +1 -1
  169. package/lib/langium/module.js +48 -36
  170. package/lib/langium/module.js.map +1 -1
  171. package/lib/langium/naming/name-provider.d.ts +27 -6
  172. package/lib/langium/naming/name-provider.d.ts.map +1 -1
  173. package/lib/langium/naming/name-provider.js +4 -3
  174. package/lib/langium/naming/name-provider.js.map +1 -1
  175. package/lib/langium/naming/name-separator-validation.d.ts +23 -1
  176. package/lib/langium/naming/name-separator-validation.d.ts.map +1 -1
  177. package/lib/langium/naming/name-separator-validation.js +22 -0
  178. package/lib/langium/naming/name-separator-validation.js.map +1 -1
  179. package/lib/langium/project/abstract-project-manager.d.ts.map +1 -1
  180. package/lib/langium/project/abstract-project-manager.js +13 -6
  181. package/lib/langium/project/abstract-project-manager.js.map +1 -1
  182. package/lib/langium/project/project-change-event.d.ts +2 -2
  183. package/lib/langium/project/single-project-manager.d.ts.map +1 -1
  184. package/lib/langium/project/single-project-manager.js.map +1 -1
  185. package/lib/langium/residency/cst-residency-service.d.ts +35 -12
  186. package/lib/langium/residency/cst-residency-service.d.ts.map +1 -1
  187. package/lib/langium/residency/cst-residency-service.js +23 -57
  188. package/lib/langium/residency/cst-residency-service.js.map +1 -1
  189. package/lib/langium/scope/ast-node-description-provider.d.ts.map +1 -1
  190. package/lib/langium/scope/ast-node-description-provider.js.map +1 -1
  191. package/lib/langium/scope/fallback-scope.d.ts +27 -0
  192. package/lib/langium/scope/fallback-scope.d.ts.map +1 -0
  193. package/lib/langium/scope/fallback-scope.js +35 -0
  194. package/lib/langium/scope/fallback-scope.js.map +1 -0
  195. package/lib/langium/scope/hydranium-scope-computation.d.ts +21 -18
  196. package/lib/langium/scope/hydranium-scope-computation.d.ts.map +1 -1
  197. package/lib/langium/scope/hydranium-scope-computation.js +38 -39
  198. package/lib/langium/scope/hydranium-scope-computation.js.map +1 -1
  199. package/lib/langium/scope/hydranium-scope-provider.d.ts +61 -24
  200. package/lib/langium/scope/hydranium-scope-provider.d.ts.map +1 -1
  201. package/lib/langium/scope/hydranium-scope-provider.js +74 -35
  202. package/lib/langium/scope/hydranium-scope-provider.js.map +1 -1
  203. package/lib/langium/scope/index.d.ts +1 -0
  204. package/lib/langium/scope/index.d.ts.map +1 -1
  205. package/lib/langium/scope/index.js +1 -0
  206. package/lib/langium/scope/index.js.map +1 -1
  207. package/lib/langium/scope/reference-builder.d.ts.map +1 -1
  208. package/lib/langium/scope/reference-builder.js.map +1 -1
  209. package/lib/langium/scope/reference-candidate-provider.d.ts +6 -5
  210. package/lib/langium/scope/reference-candidate-provider.d.ts.map +1 -1
  211. package/lib/langium/scope/reference-candidate-provider.js +3 -2
  212. package/lib/langium/scope/reference-candidate-provider.js.map +1 -1
  213. package/lib/langium/scope/scope-extension-service.d.ts +41 -37
  214. package/lib/langium/scope/scope-extension-service.d.ts.map +1 -1
  215. package/lib/langium/scope/scope-extension-service.js +57 -29
  216. package/lib/langium/scope/scope-extension-service.js.map +1 -1
  217. package/lib/langium/scope/scoped-ast-node-description.d.ts +1 -3
  218. package/lib/langium/scope/scoped-ast-node-description.d.ts.map +1 -1
  219. package/lib/langium/scope/scoped-ast-node-description.js +1 -3
  220. package/lib/langium/scope/scoped-ast-node-description.js.map +1 -1
  221. package/lib/langium/serialization/abstract-serializer.d.ts +11 -20
  222. package/lib/langium/serialization/abstract-serializer.d.ts.map +1 -1
  223. package/lib/langium/serialization/abstract-serializer.js +12 -21
  224. package/lib/langium/serialization/abstract-serializer.js.map +1 -1
  225. package/lib/langium/serialization/json-serializer.d.ts +1 -1
  226. package/lib/langium/serialization/json-serializer.d.ts.map +1 -1
  227. package/lib/langium/serialization/json-serializer.js.map +1 -1
  228. package/lib/langium/serialization/serializer.d.ts +1 -1
  229. package/lib/langium/serialization/yaml-serializer.d.ts.map +1 -1
  230. package/lib/langium/serialization/yaml-serializer.js.map +1 -1
  231. package/lib/langium/service-registry.d.ts +29 -1
  232. package/lib/langium/service-registry.d.ts.map +1 -1
  233. package/lib/langium/service-registry.js +37 -0
  234. package/lib/langium/service-registry.js.map +1 -1
  235. package/lib/langium/shared-services.d.ts +23 -6
  236. package/lib/langium/shared-services.d.ts.map +1 -1
  237. package/lib/langium/shared-services.js.map +1 -1
  238. package/lib/langium/single-langium-copy.d.ts +22 -0
  239. package/lib/langium/single-langium-copy.d.ts.map +1 -0
  240. package/lib/langium/single-langium-copy.js +36 -0
  241. package/lib/langium/single-langium-copy.js.map +1 -0
  242. package/lib/langium/transfer/transfer-encoder.d.ts +88 -36
  243. package/lib/langium/transfer/transfer-encoder.d.ts.map +1 -1
  244. package/lib/langium/transfer/transfer-encoder.js +46 -24
  245. package/lib/langium/transfer/transfer-encoder.js.map +1 -1
  246. package/lib/langium/trivia/comment-preserver.d.ts +423 -0
  247. package/lib/langium/trivia/comment-preserver.d.ts.map +1 -0
  248. package/lib/langium/trivia/comment-preserver.js +906 -0
  249. package/lib/langium/trivia/comment-preserver.js.map +1 -0
  250. package/lib/langium/trivia/document-ending-preserver.d.ts +43 -0
  251. package/lib/langium/trivia/document-ending-preserver.d.ts.map +1 -0
  252. package/lib/langium/trivia/document-ending-preserver.js +48 -0
  253. package/lib/langium/trivia/document-ending-preserver.js.map +1 -0
  254. package/lib/langium/trivia/index.d.ts +14 -0
  255. package/lib/langium/trivia/index.d.ts.map +1 -0
  256. package/lib/langium/trivia/index.js +14 -0
  257. package/lib/langium/trivia/index.js.map +1 -0
  258. package/lib/langium/trivia/trivia-contribution.d.ts +37 -0
  259. package/lib/langium/trivia/trivia-contribution.d.ts.map +1 -0
  260. package/lib/langium/trivia/trivia-contribution.js +10 -0
  261. package/lib/langium/trivia/trivia-contribution.js.map +1 -0
  262. package/lib/langium/trivia/trivia-preserver.d.ts +50 -0
  263. package/lib/langium/trivia/trivia-preserver.d.ts.map +1 -0
  264. package/lib/langium/trivia/trivia-preserver.js +10 -0
  265. package/lib/langium/trivia/trivia-preserver.js.map +1 -0
  266. package/lib/langium/trivia/trivia-service.d.ts +70 -0
  267. package/lib/langium/trivia/trivia-service.d.ts.map +1 -0
  268. package/lib/langium/trivia/trivia-service.js +56 -0
  269. package/lib/langium/trivia/trivia-service.js.map +1 -0
  270. package/lib/langium/update-rewrite/normalize-empty-strings.d.ts.map +1 -1
  271. package/lib/langium/update-rewrite/update-rewrite-service.d.ts +1 -1
  272. package/lib/langium/update-rewrite/update-rewrite-service.d.ts.map +1 -1
  273. package/lib/langium/update-rewrite/update-rewrite-service.js.map +1 -1
  274. package/lib/langium/update-rewrite/update-rewrite.d.ts +1 -1
  275. package/lib/langium/validation/document-validator.d.ts +280 -9
  276. package/lib/langium/validation/document-validator.d.ts.map +1 -1
  277. package/lib/langium/validation/document-validator.js +453 -8
  278. package/lib/langium/validation/document-validator.js.map +1 -1
  279. package/lib/langium/validation/validation-contribution-collector.d.ts +9 -1
  280. package/lib/langium/validation/validation-contribution-collector.d.ts.map +1 -1
  281. package/lib/langium/validation/validation-contribution-collector.js +1 -1
  282. package/lib/langium/validation/validation-contribution-collector.js.map +1 -1
  283. package/lib/langium/workspace/document-uri-policy.d.ts +15 -10
  284. package/lib/langium/workspace/document-uri-policy.d.ts.map +1 -1
  285. package/lib/langium/workspace/document-uri-policy.js +7 -5
  286. package/lib/langium/workspace/document-uri-policy.js.map +1 -1
  287. package/lib/langium/workspace/file-not-found.d.ts +23 -0
  288. package/lib/langium/workspace/file-not-found.d.ts.map +1 -0
  289. package/lib/langium/workspace/file-not-found.js +31 -0
  290. package/lib/langium/workspace/file-not-found.js.map +1 -0
  291. package/lib/langium/workspace/file-system-provider.d.ts +147 -9
  292. package/lib/langium/workspace/file-system-provider.d.ts.map +1 -1
  293. package/lib/langium/workspace/file-system-provider.js +97 -14
  294. package/lib/langium/workspace/file-system-provider.js.map +1 -1
  295. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts +56 -1
  296. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts.map +1 -1
  297. package/lib/langium/workspace/hydranium-langium-document-factory.js +79 -0
  298. package/lib/langium/workspace/hydranium-langium-document-factory.js.map +1 -1
  299. package/lib/langium/workspace/hydranium-workspace-lock.d.ts +43 -1
  300. package/lib/langium/workspace/hydranium-workspace-lock.d.ts.map +1 -1
  301. package/lib/langium/workspace/hydranium-workspace-lock.js +58 -1
  302. package/lib/langium/workspace/hydranium-workspace-lock.js.map +1 -1
  303. package/lib/langium/workspace/hydranium-workspace-manager.d.ts +82 -9
  304. package/lib/langium/workspace/hydranium-workspace-manager.d.ts.map +1 -1
  305. package/lib/langium/workspace/hydranium-workspace-manager.js +129 -12
  306. package/lib/langium/workspace/hydranium-workspace-manager.js.map +1 -1
  307. package/lib/langium/workspace/in-memory-file-system-provider.d.ts +22 -7
  308. package/lib/langium/workspace/in-memory-file-system-provider.d.ts.map +1 -1
  309. package/lib/langium/workspace/in-memory-file-system-provider.js +36 -19
  310. package/lib/langium/workspace/in-memory-file-system-provider.js.map +1 -1
  311. package/lib/langium/workspace/index-manager.d.ts.map +1 -1
  312. package/lib/langium/workspace/index-manager.js.map +1 -1
  313. package/lib/langium/workspace/index.d.ts +1 -0
  314. package/lib/langium/workspace/index.d.ts.map +1 -1
  315. package/lib/langium/workspace/index.js +1 -0
  316. package/lib/langium/workspace/index.js.map +1 -1
  317. package/lib/langium/workspace/initialize-workspace.d.ts +31 -2
  318. package/lib/langium/workspace/initialize-workspace.d.ts.map +1 -1
  319. package/lib/langium/workspace/initialize-workspace.js +13 -5
  320. package/lib/langium/workspace/initialize-workspace.js.map +1 -1
  321. package/lib/langium/workspace/langium-documents.d.ts +37 -4
  322. package/lib/langium/workspace/langium-documents.d.ts.map +1 -1
  323. package/lib/langium/workspace/langium-documents.js +49 -4
  324. package/lib/langium/workspace/langium-documents.js.map +1 -1
  325. package/lib/langium/workspace/persistent-file-system-provider.d.ts +1 -8
  326. package/lib/langium/workspace/persistent-file-system-provider.d.ts.map +1 -1
  327. package/lib/langium/workspace/persistent-file-system-provider.js +2 -8
  328. package/lib/langium/workspace/persistent-file-system-provider.js.map +1 -1
  329. package/lib/langium/workspace/self-save-registry.d.ts +84 -0
  330. package/lib/langium/workspace/self-save-registry.d.ts.map +1 -0
  331. package/lib/{documents → langium/workspace}/self-save-registry.js +33 -22
  332. package/lib/langium/workspace/self-save-registry.js.map +1 -0
  333. package/lib/langium/workspace/virtual-document.d.ts +48 -15
  334. package/lib/langium/workspace/virtual-document.d.ts.map +1 -1
  335. package/lib/langium/workspace/virtual-document.js +78 -18
  336. package/lib/langium/workspace/virtual-document.js.map +1 -1
  337. package/lib/langium/workspace/write-lock-scope.d.ts +20 -10
  338. package/lib/langium/workspace/write-lock-scope.d.ts.map +1 -1
  339. package/lib/langium/workspace/write-lock-scope.js +12 -4
  340. package/lib/langium/workspace/write-lock-scope.js.map +1 -1
  341. package/lib/launcher/integrated-server.d.ts +3 -1
  342. package/lib/launcher/integrated-server.d.ts.map +1 -1
  343. package/lib/locale/index.d.ts +10 -0
  344. package/lib/locale/index.d.ts.map +1 -0
  345. package/lib/locale/index.js +10 -0
  346. package/lib/locale/index.js.map +1 -0
  347. package/lib/locale/server-locale.d.ts +73 -0
  348. package/lib/locale/server-locale.d.ts.map +1 -0
  349. package/lib/locale/server-locale.js +61 -0
  350. package/lib/locale/server-locale.js.map +1 -0
  351. package/lib/lsp/completion/hydranium-completion-provider.d.ts +44 -2
  352. package/lib/lsp/completion/hydranium-completion-provider.d.ts.map +1 -1
  353. package/lib/lsp/completion/hydranium-completion-provider.js +68 -0
  354. package/lib/lsp/completion/hydranium-completion-provider.js.map +1 -1
  355. package/lib/lsp/connection-features.d.ts +23 -0
  356. package/lib/lsp/connection-features.d.ts.map +1 -0
  357. package/lib/lsp/connection-features.js +60 -0
  358. package/lib/lsp/connection-features.js.map +1 -0
  359. package/lib/lsp/diagnostics-connection.d.ts +27 -0
  360. package/lib/lsp/diagnostics-connection.d.ts.map +1 -0
  361. package/lib/lsp/diagnostics-connection.js +53 -0
  362. package/lib/lsp/diagnostics-connection.js.map +1 -0
  363. package/lib/lsp/hydranium-document-update-handler.d.ts +92 -81
  364. package/lib/lsp/hydranium-document-update-handler.d.ts.map +1 -1
  365. package/lib/lsp/hydranium-document-update-handler.js +155 -101
  366. package/lib/lsp/hydranium-document-update-handler.js.map +1 -1
  367. package/lib/lsp/index.d.ts +3 -1
  368. package/lib/lsp/index.d.ts.map +1 -1
  369. package/lib/lsp/index.js +3 -1
  370. package/lib/lsp/index.js.map +1 -1
  371. package/lib/lsp/lsp-latency.d.ts +39 -0
  372. package/lib/lsp/lsp-latency.d.ts.map +1 -0
  373. package/lib/lsp/lsp-latency.js +58 -0
  374. package/lib/lsp/lsp-latency.js.map +1 -0
  375. package/lib/lsp/semantic-token-provider.d.ts +34 -1
  376. package/lib/lsp/semantic-token-provider.d.ts.map +1 -1
  377. package/lib/lsp/semantic-token-provider.js +55 -8
  378. package/lib/lsp/semantic-token-provider.js.map +1 -1
  379. package/lib/lsp/shared-module.d.ts +4 -8
  380. package/lib/lsp/shared-module.d.ts.map +1 -1
  381. package/lib/lsp/shared-module.js.map +1 -1
  382. package/lib/lsp/start-language-server.d.ts +8 -7
  383. package/lib/lsp/start-language-server.d.ts.map +1 -1
  384. package/lib/lsp/start-language-server.js +13 -7
  385. package/lib/lsp/start-language-server.js.map +1 -1
  386. package/lib/messages/carriers.d.ts +18 -12
  387. package/lib/messages/carriers.d.ts.map +1 -1
  388. package/lib/messages/carriers.js +22 -13
  389. package/lib/messages/carriers.js.map +1 -1
  390. package/lib/messages/index.d.ts +4 -1
  391. package/lib/messages/index.d.ts.map +1 -1
  392. package/lib/messages/index.js +4 -1
  393. package/lib/messages/index.js.map +1 -1
  394. package/lib/messages/renderer.d.ts +142 -0
  395. package/lib/messages/renderer.d.ts.map +1 -0
  396. package/lib/messages/renderer.js +165 -0
  397. package/lib/messages/renderer.js.map +1 -0
  398. package/lib/node/event-loop-monitor.d.ts.map +1 -1
  399. package/lib/node/event-loop-monitor.js +2 -1
  400. package/lib/node/event-loop-monitor.js.map +1 -1
  401. package/lib/node/heap-ceiling.d.ts +61 -0
  402. package/lib/node/heap-ceiling.d.ts.map +1 -0
  403. package/lib/node/heap-ceiling.js +72 -0
  404. package/lib/node/heap-ceiling.js.map +1 -0
  405. package/lib/node/index.d.ts +1 -1
  406. package/lib/node/index.d.ts.map +1 -1
  407. package/lib/node/index.js +1 -1
  408. package/lib/node/index.js.map +1 -1
  409. package/lib/node/latency-from-env.d.ts +1 -1
  410. package/lib/node/latency-from-env.js +1 -1
  411. package/lib/node/lint-grammar.js.map +1 -1
  412. package/lib/node/log-preamble-node.d.ts +5 -3
  413. package/lib/node/log-preamble-node.d.ts.map +1 -1
  414. package/lib/node/log-preamble-node.js +13 -10
  415. package/lib/node/log-preamble-node.js.map +1 -1
  416. package/lib/node/measure-memory.d.ts.map +1 -1
  417. package/lib/node/measure-memory.js +5 -4
  418. package/lib/node/measure-memory.js.map +1 -1
  419. package/lib/node/memory-monitor.d.ts +2 -2
  420. package/lib/node/memory-monitor.d.ts.map +1 -1
  421. package/lib/node/memory-monitor.js +9 -10
  422. package/lib/node/memory-monitor.js.map +1 -1
  423. package/lib/node/node-file-system-provider.d.ts +54 -9
  424. package/lib/node/node-file-system-provider.d.ts.map +1 -1
  425. package/lib/node/node-file-system-provider.js +141 -52
  426. package/lib/node/node-file-system-provider.js.map +1 -1
  427. package/lib/node/profile-capture.d.ts +12 -4
  428. package/lib/node/profile-capture.d.ts.map +1 -1
  429. package/lib/node/profile-capture.js +8 -6
  430. package/lib/node/profile-capture.js.map +1 -1
  431. package/lib/node/profile-digest.js.map +1 -1
  432. package/lib/node/profiling-run.d.ts +13 -3
  433. package/lib/node/profiling-run.d.ts.map +1 -1
  434. package/lib/node/profiling-run.js +17 -8
  435. package/lib/node/profiling-run.js.map +1 -1
  436. package/lib/node/rename-over-open-readers.d.ts +61 -0
  437. package/lib/node/rename-over-open-readers.d.ts.map +1 -0
  438. package/lib/node/rename-over-open-readers.js +80 -0
  439. package/lib/node/rename-over-open-readers.js.map +1 -0
  440. package/lib/node/server-diagnostics.js +1 -1
  441. package/lib/node/server-diagnostics.js.map +1 -1
  442. package/lib/node/server-state-snapshot.js +4 -4
  443. package/lib/node/server-state-snapshot.js.map +1 -1
  444. package/lib/node/socket-launcher.d.ts +20 -4
  445. package/lib/node/socket-launcher.d.ts.map +1 -1
  446. package/lib/node/socket-launcher.js +8 -7
  447. package/lib/node/socket-launcher.js.map +1 -1
  448. package/lib/node/stdio-launcher.d.ts +6 -5
  449. package/lib/node/stdio-launcher.d.ts.map +1 -1
  450. package/lib/node/stdio-launcher.js +13 -4
  451. package/lib/node/stdio-launcher.js.map +1 -1
  452. package/lib/testing/document-uri-policy-conformance.js +1 -1
  453. package/lib/testing/document-uri-policy-conformance.js.map +1 -1
  454. package/lib/testing/fake-description.js.map +1 -1
  455. package/lib/testing/fake-document.d.ts +16 -4
  456. package/lib/testing/fake-document.d.ts.map +1 -1
  457. package/lib/testing/fake-document.js +18 -3
  458. package/lib/testing/fake-document.js.map +1 -1
  459. package/lib/testing/index.d.ts +1 -1
  460. package/lib/testing/index.d.ts.map +1 -1
  461. package/lib/testing/index.js +2 -1
  462. package/lib/testing/index.js.map +1 -1
  463. package/lib/testing/langium-test-helpers.d.ts.map +1 -1
  464. package/lib/testing/langium-test-helpers.js +1 -0
  465. package/lib/testing/langium-test-helpers.js.map +1 -1
  466. package/lib/testing/make-noop-language-services.js.map +1 -1
  467. package/lib/testing/make-noop-shared-services.d.ts +14 -0
  468. package/lib/testing/make-noop-shared-services.d.ts.map +1 -1
  469. package/lib/testing/make-noop-shared-services.js +28 -2
  470. package/lib/testing/make-noop-shared-services.js.map +1 -1
  471. package/lib/testing/make-test-services.d.ts +72 -14
  472. package/lib/testing/make-test-services.d.ts.map +1 -1
  473. package/lib/testing/make-test-services.js +42 -10
  474. package/lib/testing/make-test-services.js.map +1 -1
  475. package/lib/testing/make-test-tracer.d.ts +12 -0
  476. package/lib/testing/make-test-tracer.d.ts.map +1 -1
  477. package/lib/testing/make-test-tracer.js +13 -0
  478. package/lib/testing/make-test-tracer.js.map +1 -1
  479. package/lib/testing/node/applied-edit-capture.d.ts +29 -0
  480. package/lib/testing/node/applied-edit-capture.d.ts.map +1 -0
  481. package/lib/testing/node/applied-edit-capture.js +115 -0
  482. package/lib/testing/node/applied-edit-capture.js.map +1 -0
  483. package/lib/testing/node/golden-corpus.js.map +1 -1
  484. package/lib/testing/node/index.d.ts +1 -0
  485. package/lib/testing/node/index.d.ts.map +1 -1
  486. package/lib/testing/node/index.js +1 -0
  487. package/lib/testing/node/index.js.map +1 -1
  488. package/lib/testing/node/lsp-harness.d.ts.map +1 -1
  489. package/lib/testing/node/lsp-harness.js +2 -0
  490. package/lib/testing/node/lsp-harness.js.map +1 -1
  491. package/lib/testing/node/lsp-server-connection.d.ts +12 -4
  492. package/lib/testing/node/lsp-server-connection.d.ts.map +1 -1
  493. package/lib/testing/node/lsp-server-connection.js +45 -106
  494. package/lib/testing/node/lsp-server-connection.js.map +1 -1
  495. package/lib/testing/node/scratch-workspace.d.ts.map +1 -1
  496. package/lib/testing/node/scratch-workspace.js +10 -5
  497. package/lib/testing/node/scratch-workspace.js.map +1 -1
  498. package/lib/testing/node/spawned-server.d.ts +30 -1
  499. package/lib/testing/node/spawned-server.d.ts.map +1 -1
  500. package/lib/testing/node/spawned-server.js +39 -2
  501. package/lib/testing/node/spawned-server.js.map +1 -1
  502. package/lib/testing/node/unhandled-rejections.d.ts +20 -0
  503. package/lib/testing/node/unhandled-rejections.d.ts.map +1 -0
  504. package/lib/testing/node/unhandled-rejections.js +32 -0
  505. package/lib/testing/node/unhandled-rejections.js.map +1 -0
  506. package/lib/testing/playwright/browser-capture-bridge.js.map +1 -1
  507. package/lib/testing/playwright/e2e-profiling.js.map +1 -1
  508. package/lib/testing/playwright/flaky-network-proxy.d.ts +76 -0
  509. package/lib/testing/playwright/flaky-network-proxy.d.ts.map +1 -0
  510. package/lib/testing/playwright/flaky-network-proxy.js +164 -0
  511. package/lib/testing/playwright/flaky-network-proxy.js.map +1 -0
  512. package/lib/testing/playwright/index.d.ts +1 -0
  513. package/lib/testing/playwright/index.d.ts.map +1 -1
  514. package/lib/testing/playwright/index.js +1 -0
  515. package/lib/testing/playwright/index.js.map +1 -1
  516. package/lib/testing/playwright/server-log-capture.d.ts +35 -8
  517. package/lib/testing/playwright/server-log-capture.d.ts.map +1 -1
  518. package/lib/testing/playwright/server-log-capture.js +39 -6
  519. package/lib/testing/playwright/server-log-capture.js.map +1 -1
  520. package/lib/testing/playwright/server-log-fixture.d.ts +16 -0
  521. package/lib/testing/playwright/server-log-fixture.d.ts.map +1 -1
  522. package/lib/testing/playwright/server-log-fixture.js +25 -6
  523. package/lib/testing/playwright/server-log-fixture.js.map +1 -1
  524. package/lib/testing/playwright/server-log-region.d.ts +15 -0
  525. package/lib/testing/playwright/server-log-region.d.ts.map +1 -0
  526. package/lib/testing/playwright/server-log-region.js +30 -0
  527. package/lib/testing/playwright/server-log-region.js.map +1 -0
  528. package/lib/testing/playwright/server-log-rename-reporter.d.ts.map +1 -1
  529. package/lib/testing/playwright/server-log-rename-reporter.js +10 -1
  530. package/lib/testing/playwright/server-log-rename-reporter.js.map +1 -1
  531. package/lib/testing/run-update-pipeline.d.ts +6 -5
  532. package/lib/testing/run-update-pipeline.d.ts.map +1 -1
  533. package/lib/testing/run-update-pipeline.js.map +1 -1
  534. package/lib/testing/stub-ast-document-manager.d.ts +11 -52
  535. package/lib/testing/stub-ast-document-manager.d.ts.map +1 -1
  536. package/lib/testing/stub-ast-document-manager.js +24 -65
  537. package/lib/testing/stub-ast-document-manager.js.map +1 -1
  538. package/lib/testing/stub-document-builder.d.ts +33 -11
  539. package/lib/testing/stub-document-builder.d.ts.map +1 -1
  540. package/lib/testing/stub-document-builder.js +103 -5
  541. package/lib/testing/stub-document-builder.js.map +1 -1
  542. package/lib/testing/stub-hydranium-text-documents.d.ts +33 -10
  543. package/lib/testing/stub-hydranium-text-documents.d.ts.map +1 -1
  544. package/lib/testing/stub-hydranium-text-documents.js +115 -16
  545. package/lib/testing/stub-hydranium-text-documents.js.map +1 -1
  546. package/lib/testing/stub-index-manager.js.map +1 -1
  547. package/lib/testing/stub-langium-documents.d.ts +3 -2
  548. package/lib/testing/stub-langium-documents.d.ts.map +1 -1
  549. package/lib/testing/stub-langium-documents.js.map +1 -1
  550. package/lib/testing/stub-model-service.d.ts +9 -8
  551. package/lib/testing/stub-model-service.d.ts.map +1 -1
  552. package/lib/testing/stub-model-service.js +6 -6
  553. package/lib/testing/stub-model-service.js.map +1 -1
  554. package/lib/testing/stub-project-manager.js.map +1 -1
  555. package/lib/testing/stub-self-save-registry.d.ts +1 -1
  556. package/lib/testing/stub-self-save-registry.d.ts.map +1 -1
  557. package/lib/testing/stub-service-registry.d.ts +1 -1
  558. package/lib/testing/stub-service-registry.js.map +1 -1
  559. package/lib/testing/stub-writable-file-system.d.ts +1 -1
  560. package/lib/testing/stub-writable-file-system.d.ts.map +1 -1
  561. package/lib/testing/stub-writable-file-system.js +2 -1
  562. package/lib/testing/stub-writable-file-system.js.map +1 -1
  563. package/lib/util/connection-liveness.d.ts +19 -6
  564. package/lib/util/connection-liveness.d.ts.map +1 -1
  565. package/lib/util/connection-liveness.js +61 -15
  566. package/lib/util/connection-liveness.js.map +1 -1
  567. package/lib/util/environment.d.ts.map +1 -1
  568. package/lib/util/environment.js.map +1 -1
  569. package/lib/util/registry.d.ts.map +1 -1
  570. package/package.json +29 -53
  571. package/src/documents/ast-document-manager.ts +383 -231
  572. package/src/documents/client-ids.ts +5 -22
  573. package/src/documents/client-session-errors.ts +24 -0
  574. package/src/documents/client-session-registry.ts +262 -0
  575. package/src/documents/dirty-state-tracker.ts +140 -0
  576. package/src/documents/document-release-handler.ts +404 -0
  577. package/src/documents/document-release-scheduler.ts +121 -0
  578. package/src/documents/file-system-task-queue.ts +68 -0
  579. package/src/documents/hydranium-text-documents.ts +944 -595
  580. package/src/documents/index.ts +10 -2
  581. package/src/documents/language-client-shadow.ts +452 -0
  582. package/src/documents/model-ledger.ts +66 -0
  583. package/src/documents/text-ledger.ts +112 -0
  584. package/src/documents/version-sync-service.ts +275 -0
  585. package/src/index.ts +8 -0
  586. package/src/langium/ast-extension/ast-extension-service.ts +3 -0
  587. package/src/langium/ast-extension/ast-node-builder.ts +66 -22
  588. package/src/langium/bootstrap.ts +77 -37
  589. package/src/langium/build-phase-pass/build-phase-pass-service.ts +1 -1
  590. package/src/langium/build-phase-pass/build-phase-pass.ts +1 -1
  591. package/src/langium/composite-ast-reflection.ts +112 -0
  592. package/src/langium/config/configuration-provider.ts +119 -0
  593. package/src/langium/config/index.ts +1 -0
  594. package/src/langium/diagnostics/hydranium-langium-profiler.ts +15 -39
  595. package/src/langium/diagnostics/log-preamble.ts +1 -1
  596. package/src/langium/diagnostics/logger.ts +12 -5
  597. package/src/langium/diagnostics/lsp-logger.ts +61 -16
  598. package/src/langium/document-builder/build-pipeline-integration.ts +50 -5
  599. package/src/langium/document-builder/build-session.ts +4 -3
  600. package/src/langium/document-builder/document-builder.ts +616 -73
  601. package/src/langium/integration-services.ts +83 -24
  602. package/src/langium/integrity/integrity-rule.ts +16 -8
  603. package/src/langium/integrity/integrity-service.ts +296 -69
  604. package/src/langium/keys/containment.ts +87 -0
  605. package/src/langium/keys/index.ts +1 -0
  606. package/src/langium/keys/name-based-key-provider.ts +4 -0
  607. package/src/langium/language-module.ts +49 -8
  608. package/src/langium/model-service/client-session.ts +661 -0
  609. package/src/langium/model-service/index.ts +2 -0
  610. package/src/langium/model-service/model-events.ts +75 -0
  611. package/src/langium/model-service/model-service.ts +824 -471
  612. package/src/langium/module.ts +201 -66
  613. package/src/langium/naming/name-provider.ts +29 -7
  614. package/src/langium/naming/name-separator-validation.ts +25 -3
  615. package/src/langium/project/abstract-project-manager.ts +13 -5
  616. package/src/langium/project/project-change-event.ts +2 -2
  617. package/src/langium/residency/cst-residency-service.ts +50 -16
  618. package/src/langium/scope/fallback-scope.ts +38 -0
  619. package/src/langium/scope/hydranium-scope-computation.ts +45 -44
  620. package/src/langium/scope/hydranium-scope-provider.ts +89 -38
  621. package/src/langium/scope/index.ts +1 -0
  622. package/src/langium/scope/reference-candidate-provider.ts +6 -5
  623. package/src/langium/scope/scope-extension-service.ts +74 -59
  624. package/src/langium/scope/scoped-ast-node-description.ts +1 -3
  625. package/src/langium/serialization/abstract-serializer.ts +13 -32
  626. package/src/langium/serialization/serializer.ts +1 -1
  627. package/src/langium/service-registry.ts +41 -2
  628. package/src/langium/shared-services.ts +26 -6
  629. package/src/langium/single-langium-copy.ts +42 -0
  630. package/src/langium/transfer/transfer-encoder.ts +115 -47
  631. package/src/langium/trivia/comment-preserver.ts +1100 -0
  632. package/src/langium/trivia/document-ending-preserver.ts +55 -0
  633. package/src/langium/trivia/index.ts +14 -0
  634. package/src/langium/trivia/trivia-contribution.ts +39 -0
  635. package/src/langium/trivia/trivia-preserver.ts +54 -0
  636. package/src/langium/trivia/trivia-service.ts +99 -0
  637. package/src/langium/update-rewrite/update-rewrite-service.ts +1 -1
  638. package/src/langium/update-rewrite/update-rewrite.ts +1 -1
  639. package/src/langium/validation/document-validator.ts +528 -13
  640. package/src/langium/validation/validation-contribution-collector.ts +10 -1
  641. package/src/langium/workspace/document-uri-policy.ts +15 -10
  642. package/src/langium/workspace/file-not-found.ts +35 -0
  643. package/src/langium/workspace/file-system-provider.ts +221 -17
  644. package/src/langium/workspace/hydranium-langium-document-factory.ts +117 -0
  645. package/src/langium/workspace/hydranium-workspace-lock.ts +86 -2
  646. package/src/langium/workspace/hydranium-workspace-manager.ts +155 -16
  647. package/src/langium/workspace/in-memory-file-system-provider.ts +41 -20
  648. package/src/langium/workspace/index.ts +1 -0
  649. package/src/langium/workspace/initialize-workspace.ts +43 -5
  650. package/src/langium/workspace/langium-documents.ts +63 -5
  651. package/src/langium/workspace/persistent-file-system-provider.ts +3 -9
  652. package/src/langium/workspace/self-save-registry.ts +118 -0
  653. package/src/langium/workspace/virtual-document.ts +96 -19
  654. package/src/langium/workspace/write-lock-scope.ts +24 -11
  655. package/src/launcher/integrated-server.ts +3 -1
  656. package/src/locale/index.ts +10 -0
  657. package/src/locale/server-locale.ts +86 -0
  658. package/src/lsp/completion/hydranium-completion-provider.ts +82 -2
  659. package/src/lsp/connection-features.ts +67 -0
  660. package/src/lsp/diagnostics-connection.ts +56 -0
  661. package/src/lsp/hydranium-document-update-handler.ts +197 -110
  662. package/src/lsp/index.ts +3 -1
  663. package/src/lsp/lsp-latency.ts +62 -0
  664. package/src/lsp/semantic-token-provider.ts +74 -7
  665. package/src/lsp/shared-module.ts +4 -8
  666. package/src/lsp/start-language-server.ts +13 -7
  667. package/src/messages/carriers.ts +23 -15
  668. package/src/messages/index.ts +13 -1
  669. package/src/messages/renderer.ts +212 -0
  670. package/src/node/event-loop-monitor.ts +2 -1
  671. package/src/node/heap-ceiling.ts +108 -0
  672. package/src/node/index.ts +1 -1
  673. package/src/node/latency-from-env.ts +1 -1
  674. package/src/node/log-preamble-node.ts +20 -10
  675. package/src/node/measure-memory.ts +5 -4
  676. package/src/node/memory-monitor.ts +10 -10
  677. package/src/node/node-file-system-provider.ts +157 -56
  678. package/src/node/profile-capture.ts +16 -15
  679. package/src/node/profiling-run.ts +30 -8
  680. package/src/node/rename-over-open-readers.ts +94 -0
  681. package/src/node/server-diagnostics.ts +1 -1
  682. package/src/node/server-state-snapshot.ts +5 -5
  683. package/src/node/socket-launcher.ts +27 -11
  684. package/src/node/stdio-launcher.ts +18 -9
  685. package/src/testing/document-uri-policy-conformance.ts +1 -1
  686. package/src/testing/fake-document.ts +24 -5
  687. package/src/testing/index.ts +2 -1
  688. package/src/testing/langium-test-helpers.ts +1 -0
  689. package/src/testing/make-noop-shared-services.ts +50 -2
  690. package/src/testing/make-test-services.ts +125 -31
  691. package/src/testing/make-test-tracer.ts +26 -0
  692. package/src/testing/node/applied-edit-capture.ts +139 -0
  693. package/src/testing/node/index.ts +1 -0
  694. package/src/testing/node/lsp-harness.ts +2 -0
  695. package/src/testing/node/lsp-server-connection.ts +74 -117
  696. package/src/testing/node/scratch-workspace.ts +10 -5
  697. package/src/testing/node/spawned-server.ts +57 -3
  698. package/src/testing/node/unhandled-rejections.ts +31 -0
  699. package/src/testing/parse-semantic-root.ts +1 -1
  700. package/src/testing/playwright/flaky-network-proxy.ts +240 -0
  701. package/src/testing/playwright/index.ts +1 -0
  702. package/src/testing/playwright/server-log-capture.ts +63 -11
  703. package/src/testing/playwright/server-log-fixture.ts +46 -6
  704. package/src/testing/playwright/server-log-region.ts +32 -0
  705. package/src/testing/playwright/server-log-rename-reporter.ts +12 -1
  706. package/src/testing/run-update-pipeline.ts +6 -5
  707. package/src/testing/stub-ast-document-manager.ts +36 -138
  708. package/src/testing/stub-document-builder.ts +133 -18
  709. package/src/testing/stub-hydranium-text-documents.ts +165 -27
  710. package/src/testing/stub-langium-documents.ts +3 -2
  711. package/src/testing/stub-model-service.ts +11 -10
  712. package/src/testing/stub-self-save-registry.ts +1 -1
  713. package/src/testing/stub-service-registry.ts +1 -1
  714. package/src/testing/stub-writable-file-system.ts +3 -2
  715. package/src/util/connection-liveness.ts +67 -15
  716. package/src/util/environment.ts +9 -1
  717. package/lib/documents/language-client-text-shadow.d.ts +0 -101
  718. package/lib/documents/language-client-text-shadow.d.ts.map +0 -1
  719. package/lib/documents/language-client-text-shadow.js +0 -156
  720. package/lib/documents/language-client-text-shadow.js.map +0 -1
  721. package/lib/documents/self-save-registry.d.ts +0 -55
  722. package/lib/documents/self-save-registry.d.ts.map +0 -1
  723. package/lib/documents/self-save-registry.js.map +0 -1
  724. package/lib/lsp/instrument-connection.d.ts +0 -36
  725. package/lib/lsp/instrument-connection.d.ts.map +0 -1
  726. package/lib/lsp/instrument-connection.js +0 -62
  727. package/lib/lsp/instrument-connection.js.map +0 -1
  728. package/lib/node/process-memory.d.ts +0 -66
  729. package/lib/node/process-memory.d.ts.map +0 -1
  730. package/lib/node/process-memory.js +0 -252
  731. package/lib/node/process-memory.js.map +0 -1
  732. package/src/documents/language-client-text-shadow.ts +0 -175
  733. package/src/documents/self-save-registry.ts +0 -81
  734. package/src/lsp/instrument-connection.ts +0 -66
  735. package/src/node/process-memory.ts +0 -299
@@ -7,12 +7,18 @@
7
7
  * SPDX-License-Identifier: MIT
8
8
  ********************************************************************************/
9
9
 
10
- import type { CanonicalUri } from '@hydranium/protocol';
10
+ import { type CanonicalUri, textHash } from '@hydranium/protocol';
11
11
  import type { ApplyWorkspaceEditResult } from 'vscode-languageserver';
12
- import { Disposable } from 'vscode-languageserver';
12
+ import { Disposable, Emitter } from 'vscode-languageserver';
13
13
  import type { TextDocument } from 'vscode-languageserver-textdocument';
14
14
  import { LANGUAGE_CLIENT_ID } from '../documents/client-ids.js';
15
- import type { ClientTextDocumentChangeEvent, HydraniumTextDocuments } from '../documents/hydranium-text-documents.js';
15
+ import { ClientSessionRegistry } from '../documents/client-session-registry.js';
16
+ import type { DocumentDirtyChangedEvent } from '../documents/dirty-state-tracker.js';
17
+ import type {
18
+ ClientTextDocumentChangeEvent,
19
+ HydraniumTextDocuments,
20
+ DocumentReleasedEvent
21
+ } from '../documents/hydranium-text-documents.js';
16
22
 
17
23
  /** Snapshot of an open document tracked by the stub. */
18
24
  export interface StubTextDocumentEntry {
@@ -27,9 +33,14 @@ export interface StubTextDocumentEntry {
27
33
  * reads from on test paths — the content channel
28
34
  * (`notifyDidChangeTextDocument` / `applyContentChange` / `version` /
29
35
  * `getAuthor`), the open-state probes (`isOpenInLanguageClient` /
30
- * `isOpenInAnyClient` / `openDocuments`), the push channel to the language
31
- * client (`applyEditToLanguageClient` / `stagePendingContent`) and the
32
- * save / close notifications — plus test-only helpers:
36
+ * `isOpenInAnyClient` / `isOpenInClient` / `isReleaseDeferred` /
37
+ * `openDocuments`), the push channel
38
+ * to the language client (`applyEditToLanguageClient` / `stagePendingContent`),
39
+ * the save / close notifications, the dirty state (`isDirty` / `textState` /
40
+ * `onDidChangeDirty` / `setDiskBaseline`, against a baseline {@link seedOpen}
41
+ * sets and a save that carries its text moves), and the client-session table
42
+ * (`registerSession` / `closeSession` / `onDidCloseSession`), which is a real
43
+ * `ClientSessionRegistry` — plus test-only helpers:
33
44
  *
34
45
  * - {@link seedOpen} — pre-populate an open document without firing change
35
46
  * events. Use to set up a baseline version before exercising an `update`.
@@ -66,9 +77,21 @@ export interface StubHydraniumTextDocuments extends Pick<
66
77
  | 'getAuthor'
67
78
  | 'isOpenInLanguageClient'
68
79
  | 'isOpenInAnyClient'
80
+ | 'isReleaseDeferred'
69
81
  | 'applyEditToLanguageClient'
70
82
  | 'stagePendingContent'
71
83
  | 'openDocuments'
84
+ | 'isOpenInClient'
85
+ | 'attachClient'
86
+ | 'registerSession'
87
+ | 'closeSession'
88
+ | 'onDidCloseSession'
89
+ | 'onDidReleaseDocument'
90
+ | 'isDirty'
91
+ | 'textState'
92
+ | 'openedVersion'
93
+ | 'onDidChangeDirty'
94
+ | 'setDiskBaseline'
72
95
  > {
73
96
  /**
74
97
  * Stub-tailored read accessor. Returns just the surface the framework's
@@ -87,28 +110,46 @@ export interface StubHydraniumTextDocuments extends Pick<
87
110
  onDidSave(listener: (event: { document: { uri: string }; clientId: string }) => void): Disposable;
88
111
  /** Real-shaped close subscription — listener gets {@link ClientTextDocumentChangeEvent}. */
89
112
  onDidClose(listener: (event: ClientTextDocumentChangeEvent<TextDocument>) => void): Disposable;
90
- /** Pre-populate an open document without firing change events. */
113
+ /** Pre-populate an open document without firing change events; `text` is also its disk baseline. */
91
114
  seedOpen(uri: string, text: string, clientId: string): void;
92
115
  /** Mark `uri` as open in the LSP textual language client (drives {@link isOpenInLanguageClient}). */
93
116
  seedOpenInLanguageClient(uri: string): void;
94
- /** Synchronously deliver `onDidClose` to subscribers. */
117
+ /**
118
+ * Synchronously deliver `onDidClose` to subscribers, then `onDidReleaseDocument`
119
+ * when no client has `uri` open any more, then the dirty flip of a dropped
120
+ * holder: the real store's order. The stub keeps no release grace and runs
121
+ * no release handler, so the flip comes at once and without text, where the
122
+ * real store announces it once the handler settles, with text while the
123
+ * build still has the document.
124
+ */
95
125
  fireClose(uri: string, clientId: string): void;
96
- /** Drop recorded state. Useful for `beforeEach` resets. */
126
+ /**
127
+ * Drop recorded state. Useful for `beforeEach` resets.
128
+ *
129
+ * Sessions end without announcing it, so a model service built on this
130
+ * stub still holds the handles it started before the reset. Build a fresh
131
+ * service after a reset rather than reusing one across it.
132
+ */
97
133
  reset(): void;
98
134
  readonly changes: readonly StubTextDocumentEntry[];
99
135
  readonly saves: readonly { uri: string; clientId: string }[];
100
136
  /**
101
137
  * Decide what {@link applyEditToLanguageClient} answers, so a suite can drive
102
138
  * the rejection path (`{ applied: false }`) the real client takes when its
103
- * buffer has outrun the version the push was addressed at. The call is still
104
- * recorded in {@link appliedEdits} either way. Defaults to accepting.
139
+ * buffer has outrun the version the push was addressed at. The push is still
140
+ * recorded in {@link appliedEdits} either way. Defaults to accepting; not
141
+ * called for a URI not open in the language client.
105
142
  *
106
143
  * The handler runs INSIDE the call, which is also the only place a suite can
107
144
  * simulate something happening while the push is in flight — a newer settle,
108
145
  * a concurrent client edit.
109
146
  */
110
147
  setApplyEditHandler(handler: (uri: string, text: string) => ApplyWorkspaceEditResult | undefined): void;
111
- /** Replay of every {@link applyEditToLanguageClient} call (the text channel to Monaco). */
148
+ /**
149
+ * Replay of every push {@link applyEditToLanguageClient} sent (the text
150
+ * channel to Monaco): none for a URI not seeded open in the language client,
151
+ * as the real store sends none.
152
+ */
112
153
  readonly appliedEdits: readonly { uri: string; text: string; label?: string }[];
113
154
  /** Replay of every {@link stagePendingContent} call (the not-yet-open staging path). */
114
155
  readonly staged: readonly { uri: string; text: string }[];
@@ -125,8 +166,37 @@ export function makeStubHydraniumTextDocuments(): StubHydraniumTextDocuments {
125
166
  let applyEditHandler: (uri: string, text: string) => ApplyWorkspaceEditResult | undefined = () => ({ applied: true });
126
167
  const saveListeners: Array<(event: { document: { uri: string }; clientId: string }) => void> = [];
127
168
  const closeListeners: Array<(event: ClientTextDocumentChangeEvent<TextDocument>) => void> = [];
169
+ // The real registry, so the session table, the opens and the closing state
170
+ // behave as the store's do. The stub's plain-string keys
171
+ // stand in for canonical URIs (one stub-boundary cast, like `fireClose`).
172
+ const sessions = new ClientSessionRegistry();
173
+ const key = (uri: string): CanonicalUri => uri as CanonicalUri;
174
+ const documentReleased = new Emitter<DocumentReleasedEvent>();
175
+ const baselines = new Map<string, string | undefined>();
176
+ const openedVersions = new Map<string, number>();
177
+ const dirty = new Set<string>();
178
+ const dirtyChanged = new Emitter<DocumentDirtyChangedEvent>();
179
+ // As the real store: dirty while held with text other than the baseline,
180
+ // announced only when the answer changes.
181
+ const refreshDirty = (uri: string): void => {
182
+ const held = docs.get(uri);
183
+ const now = held !== undefined && held.text !== baselines.get(uri);
184
+ if (now !== dirty.has(uri)) {
185
+ if (now) {
186
+ dirty.add(uri);
187
+ } else {
188
+ dirty.delete(uri);
189
+ }
190
+ // No build behind the stub, so a document no longer held is announced without text.
191
+ dirtyChanged.fire(
192
+ held === undefined
193
+ ? { uri: key(uri) }
194
+ : { uri: key(uri), text: { version: held.version, hash: textHash(held.text), dirty: now } }
195
+ );
196
+ }
197
+ };
128
198
 
129
- return {
199
+ const stub: StubHydraniumTextDocuments = {
130
200
  get changes() {
131
201
  return changes;
132
202
  },
@@ -146,6 +216,13 @@ export function makeStubHydraniumTextDocuments(): StubHydraniumTextDocuments {
146
216
  version(uri) {
147
217
  return docs.get(uri)?.version ?? 0;
148
218
  },
219
+ openedVersion(uri) {
220
+ return docs.has(uri) ? openedVersions.get(uri) : undefined;
221
+ },
222
+ textState(uri) {
223
+ const held = docs.get(uri);
224
+ return held && { version: held.version, hash: textHash(held.text), dirty: dirty.has(uri) };
225
+ },
149
226
  notifyDidChangeTextDocument(event, clientId = LANGUAGE_CLIENT_ID) {
150
227
  const existing = docs.get(event.textDocument.uri);
151
228
  const next: StubTextDocumentEntry = {
@@ -159,6 +236,7 @@ export function makeStubHydraniumTextDocuments(): StubHydraniumTextDocuments {
159
236
  }
160
237
  docs.set(event.textDocument.uri, next);
161
238
  changes.push(next);
239
+ refreshDirty(event.textDocument.uri);
162
240
  },
163
241
  applyContentChange(uri, text, clientId) {
164
242
  const existing = docs.get(uri);
@@ -172,9 +250,13 @@ export function makeStubHydraniumTextDocuments(): StubHydraniumTextDocuments {
172
250
  const next: StubTextDocumentEntry = changed ? { uri, version: existing.version + 1, text, clientId } : existing;
173
251
  docs.set(uri, next);
174
252
  changes.push({ uri, version: next.version, text, clientId });
253
+ refreshDirty(uri);
175
254
  return next.version;
176
255
  },
177
256
  notifyDidSaveTextDocument(event, clientId) {
257
+ if (event.text !== undefined) {
258
+ stub.setDiskBaseline(event.textDocument.uri, event.text);
259
+ }
178
260
  saves.push({ uri: event.textDocument.uri, clientId });
179
261
  for (const listener of saveListeners.slice()) {
180
262
  listener({ document: { uri: event.textDocument.uri }, clientId });
@@ -207,26 +289,61 @@ export function makeStubHydraniumTextDocuments(): StubHydraniumTextDocuments {
207
289
  isOpenInAnyClient(uri) {
208
290
  return docs.has(uri) || languageClientOpen.has(uri);
209
291
  },
210
- openDocuments() {
211
- // Merge the two seeding channels: `seedOpen` records the holding client
212
- // on the doc entry, `seedOpenInLanguageClient` marks the LSP client.
213
- const clientsByUri = new Map<string, Set<string>>();
214
- for (const [uri, entry] of docs) {
215
- clientsByUri.set(uri, new Set([entry.clientId]));
292
+ isOpenInClient(uri, clientId) {
293
+ return sessions.isOpenIn(key(uri), clientId);
294
+ },
295
+ isReleaseDeferred() {
296
+ // The stub keeps no release grace.
297
+ return false;
298
+ },
299
+ attachClient(uri, clientId) {
300
+ return docs.has(uri) && sessions.addOpen(key(uri), clientId);
301
+ },
302
+ registerSession(clientId) {
303
+ sessions.register(clientId);
304
+ },
305
+ closeSession(clientId, cause) {
306
+ if (!sessions.isRegistered(clientId)) {
307
+ return;
216
308
  }
217
- for (const uri of languageClientOpen) {
218
- const clients = clientsByUri.get(uri) ?? new Set<string>();
219
- clients.add(LANGUAGE_CLIENT_ID);
220
- clientsByUri.set(uri, clients);
309
+ try {
310
+ for (const uri of sessions.beginClose(clientId)) {
311
+ stub.fireClose(uri, clientId);
312
+ }
313
+ } finally {
314
+ sessions.unregister(clientId, cause);
221
315
  }
222
- // The real store keys by canonical identity; the stub's plain-string
223
- // keys stand in for it (single stub-boundary cast, like `fireClose`).
224
- return [...clientsByUri].map(([uri, clients]) => ({ uri: uri as CanonicalUri, clients: [...clients] }));
316
+ },
317
+ get onDidCloseSession() {
318
+ return sessions.onDidCloseSession;
319
+ },
320
+ get onDidReleaseDocument() {
321
+ return documentReleased.event;
322
+ },
323
+ isDirty(uri) {
324
+ return dirty.has(uri);
325
+ },
326
+ get onDidChangeDirty() {
327
+ return dirtyChanged.event;
328
+ },
329
+ setDiskBaseline(uri, text) {
330
+ if (docs.has(uri)) {
331
+ baselines.set(uri, text);
332
+ refreshDirty(uri);
333
+ }
334
+ },
335
+ openDocuments() {
336
+ // From the registry that also answers `isOpenInClient`, which both
337
+ // seeding channels feed, so the two never disagree about an open.
338
+ return sessions.openDocuments();
225
339
  },
226
340
  setApplyEditHandler(handler) {
227
341
  applyEditHandler = handler;
228
342
  },
229
343
  async applyEditToLanguageClient(uri, newText, options): Promise<ApplyWorkspaceEditResult | undefined> {
344
+ if (!languageClientOpen.has(uri)) {
345
+ return undefined;
346
+ }
230
347
  appliedEdits.push({ uri, text: newText, label: options?.label });
231
348
  return applyEditHandler(uri, newText);
232
349
  },
@@ -234,9 +351,13 @@ export function makeStubHydraniumTextDocuments(): StubHydraniumTextDocuments {
234
351
  staged.push({ uri, text });
235
352
  },
236
353
  seedOpen(uri, text, clientId) {
354
+ sessions.addOpen(key(uri), clientId);
237
355
  docs.set(uri, { uri, version: 1, text, clientId });
356
+ openedVersions.set(uri, 1);
357
+ baselines.set(uri, text);
238
358
  },
239
359
  seedOpenInLanguageClient(uri) {
360
+ sessions.addOpen(key(uri), LANGUAGE_CLIENT_ID);
240
361
  languageClientOpen.add(uri);
241
362
  },
242
363
  fireClose(uri, clientId) {
@@ -244,9 +365,11 @@ export function makeStubHydraniumTextDocuments(): StubHydraniumTextDocuments {
244
365
  // class: listeners detect the last-close transition by consulting
245
366
  // `isOpenInAnyClient`, which reads the already-decremented state.
246
367
  const holder = docs.get(uri);
247
- if (holder && holder.clientId === clientId) {
368
+ const dropped = holder !== undefined && holder.clientId === clientId;
369
+ if (dropped) {
248
370
  docs.delete(uri);
249
371
  }
372
+ const removed = sessions.removeOpen(key(uri), clientId);
250
373
  if (clientId === LANGUAGE_CLIENT_ID) {
251
374
  languageClientOpen.delete(uri);
252
375
  }
@@ -254,6 +377,13 @@ export function makeStubHydraniumTextDocuments(): StubHydraniumTextDocuments {
254
377
  for (const listener of closeListeners.slice()) {
255
378
  listener(event);
256
379
  }
380
+ if (removed && !sessions.isOpen(key(uri))) {
381
+ documentReleased.fire({ uri: key(uri) });
382
+ }
383
+ // After the release event, in the order the real store announces them.
384
+ if (dropped) {
385
+ refreshDirty(uri);
386
+ }
257
387
  },
258
388
  reset() {
259
389
  docs.clear();
@@ -262,9 +392,17 @@ export function makeStubHydraniumTextDocuments(): StubHydraniumTextDocuments {
262
392
  languageClientOpen.clear();
263
393
  appliedEdits.length = 0;
264
394
  staged.length = 0;
395
+ baselines.clear();
396
+ openedVersions.clear();
397
+ dirty.clear();
265
398
  saveListeners.length = 0;
266
399
  closeListeners.length = 0;
267
400
  applyEditHandler = () => ({ applied: true });
401
+ // Cleared in place rather than replaced: a model service built on the
402
+ // stub subscribed to `onDidCloseSession` once, and a new registry would
403
+ // leave that subscription on one nothing fires.
404
+ sessions.clear();
268
405
  }
269
406
  };
407
+ return stub;
270
408
  }
@@ -9,6 +9,7 @@
9
9
 
10
10
  import { type AstNode, type LangiumDocument, type LangiumDocuments, stream, type URI } from '@hydranium/langium';
11
11
  import { makeFakeAstNode, makeFakeDocument, type FakeDocumentOptions } from './fake-document.js';
12
+ import { type AstDiagnostic } from '../langium/validation/document-validator.js';
12
13
 
13
14
  /**
14
15
  * Map-backed stub for Langium's {@link LangiumDocuments} registry. Implements
@@ -31,7 +32,7 @@ import { makeFakeAstNode, makeFakeDocument, type FakeDocumentOptions } from './f
31
32
  * production code reads the slot value through the `LangiumDocuments`
32
33
  * interface and a narrowing cast bridges the stub at the binding site.
33
34
  */
34
- export interface StubLangiumDocuments<TAst extends AstNode = AstNode, TDiagnostic = unknown> extends Pick<
35
+ export interface StubLangiumDocuments<TAst extends AstNode = AstNode, TDiagnostic extends AstDiagnostic = AstDiagnostic> extends Pick<
35
36
  LangiumDocuments,
36
37
  'getDocument' | 'hasDocument' | 'getOrCreateDocument' | 'all'
37
38
  > {
@@ -51,7 +52,7 @@ export interface StubLangiumDocuments<TAst extends AstNode = AstNode, TDiagnosti
51
52
  * Build a {@link StubLangiumDocuments}. Seed entries via the optional
52
53
  * `seeds` parameter so simple tests don't need a separate `set` call.
53
54
  */
54
- export function makeStubLangiumDocuments<TAst extends AstNode = AstNode, TDiagnostic = unknown>(
55
+ export function makeStubLangiumDocuments<TAst extends AstNode = AstNode, TDiagnostic extends AstDiagnostic = AstDiagnostic>(
55
56
  seeds: ReadonlyArray<{ uri: string | URI; root: TAst; options?: FakeDocumentOptions<TAst, TDiagnostic> }> = []
56
57
  ): StubLangiumDocuments<TAst, TDiagnostic> {
57
58
  const docs = new Map<string, LangiumDocument<TAst>>();
@@ -7,9 +7,10 @@
7
7
  * SPDX-License-Identifier: MIT
8
8
  ********************************************************************************/
9
9
 
10
- import type { TransferDiagnostic, TransferElement } from '@hydranium/protocol';
10
+ import type { TransferElement } from '@hydranium/protocol';
11
+ import type { AstDiagnostic } from '../langium/validation/document-validator.js';
11
12
  import type { AstNode } from '@hydranium/langium';
12
- import { ModelService, type ModelServiceOptions } from '../langium/model-service/model-service.js';
13
+ import { DefaultModelService, type ModelService, type ModelServiceOptions } from '../langium/model-service/model-service.js';
13
14
  import type { ServerSharedServices } from '../langium/module.js';
14
15
 
15
16
  /**
@@ -21,9 +22,9 @@ import type { ServerSharedServices } from '../langium/module.js';
21
22
  */
22
23
  class StubModelServiceImpl<
23
24
  TAst extends AstNode,
24
- TDiagnostic extends TransferDiagnostic = TransferDiagnostic,
25
+ TDiagnostic extends AstDiagnostic = AstDiagnostic,
25
26
  TTransfer extends TransferElement = TransferElement
26
- > extends ModelService<TAst, TDiagnostic, TTransfer> {
27
+ > extends DefaultModelService<TAst, TDiagnostic, TTransfer> {
27
28
  constructor(
28
29
  services: ServerSharedServices,
29
30
  protected readonly serializeFn: (uri: string, root: TTransfer) => string,
@@ -40,7 +41,7 @@ class StubModelServiceImpl<
40
41
  /** The type of the model-service test double produced by {@link makeStubModelService}. */
41
42
  export type StubModelService<
42
43
  TAst extends AstNode,
43
- TDiagnostic extends TransferDiagnostic = TransferDiagnostic,
44
+ TDiagnostic extends AstDiagnostic = AstDiagnostic,
44
45
  TTransfer extends TransferElement = TransferElement
45
46
  > = ModelService<TAst, TDiagnostic, TTransfer>;
46
47
 
@@ -52,16 +53,16 @@ export type StubModelService<
52
53
  * `makeTestServices` wires this stub automatically.
53
54
  *
54
55
  * `options` are the framework {@link ModelServiceOptions}, forwarded verbatim, so
55
- * a test can exercise an option-gated code path (`serializeBuilds`, the slow-warn
56
- * threshold) without hand-rolling a subclass just to reach the constructor.
56
+ * a test can exercise an option-gated code path (`allowReentrantBuilds`) without
57
+ * hand-rolling a subclass just to reach the constructor.
57
58
  *
58
59
  * Adopters that need richer override behaviour — the framework's own extension
59
- * surface is {@link ModelService.rewriteModel} alongside `serialize` — should
60
- * subclass {@link ModelService} directly instead.
60
+ * surface is {@link DefaultModelService.rewriteModel} alongside `serialize` —
61
+ * should subclass {@link DefaultModelService} directly instead.
61
62
  */
62
63
  export function makeStubModelService<
63
64
  TAst extends AstNode,
64
- TDiagnostic extends TransferDiagnostic = TransferDiagnostic,
65
+ TDiagnostic extends AstDiagnostic = AstDiagnostic,
65
66
  TTransfer extends TransferElement = TransferElement
66
67
  >(
67
68
  services: ServerSharedServices,
@@ -7,7 +7,7 @@
7
7
  * SPDX-License-Identifier: MIT
8
8
  ********************************************************************************/
9
9
 
10
- import type { SelfSaveRegistry } from '../documents/self-save-registry.js';
10
+ import type { SelfSaveRegistry } from '../langium/workspace/self-save-registry.js';
11
11
 
12
12
  /**
13
13
  * Stub for the framework's {@link SelfSaveRegistry}. Records `register` calls
@@ -29,7 +29,7 @@ export interface StubLanguageDescriptor {
29
29
  * AST `$type`s this language's grammar produces. Synthesised into a minimal
30
30
  * `Grammar` — one entry-less parser rule per type — which is exactly what
31
31
  * `collectProducibleTypes` reads, so type→language routing
32
- * (`buildLanguageTypeIndex`, `DataServer.resolveReferenceLanguage`) resolves
32
+ * (`buildLanguageTypeIndex`, `ExtendedServiceRegistry.getLanguageFor`) resolves
33
33
  * against this stub the same way it does against generated grammars.
34
34
  *
35
35
  * Entry-less on purpose: `reachableParserRules` falls back to every parser
@@ -8,7 +8,8 @@
8
8
  ********************************************************************************/
9
9
 
10
10
  import type { URI } from '@hydranium/langium';
11
- import type { WritableFileSystemProvider } from '../documents/ast-document-manager.js';
11
+ import { SystemClock } from '@hydranium/protocol';
12
+ import type { WritableFileSystemProvider } from '../langium/workspace/file-system-provider.js';
12
13
  import type { StubSelfSaveRegistry } from './stub-self-save-registry.js';
13
14
 
14
15
  /**
@@ -49,7 +50,7 @@ export function makeStubWritableFileSystem(selfSaveRegistry?: StubSelfSaveRegist
49
50
  readDirectory: async () => [],
50
51
  async writeFile(uri: URI, content: string) {
51
52
  writes.push({ uri: uri.toString(), content });
52
- selfSaveRegistry?.register(uri.fsPath, Date.now());
53
+ selfSaveRegistry?.register(uri.fsPath, new SystemClock().now());
53
54
  },
54
55
  reset() {
55
56
  writes.length = 0;
@@ -7,41 +7,93 @@
7
7
  * SPDX-License-Identifier: MIT
8
8
  ********************************************************************************/
9
9
 
10
+ import { describeError } from '@hydranium/protocol';
11
+
10
12
  /**
11
- * Phrases `vscode-jsonrpc` uses when a call loses its connection. Matched on the
12
- * message because the condition surfaces in two different shapes:
13
+ * Phrases that mean a call lost its connection. Matched on the message because
14
+ * the condition surfaces in shapes that share no discriminator:
13
15
  *
14
16
  * - a **throw** from `throwIfClosedOrDisposed` (`Connection is disposed.` /
15
17
  * `Connection is closed.`), a `ConnectionError` raised synchronously by
16
18
  * `sendRequest` / `sendNotification` and by `RemoteConsole.send`;
17
19
  * - a **rejection** of an already-issued request (`Pending response rejected
18
20
  * since connection got disposed`), a `ResponseError` produced when the
19
- * pending-response map is drained on teardown.
21
+ * pending-response map is drained on teardown;
22
+ * - a **write into a destroyed transport** (`Cannot call write after a stream
23
+ * was destroyed`), Node's own error for a message the writer queued before
24
+ * the connection was disposed and flushed after its stream was destroyed.
25
+ * A notification rejects with Node's error itself, which
26
+ * {@link isDestroyedStreamError} catches by its code; a request rejects with
27
+ * a `ResponseError` that copies only the message, so the phrase is needed
28
+ * too.
20
29
  *
21
- * Both are typed, but they are different error classes carrying codes from
22
- * different enums, so no single code check covers both. Kept
23
- * lowercase-normalised and anchored on `connection` so an unrelated "disposed"
24
- * message cannot match.
30
+ * The typed errors come from different classes carrying codes from different
31
+ * enums, so no single code check covers them. Kept lowercase-normalised and
32
+ * anchored on `connection` or `stream` so an unrelated "disposed" message
33
+ * cannot match.
25
34
  */
26
- const CONNECTION_GONE_PATTERNS = [/connection is disposed/, /connection is closed/, /connection got disposed/, /connection got closed/];
35
+ const CONNECTION_GONE_PATTERNS = [
36
+ /connection is disposed/,
37
+ /connection is closed/,
38
+ /connection got disposed/,
39
+ /connection got closed/,
40
+ /after a stream was destroyed/
41
+ ];
42
+
43
+ const DESTROYED_STREAM_CODE = 'ERR_STREAM_DESTROYED';
44
+
45
+ function isDestroyedStreamError(err: unknown): boolean {
46
+ return err instanceof Error && 'code' in err && err.code === DESTROYED_STREAM_CODE;
47
+ }
27
48
 
28
49
  /**
29
50
  * Whether `err` means "the peer is gone", as opposed to a genuine failure of
30
51
  * the operation.
31
52
  *
32
- * The distinction is a **log-severity** one, and it matters because the two are
33
- * indistinguishable at the call site otherwise. Pushing an edit to a language
34
- * client that has already disconnected is a no-op, not a fault — it happens on
35
- * every ordinary shutdown, and reporting it at `error` turns routine teardown
36
- * into something that looks like it needs investigation. A real `applyEdit`
37
- * failure (the client refused, the request malformed) still deserves `error`.
53
+ * The two are indistinguishable at the call site otherwise, and callers act on
54
+ * the answer: a gone peer is logged at `debug` or dropped, a genuine failure is
55
+ * logged at `error` or re-raised as an unhandled rejection. Pushing an edit to
56
+ * a language client that has already disconnected is a no-op, not a fault — it
57
+ * happens on every ordinary shutdown — so a `false` here turns routine teardown
58
+ * into errors that look like they need investigation. A `true` for a real
59
+ * `applyEdit` failure (the client refused, the request malformed) hides it.
38
60
  *
39
61
  * Callers that only need to *survive* a dead connection rather than classify it
40
62
  * should just catch — see `LspLogger.emit`, whose fallback path does exactly
41
63
  * that, since a logger has nowhere to report a logging failure anyway.
42
64
  */
43
65
  export function isConnectionGoneError(err: unknown): boolean {
44
- const message = err instanceof Error ? err.message : String(err);
66
+ if (isDestroyedStreamError(err)) {
67
+ return true;
68
+ }
69
+ const message = describeError(err);
45
70
  const normalized = message.toLowerCase();
46
71
  return CONNECTION_GONE_PATTERNS.some(pattern => pattern.test(normalized));
47
72
  }
73
+
74
+ const SOCKET_GONE_CODES = new Set(['EPIPE', 'ECONNRESET']);
75
+
76
+ /** `write EPIPE` / `read ECONNRESET`, as a request's `ResponseError` copies the message. */
77
+ const SOCKET_GONE_PATTERN = /\b(epipe|econnreset)\b/;
78
+
79
+ /**
80
+ * Whether `err` means the client a connection serves has gone: what
81
+ * {@link isConnectionGoneError} recognises, or a write to a socket the client
82
+ * closed (`EPIPE`, `ECONNRESET`), matched by code or, for a request, by the
83
+ * code's name in the message.
84
+ *
85
+ * Only for a call whose errors can come from that connection alone. A socket
86
+ * error names no peer, so where a file system or another socket can fail the
87
+ * same call, it is a genuine failure and {@link isConnectionGoneError} is the
88
+ * one to ask.
89
+ */
90
+ export function isClientGoneError(err: unknown): boolean {
91
+ if (isConnectionGoneError(err)) {
92
+ return true;
93
+ }
94
+ if (err instanceof Error && 'code' in err && typeof err.code === 'string' && SOCKET_GONE_CODES.has(err.code)) {
95
+ return true;
96
+ }
97
+ const message = describeError(err);
98
+ return SOCKET_GONE_PATTERN.test(message.toLowerCase());
99
+ }
@@ -44,7 +44,15 @@ export function isCaseInsensitiveFileSystem(): boolean {
44
44
 
45
45
  /** Node `process` lifecycle / error / signal events accepted by {@link onProcessEvent}. */
46
46
  export type ProcessEvent =
47
- 'exit' | 'beforeExit' | 'uncaughtException' | 'unhandledRejection' | 'rejectionHandled' | 'warning' | 'SIGINT' | 'SIGTERM' | 'SIGHUP';
47
+ | 'exit'
48
+ | 'beforeExit'
49
+ | 'uncaughtException'
50
+ | 'unhandledRejection'
51
+ | 'rejectionHandled'
52
+ | 'warning'
53
+ | 'SIGINT'
54
+ | 'SIGTERM'
55
+ | 'SIGHUP';
48
56
 
49
57
  /**
50
58
  * Register a process lifecycle handler (`'exit'`, `'unhandledRejection'`, …) if