@hydranium/core 1.0.0-next.30 → 1.0.0-next.300

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 (770) hide show
  1. package/README.md +72 -82
  2. package/lib/browser/host-heads-in-worker.d.ts +58 -0
  3. package/lib/browser/host-heads-in-worker.d.ts.map +1 -0
  4. package/lib/browser/host-heads-in-worker.js +113 -0
  5. package/lib/browser/host-heads-in-worker.js.map +1 -0
  6. package/lib/browser/index.d.ts +12 -0
  7. package/lib/browser/index.d.ts.map +1 -0
  8. package/lib/browser/index.js +17 -0
  9. package/lib/browser/index.js.map +1 -0
  10. package/lib/browser/indexeddb-file-system-store.d.ts +82 -0
  11. package/lib/browser/indexeddb-file-system-store.d.ts.map +1 -0
  12. package/lib/browser/indexeddb-file-system-store.js +181 -0
  13. package/lib/browser/indexeddb-file-system-store.js.map +1 -0
  14. package/lib/browser/start-language-server-in-worker.d.ts +29 -0
  15. package/lib/browser/start-language-server-in-worker.d.ts.map +1 -0
  16. package/lib/browser/start-language-server-in-worker.js +35 -0
  17. package/lib/browser/start-language-server-in-worker.js.map +1 -0
  18. package/lib/documents/ast-document-manager.d.ts +256 -124
  19. package/lib/documents/ast-document-manager.d.ts.map +1 -1
  20. package/lib/documents/ast-document-manager.js +293 -132
  21. package/lib/documents/ast-document-manager.js.map +1 -1
  22. package/lib/documents/client-ids.d.ts +5 -19
  23. package/lib/documents/client-ids.d.ts.map +1 -1
  24. package/lib/documents/client-ids.js +5 -19
  25. package/lib/documents/client-ids.js.map +1 -1
  26. package/lib/documents/client-session-errors.d.ts +15 -0
  27. package/lib/documents/client-session-errors.d.ts.map +1 -0
  28. package/lib/documents/client-session-errors.js +15 -0
  29. package/lib/documents/client-session-errors.js.map +1 -0
  30. package/lib/documents/client-session-registry.d.ts +146 -0
  31. package/lib/documents/client-session-registry.d.ts.map +1 -0
  32. package/lib/documents/client-session-registry.js +207 -0
  33. package/lib/documents/client-session-registry.js.map +1 -0
  34. package/lib/documents/dirty-state-tracker.d.ts +101 -0
  35. package/lib/documents/dirty-state-tracker.d.ts.map +1 -0
  36. package/lib/documents/dirty-state-tracker.js +85 -0
  37. package/lib/documents/dirty-state-tracker.js.map +1 -0
  38. package/lib/documents/document-release-handler.d.ts +204 -0
  39. package/lib/documents/document-release-handler.d.ts.map +1 -0
  40. package/lib/documents/document-release-handler.js +317 -0
  41. package/lib/documents/document-release-handler.js.map +1 -0
  42. package/lib/documents/document-release-scheduler.d.ts +67 -0
  43. package/lib/documents/document-release-scheduler.d.ts.map +1 -0
  44. package/lib/documents/document-release-scheduler.js +80 -0
  45. package/lib/documents/document-release-scheduler.js.map +1 -0
  46. package/lib/documents/file-system-task-queue.d.ts +52 -0
  47. package/lib/documents/file-system-task-queue.d.ts.map +1 -0
  48. package/lib/documents/file-system-task-queue.js +37 -0
  49. package/lib/documents/file-system-task-queue.js.map +1 -0
  50. package/lib/documents/hydranium-text-documents.d.ts +419 -282
  51. package/lib/documents/hydranium-text-documents.d.ts.map +1 -1
  52. package/lib/documents/hydranium-text-documents.js +856 -483
  53. package/lib/documents/hydranium-text-documents.js.map +1 -1
  54. package/lib/documents/index.d.ts +10 -2
  55. package/lib/documents/index.d.ts.map +1 -1
  56. package/lib/documents/index.js +10 -2
  57. package/lib/documents/index.js.map +1 -1
  58. package/lib/documents/language-client-shadow.d.ts +218 -0
  59. package/lib/documents/language-client-shadow.d.ts.map +1 -0
  60. package/lib/documents/language-client-shadow.js +284 -0
  61. package/lib/documents/language-client-shadow.js.map +1 -0
  62. package/lib/documents/model-ledger.d.ts +47 -0
  63. package/lib/documents/model-ledger.d.ts.map +1 -0
  64. package/lib/documents/model-ledger.js +30 -0
  65. package/lib/documents/model-ledger.js.map +1 -0
  66. package/lib/documents/text-ledger.d.ts +64 -0
  67. package/lib/documents/text-ledger.d.ts.map +1 -0
  68. package/lib/documents/text-ledger.js +63 -0
  69. package/lib/documents/text-ledger.js.map +1 -0
  70. package/lib/documents/version-sync-service.d.ts +138 -0
  71. package/lib/documents/version-sync-service.d.ts.map +1 -0
  72. package/lib/documents/version-sync-service.js +173 -0
  73. package/lib/documents/version-sync-service.js.map +1 -0
  74. package/lib/index.d.ts +5 -0
  75. package/lib/index.d.ts.map +1 -1
  76. package/lib/index.js +8 -0
  77. package/lib/index.js.map +1 -1
  78. package/lib/langium/ast-extension/ast-extension-service.d.ts +42 -31
  79. package/lib/langium/ast-extension/ast-extension-service.d.ts.map +1 -1
  80. package/lib/langium/ast-extension/ast-extension-service.js +45 -19
  81. package/lib/langium/ast-extension/ast-extension-service.js.map +1 -1
  82. package/lib/langium/ast-extension/ast-node-builder.d.ts +32 -9
  83. package/lib/langium/ast-extension/ast-node-builder.d.ts.map +1 -1
  84. package/lib/langium/ast-extension/ast-node-builder.js +60 -22
  85. package/lib/langium/ast-extension/ast-node-builder.js.map +1 -1
  86. package/lib/langium/bootstrap.d.ts +49 -36
  87. package/lib/langium/bootstrap.d.ts.map +1 -1
  88. package/lib/langium/bootstrap.js +91 -45
  89. package/lib/langium/bootstrap.js.map +1 -1
  90. package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts +9 -9
  91. package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts.map +1 -1
  92. package/lib/langium/build-phase-pass/build-phase-pass-service.js +25 -16
  93. package/lib/langium/build-phase-pass/build-phase-pass-service.js.map +1 -1
  94. package/lib/langium/build-phase-pass/build-phase-pass.d.ts +20 -8
  95. package/lib/langium/build-phase-pass/build-phase-pass.d.ts.map +1 -1
  96. package/lib/langium/build-phase-pass/build-phase-pass.js +20 -0
  97. package/lib/langium/build-phase-pass/build-phase-pass.js.map +1 -1
  98. package/lib/langium/composite-ast-reflection.d.ts +46 -0
  99. package/lib/langium/composite-ast-reflection.d.ts.map +1 -0
  100. package/lib/langium/composite-ast-reflection.js +97 -0
  101. package/lib/langium/composite-ast-reflection.js.map +1 -0
  102. package/lib/langium/config/configuration-provider.d.ts +81 -0
  103. package/lib/langium/config/configuration-provider.d.ts.map +1 -0
  104. package/lib/langium/config/configuration-provider.js +112 -0
  105. package/lib/langium/config/configuration-provider.js.map +1 -0
  106. package/lib/langium/config/index.d.ts +1 -0
  107. package/lib/langium/config/index.d.ts.map +1 -1
  108. package/lib/langium/config/index.js +1 -0
  109. package/lib/langium/config/index.js.map +1 -1
  110. package/lib/langium/config/settings.js.map +1 -1
  111. package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts +9 -20
  112. package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts.map +1 -1
  113. package/lib/langium/diagnostics/hydranium-langium-profiler.js +15 -24
  114. package/lib/langium/diagnostics/hydranium-langium-profiler.js.map +1 -1
  115. package/lib/langium/diagnostics/log-preamble.js +1 -1
  116. package/lib/langium/diagnostics/log-preamble.js.map +1 -1
  117. package/lib/langium/diagnostics/logger.d.ts +19 -4
  118. package/lib/langium/diagnostics/logger.d.ts.map +1 -1
  119. package/lib/langium/diagnostics/logger.js +36 -11
  120. package/lib/langium/diagnostics/logger.js.map +1 -1
  121. package/lib/langium/diagnostics/lsp-logger.d.ts +17 -0
  122. package/lib/langium/diagnostics/lsp-logger.d.ts.map +1 -1
  123. package/lib/langium/diagnostics/lsp-logger.js +58 -17
  124. package/lib/langium/diagnostics/lsp-logger.js.map +1 -1
  125. package/lib/langium/diagnostics/server-tracer.d.ts.map +1 -1
  126. package/lib/langium/diagnostics/server-tracer.js.map +1 -1
  127. package/lib/langium/document-builder/build-pipeline-integration.d.ts +21 -1
  128. package/lib/langium/document-builder/build-pipeline-integration.d.ts.map +1 -1
  129. package/lib/langium/document-builder/build-pipeline-integration.js +28 -30
  130. package/lib/langium/document-builder/build-pipeline-integration.js.map +1 -1
  131. package/lib/langium/document-builder/build-session.d.ts +6 -5
  132. package/lib/langium/document-builder/build-session.d.ts.map +1 -1
  133. package/lib/langium/document-builder/build-session.js +5 -5
  134. package/lib/langium/document-builder/build-session.js.map +1 -1
  135. package/lib/langium/document-builder/document-builder.d.ts +309 -35
  136. package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
  137. package/lib/langium/document-builder/document-builder.js +511 -75
  138. package/lib/langium/document-builder/document-builder.js.map +1 -1
  139. package/lib/langium/documentation/comment-provider.d.ts.map +1 -1
  140. package/lib/langium/documentation/comment-provider.js.map +1 -1
  141. package/lib/langium/integration-services.d.ts +40 -24
  142. package/lib/langium/integration-services.d.ts.map +1 -1
  143. package/lib/langium/integration-services.js +7 -4
  144. package/lib/langium/integration-services.js.map +1 -1
  145. package/lib/langium/integrity/integrity-rule.d.ts +16 -8
  146. package/lib/langium/integrity/integrity-rule.d.ts.map +1 -1
  147. package/lib/langium/integrity/integrity-rule.js.map +1 -1
  148. package/lib/langium/integrity/integrity-service.d.ts +83 -27
  149. package/lib/langium/integrity/integrity-service.d.ts.map +1 -1
  150. package/lib/langium/integrity/integrity-service.js +273 -63
  151. package/lib/langium/integrity/integrity-service.js.map +1 -1
  152. package/lib/langium/keys/containment.d.ts +64 -0
  153. package/lib/langium/keys/containment.d.ts.map +1 -0
  154. package/lib/langium/keys/containment.js +53 -0
  155. package/lib/langium/keys/containment.js.map +1 -0
  156. package/lib/langium/keys/index.d.ts +1 -0
  157. package/lib/langium/keys/index.d.ts.map +1 -1
  158. package/lib/langium/keys/index.js +1 -0
  159. package/lib/langium/keys/index.js.map +1 -1
  160. package/lib/langium/keys/name-based-key-provider.d.ts +4 -0
  161. package/lib/langium/keys/name-based-key-provider.d.ts.map +1 -1
  162. package/lib/langium/keys/name-based-key-provider.js +4 -0
  163. package/lib/langium/keys/name-based-key-provider.js.map +1 -1
  164. package/lib/langium/keys/positional-key-provider.d.ts.map +1 -1
  165. package/lib/langium/keys/positional-key-provider.js.map +1 -1
  166. package/lib/langium/labeling/label-provider.d.ts.map +1 -1
  167. package/lib/langium/labeling/label-provider.js.map +1 -1
  168. package/lib/langium/language-module.d.ts +30 -5
  169. package/lib/langium/language-module.d.ts.map +1 -1
  170. package/lib/langium/language-module.js +18 -4
  171. package/lib/langium/language-module.js.map +1 -1
  172. package/lib/langium/model-service/client-session.d.ts +374 -0
  173. package/lib/langium/model-service/client-session.d.ts.map +1 -0
  174. package/lib/langium/model-service/client-session.js +446 -0
  175. package/lib/langium/model-service/client-session.js.map +1 -0
  176. package/lib/langium/model-service/index.d.ts +2 -0
  177. package/lib/langium/model-service/index.d.ts.map +1 -1
  178. package/lib/langium/model-service/index.js +2 -0
  179. package/lib/langium/model-service/index.js.map +1 -1
  180. package/lib/langium/model-service/model-events.d.ts +66 -0
  181. package/lib/langium/model-service/model-events.d.ts.map +1 -0
  182. package/lib/langium/model-service/model-events.js +10 -0
  183. package/lib/langium/model-service/model-events.js.map +1 -0
  184. package/lib/langium/model-service/model-service.d.ts +480 -289
  185. package/lib/langium/model-service/model-service.d.ts.map +1 -1
  186. package/lib/langium/model-service/model-service.js +597 -456
  187. package/lib/langium/model-service/model-service.js.map +1 -1
  188. package/lib/langium/module.d.ts +158 -37
  189. package/lib/langium/module.d.ts.map +1 -1
  190. package/lib/langium/module.js +52 -36
  191. package/lib/langium/module.js.map +1 -1
  192. package/lib/langium/naming/name-provider.d.ts +42 -7
  193. package/lib/langium/naming/name-provider.d.ts.map +1 -1
  194. package/lib/langium/naming/name-provider.js +10 -4
  195. package/lib/langium/naming/name-provider.js.map +1 -1
  196. package/lib/langium/naming/name-separator-validation.d.ts +23 -1
  197. package/lib/langium/naming/name-separator-validation.d.ts.map +1 -1
  198. package/lib/langium/naming/name-separator-validation.js +22 -0
  199. package/lib/langium/naming/name-separator-validation.js.map +1 -1
  200. package/lib/langium/project/abstract-project-manager.d.ts.map +1 -1
  201. package/lib/langium/project/abstract-project-manager.js +13 -6
  202. package/lib/langium/project/abstract-project-manager.js.map +1 -1
  203. package/lib/langium/project/project-change-event.d.ts +2 -2
  204. package/lib/langium/project/single-project-manager.d.ts.map +1 -1
  205. package/lib/langium/project/single-project-manager.js.map +1 -1
  206. package/lib/langium/residency/cst-residency-service.d.ts +35 -12
  207. package/lib/langium/residency/cst-residency-service.d.ts.map +1 -1
  208. package/lib/langium/residency/cst-residency-service.js +24 -58
  209. package/lib/langium/residency/cst-residency-service.js.map +1 -1
  210. package/lib/langium/scope/ast-node-description-provider.d.ts.map +1 -1
  211. package/lib/langium/scope/ast-node-description-provider.js.map +1 -1
  212. package/lib/langium/scope/fallback-scope.d.ts +27 -0
  213. package/lib/langium/scope/fallback-scope.d.ts.map +1 -0
  214. package/lib/langium/scope/fallback-scope.js +35 -0
  215. package/lib/langium/scope/fallback-scope.js.map +1 -0
  216. package/lib/langium/scope/hydranium-scope-computation.d.ts +21 -18
  217. package/lib/langium/scope/hydranium-scope-computation.d.ts.map +1 -1
  218. package/lib/langium/scope/hydranium-scope-computation.js +38 -39
  219. package/lib/langium/scope/hydranium-scope-computation.js.map +1 -1
  220. package/lib/langium/scope/hydranium-scope-provider.d.ts +39 -17
  221. package/lib/langium/scope/hydranium-scope-provider.d.ts.map +1 -1
  222. package/lib/langium/scope/hydranium-scope-provider.js +52 -26
  223. package/lib/langium/scope/hydranium-scope-provider.js.map +1 -1
  224. package/lib/langium/scope/index.d.ts +1 -0
  225. package/lib/langium/scope/index.d.ts.map +1 -1
  226. package/lib/langium/scope/index.js +1 -0
  227. package/lib/langium/scope/index.js.map +1 -1
  228. package/lib/langium/scope/reference-builder.d.ts.map +1 -1
  229. package/lib/langium/scope/reference-builder.js.map +1 -1
  230. package/lib/langium/scope/reference-candidate-provider.d.ts +6 -5
  231. package/lib/langium/scope/reference-candidate-provider.d.ts.map +1 -1
  232. package/lib/langium/scope/reference-candidate-provider.js +3 -2
  233. package/lib/langium/scope/reference-candidate-provider.js.map +1 -1
  234. package/lib/langium/scope/scope-extension-service.d.ts +41 -37
  235. package/lib/langium/scope/scope-extension-service.d.ts.map +1 -1
  236. package/lib/langium/scope/scope-extension-service.js +57 -29
  237. package/lib/langium/scope/scope-extension-service.js.map +1 -1
  238. package/lib/langium/scope/scoped-ast-node-description.d.ts +1 -3
  239. package/lib/langium/scope/scoped-ast-node-description.d.ts.map +1 -1
  240. package/lib/langium/scope/scoped-ast-node-description.js +1 -3
  241. package/lib/langium/scope/scoped-ast-node-description.js.map +1 -1
  242. package/lib/langium/serialization/abstract-serializer.d.ts +38 -27
  243. package/lib/langium/serialization/abstract-serializer.d.ts.map +1 -1
  244. package/lib/langium/serialization/abstract-serializer.js +54 -30
  245. package/lib/langium/serialization/abstract-serializer.js.map +1 -1
  246. package/lib/langium/serialization/json-serializer.d.ts +8 -1
  247. package/lib/langium/serialization/json-serializer.d.ts.map +1 -1
  248. package/lib/langium/serialization/json-serializer.js +13 -3
  249. package/lib/langium/serialization/json-serializer.js.map +1 -1
  250. package/lib/langium/serialization/serializer.d.ts +1 -1
  251. package/lib/langium/serialization/yaml-serializer.d.ts +4 -0
  252. package/lib/langium/serialization/yaml-serializer.d.ts.map +1 -1
  253. package/lib/langium/serialization/yaml-serializer.js +4 -0
  254. package/lib/langium/serialization/yaml-serializer.js.map +1 -1
  255. package/lib/langium/service-registry.d.ts +29 -1
  256. package/lib/langium/service-registry.d.ts.map +1 -1
  257. package/lib/langium/service-registry.js +37 -0
  258. package/lib/langium/service-registry.js.map +1 -1
  259. package/lib/langium/shared-services.d.ts +23 -6
  260. package/lib/langium/shared-services.d.ts.map +1 -1
  261. package/lib/langium/shared-services.js.map +1 -1
  262. package/lib/langium/single-langium-copy.d.ts +22 -0
  263. package/lib/langium/single-langium-copy.d.ts.map +1 -0
  264. package/lib/langium/single-langium-copy.js +36 -0
  265. package/lib/langium/single-langium-copy.js.map +1 -0
  266. package/lib/langium/transfer/transfer-encoder.d.ts +84 -35
  267. package/lib/langium/transfer/transfer-encoder.d.ts.map +1 -1
  268. package/lib/langium/transfer/transfer-encoder.js +34 -23
  269. package/lib/langium/transfer/transfer-encoder.js.map +1 -1
  270. package/lib/langium/trivia/comment-preserver.d.ts +423 -0
  271. package/lib/langium/trivia/comment-preserver.d.ts.map +1 -0
  272. package/lib/langium/trivia/comment-preserver.js +906 -0
  273. package/lib/langium/trivia/comment-preserver.js.map +1 -0
  274. package/lib/langium/trivia/document-ending-preserver.d.ts +51 -0
  275. package/lib/langium/trivia/document-ending-preserver.d.ts.map +1 -0
  276. package/lib/langium/trivia/document-ending-preserver.js +62 -0
  277. package/lib/langium/trivia/document-ending-preserver.js.map +1 -0
  278. package/lib/langium/trivia/index.d.ts +14 -0
  279. package/lib/langium/trivia/index.d.ts.map +1 -0
  280. package/lib/langium/trivia/index.js +14 -0
  281. package/lib/langium/trivia/index.js.map +1 -0
  282. package/lib/langium/trivia/trivia-contribution.d.ts +37 -0
  283. package/lib/langium/trivia/trivia-contribution.d.ts.map +1 -0
  284. package/lib/langium/trivia/trivia-contribution.js +10 -0
  285. package/lib/langium/trivia/trivia-contribution.js.map +1 -0
  286. package/lib/langium/trivia/trivia-preserver.d.ts +52 -0
  287. package/lib/langium/trivia/trivia-preserver.d.ts.map +1 -0
  288. package/lib/langium/trivia/trivia-preserver.js +10 -0
  289. package/lib/langium/trivia/trivia-preserver.js.map +1 -0
  290. package/lib/langium/trivia/trivia-service.d.ts +70 -0
  291. package/lib/langium/trivia/trivia-service.d.ts.map +1 -0
  292. package/lib/langium/trivia/trivia-service.js +56 -0
  293. package/lib/langium/trivia/trivia-service.js.map +1 -0
  294. package/lib/langium/update-rewrite/normalize-empty-strings.d.ts.map +1 -1
  295. package/lib/langium/update-rewrite/update-rewrite-service.d.ts +1 -1
  296. package/lib/langium/update-rewrite/update-rewrite-service.d.ts.map +1 -1
  297. package/lib/langium/update-rewrite/update-rewrite-service.js.map +1 -1
  298. package/lib/langium/update-rewrite/update-rewrite.d.ts +1 -1
  299. package/lib/langium/validation/document-validator.d.ts +280 -9
  300. package/lib/langium/validation/document-validator.d.ts.map +1 -1
  301. package/lib/langium/validation/document-validator.js +453 -8
  302. package/lib/langium/validation/document-validator.js.map +1 -1
  303. package/lib/langium/validation/validation-contribution-collector.d.ts +9 -1
  304. package/lib/langium/validation/validation-contribution-collector.d.ts.map +1 -1
  305. package/lib/langium/validation/validation-contribution-collector.js +1 -1
  306. package/lib/langium/validation/validation-contribution-collector.js.map +1 -1
  307. package/lib/langium/workspace/document-uri-policy.d.ts +24 -15
  308. package/lib/langium/workspace/document-uri-policy.d.ts.map +1 -1
  309. package/lib/langium/workspace/document-uri-policy.js +22 -13
  310. package/lib/langium/workspace/document-uri-policy.js.map +1 -1
  311. package/lib/langium/workspace/file-not-found.d.ts +23 -0
  312. package/lib/langium/workspace/file-not-found.d.ts.map +1 -0
  313. package/lib/langium/workspace/file-not-found.js +31 -0
  314. package/lib/langium/workspace/file-not-found.js.map +1 -0
  315. package/lib/langium/workspace/file-system-provider.d.ts +165 -8
  316. package/lib/langium/workspace/file-system-provider.d.ts.map +1 -1
  317. package/lib/langium/workspace/file-system-provider.js +111 -13
  318. package/lib/langium/workspace/file-system-provider.js.map +1 -1
  319. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts +31 -1
  320. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts.map +1 -1
  321. package/lib/langium/workspace/hydranium-langium-document-factory.js +54 -0
  322. package/lib/langium/workspace/hydranium-langium-document-factory.js.map +1 -1
  323. package/lib/langium/workspace/hydranium-workspace-lock.d.ts +43 -1
  324. package/lib/langium/workspace/hydranium-workspace-lock.d.ts.map +1 -1
  325. package/lib/langium/workspace/hydranium-workspace-lock.js +58 -1
  326. package/lib/langium/workspace/hydranium-workspace-lock.js.map +1 -1
  327. package/lib/langium/workspace/hydranium-workspace-manager.d.ts +124 -22
  328. package/lib/langium/workspace/hydranium-workspace-manager.d.ts.map +1 -1
  329. package/lib/langium/workspace/hydranium-workspace-manager.js +212 -31
  330. package/lib/langium/workspace/hydranium-workspace-manager.js.map +1 -1
  331. package/lib/langium/workspace/in-memory-file-system-provider.d.ts +26 -9
  332. package/lib/langium/workspace/in-memory-file-system-provider.d.ts.map +1 -1
  333. package/lib/langium/workspace/in-memory-file-system-provider.js +45 -22
  334. package/lib/langium/workspace/in-memory-file-system-provider.js.map +1 -1
  335. package/lib/langium/workspace/index-manager.d.ts.map +1 -1
  336. package/lib/langium/workspace/index-manager.js.map +1 -1
  337. package/lib/langium/workspace/index.d.ts +1 -0
  338. package/lib/langium/workspace/index.d.ts.map +1 -1
  339. package/lib/langium/workspace/index.js +1 -0
  340. package/lib/langium/workspace/index.js.map +1 -1
  341. package/lib/langium/workspace/initialize-workspace.d.ts +31 -2
  342. package/lib/langium/workspace/initialize-workspace.d.ts.map +1 -1
  343. package/lib/langium/workspace/initialize-workspace.js +13 -5
  344. package/lib/langium/workspace/initialize-workspace.js.map +1 -1
  345. package/lib/langium/workspace/langium-documents.d.ts +7 -0
  346. package/lib/langium/workspace/langium-documents.d.ts.map +1 -1
  347. package/lib/langium/workspace/langium-documents.js +18 -1
  348. package/lib/langium/workspace/langium-documents.js.map +1 -1
  349. package/lib/langium/workspace/persistent-file-system-provider.d.ts +15 -9
  350. package/lib/langium/workspace/persistent-file-system-provider.d.ts.map +1 -1
  351. package/lib/langium/workspace/persistent-file-system-provider.js +25 -13
  352. package/lib/langium/workspace/persistent-file-system-provider.js.map +1 -1
  353. package/lib/langium/workspace/self-save-registry.d.ts +84 -0
  354. package/lib/langium/workspace/self-save-registry.d.ts.map +1 -0
  355. package/lib/{documents → langium/workspace}/self-save-registry.js +33 -22
  356. package/lib/langium/workspace/self-save-registry.js.map +1 -0
  357. package/lib/langium/workspace/virtual-document.d.ts +55 -21
  358. package/lib/langium/workspace/virtual-document.d.ts.map +1 -1
  359. package/lib/langium/workspace/virtual-document.js +87 -24
  360. package/lib/langium/workspace/virtual-document.js.map +1 -1
  361. package/lib/langium/workspace/write-lock-scope.d.ts +22 -10
  362. package/lib/langium/workspace/write-lock-scope.d.ts.map +1 -1
  363. package/lib/langium/workspace/write-lock-scope.js +15 -5
  364. package/lib/langium/workspace/write-lock-scope.js.map +1 -1
  365. package/lib/launcher/integrated-server.d.ts +3 -1
  366. package/lib/launcher/integrated-server.d.ts.map +1 -1
  367. package/lib/locale/index.d.ts +10 -0
  368. package/lib/locale/index.d.ts.map +1 -0
  369. package/lib/locale/index.js +10 -0
  370. package/lib/locale/index.js.map +1 -0
  371. package/lib/locale/server-locale.d.ts +73 -0
  372. package/lib/locale/server-locale.d.ts.map +1 -0
  373. package/lib/locale/server-locale.js +61 -0
  374. package/lib/locale/server-locale.js.map +1 -0
  375. package/lib/lsp/completion/hydranium-completion-provider.d.ts +44 -2
  376. package/lib/lsp/completion/hydranium-completion-provider.d.ts.map +1 -1
  377. package/lib/lsp/completion/hydranium-completion-provider.js +68 -0
  378. package/lib/lsp/completion/hydranium-completion-provider.js.map +1 -1
  379. package/lib/lsp/connection-features.d.ts +23 -0
  380. package/lib/lsp/connection-features.d.ts.map +1 -0
  381. package/lib/lsp/connection-features.js +60 -0
  382. package/lib/lsp/connection-features.js.map +1 -0
  383. package/lib/lsp/diagnostics-connection.d.ts +27 -0
  384. package/lib/lsp/diagnostics-connection.d.ts.map +1 -0
  385. package/lib/lsp/diagnostics-connection.js +53 -0
  386. package/lib/lsp/diagnostics-connection.js.map +1 -0
  387. package/lib/lsp/hydranium-document-update-handler.d.ts +126 -82
  388. package/lib/lsp/hydranium-document-update-handler.d.ts.map +1 -1
  389. package/lib/lsp/hydranium-document-update-handler.js +235 -102
  390. package/lib/lsp/hydranium-document-update-handler.js.map +1 -1
  391. package/lib/lsp/index.d.ts +3 -1
  392. package/lib/lsp/index.d.ts.map +1 -1
  393. package/lib/lsp/index.js +3 -1
  394. package/lib/lsp/index.js.map +1 -1
  395. package/lib/lsp/lsp-latency.d.ts +39 -0
  396. package/lib/lsp/lsp-latency.d.ts.map +1 -0
  397. package/lib/lsp/lsp-latency.js +58 -0
  398. package/lib/lsp/lsp-latency.js.map +1 -0
  399. package/lib/lsp/semantic-token-provider.d.ts +34 -1
  400. package/lib/lsp/semantic-token-provider.d.ts.map +1 -1
  401. package/lib/lsp/semantic-token-provider.js +55 -8
  402. package/lib/lsp/semantic-token-provider.js.map +1 -1
  403. package/lib/lsp/shared-module.d.ts +4 -8
  404. package/lib/lsp/shared-module.d.ts.map +1 -1
  405. package/lib/lsp/shared-module.js.map +1 -1
  406. package/lib/lsp/start-language-server.d.ts +8 -7
  407. package/lib/lsp/start-language-server.d.ts.map +1 -1
  408. package/lib/lsp/start-language-server.js +13 -7
  409. package/lib/lsp/start-language-server.js.map +1 -1
  410. package/lib/messages/carriers.d.ts +18 -12
  411. package/lib/messages/carriers.d.ts.map +1 -1
  412. package/lib/messages/carriers.js +22 -13
  413. package/lib/messages/carriers.js.map +1 -1
  414. package/lib/messages/index.d.ts +4 -1
  415. package/lib/messages/index.d.ts.map +1 -1
  416. package/lib/messages/index.js +4 -1
  417. package/lib/messages/index.js.map +1 -1
  418. package/lib/messages/renderer.d.ts +142 -0
  419. package/lib/messages/renderer.d.ts.map +1 -0
  420. package/lib/messages/renderer.js +165 -0
  421. package/lib/messages/renderer.js.map +1 -0
  422. package/lib/node/event-loop-monitor.d.ts.map +1 -1
  423. package/lib/node/event-loop-monitor.js +2 -1
  424. package/lib/node/event-loop-monitor.js.map +1 -1
  425. package/lib/node/heap-ceiling.d.ts +61 -0
  426. package/lib/node/heap-ceiling.d.ts.map +1 -0
  427. package/lib/node/heap-ceiling.js +72 -0
  428. package/lib/node/heap-ceiling.js.map +1 -0
  429. package/lib/node/index.d.ts +1 -1
  430. package/lib/node/index.d.ts.map +1 -1
  431. package/lib/node/index.js +5 -1
  432. package/lib/node/index.js.map +1 -1
  433. package/lib/node/latency-from-env.d.ts +1 -1
  434. package/lib/node/latency-from-env.js +1 -1
  435. package/lib/node/lint-grammar.js.map +1 -1
  436. package/lib/node/log-preamble-node.d.ts +5 -3
  437. package/lib/node/log-preamble-node.d.ts.map +1 -1
  438. package/lib/node/log-preamble-node.js +13 -10
  439. package/lib/node/log-preamble-node.js.map +1 -1
  440. package/lib/node/measure-memory.d.ts.map +1 -1
  441. package/lib/node/measure-memory.js +5 -4
  442. package/lib/node/measure-memory.js.map +1 -1
  443. package/lib/node/memory-monitor.d.ts +2 -2
  444. package/lib/node/memory-monitor.d.ts.map +1 -1
  445. package/lib/node/memory-monitor.js +9 -10
  446. package/lib/node/memory-monitor.js.map +1 -1
  447. package/lib/node/node-file-system-provider.d.ts +67 -9
  448. package/lib/node/node-file-system-provider.d.ts.map +1 -1
  449. package/lib/node/node-file-system-provider.js +198 -53
  450. package/lib/node/node-file-system-provider.js.map +1 -1
  451. package/lib/node/profile-capture.d.ts +12 -4
  452. package/lib/node/profile-capture.d.ts.map +1 -1
  453. package/lib/node/profile-capture.js +8 -6
  454. package/lib/node/profile-capture.js.map +1 -1
  455. package/lib/node/profile-digest.js.map +1 -1
  456. package/lib/node/profiling-run.d.ts +13 -3
  457. package/lib/node/profiling-run.d.ts.map +1 -1
  458. package/lib/node/profiling-run.js +17 -8
  459. package/lib/node/profiling-run.js.map +1 -1
  460. package/lib/node/rename-over-open-readers.d.ts +61 -0
  461. package/lib/node/rename-over-open-readers.d.ts.map +1 -0
  462. package/lib/node/rename-over-open-readers.js +80 -0
  463. package/lib/node/rename-over-open-readers.js.map +1 -0
  464. package/lib/node/server-diagnostics.js +1 -1
  465. package/lib/node/server-diagnostics.js.map +1 -1
  466. package/lib/node/server-state-snapshot.js +4 -4
  467. package/lib/node/server-state-snapshot.js.map +1 -1
  468. package/lib/node/socket-launcher.d.ts +20 -4
  469. package/lib/node/socket-launcher.d.ts.map +1 -1
  470. package/lib/node/socket-launcher.js +8 -7
  471. package/lib/node/socket-launcher.js.map +1 -1
  472. package/lib/node/startup-cpu-profile.d.ts +29 -0
  473. package/lib/node/startup-cpu-profile.d.ts.map +1 -0
  474. package/lib/node/startup-cpu-profile.js +91 -0
  475. package/lib/node/startup-cpu-profile.js.map +1 -0
  476. package/lib/node/stdio-launcher.d.ts +10 -10
  477. package/lib/node/stdio-launcher.d.ts.map +1 -1
  478. package/lib/node/stdio-launcher.js +17 -9
  479. package/lib/node/stdio-launcher.js.map +1 -1
  480. package/lib/testing/document-uri-policy-conformance.js +1 -1
  481. package/lib/testing/document-uri-policy-conformance.js.map +1 -1
  482. package/lib/testing/fake-description.js.map +1 -1
  483. package/lib/testing/fake-document.d.ts +16 -4
  484. package/lib/testing/fake-document.d.ts.map +1 -1
  485. package/lib/testing/fake-document.js +18 -3
  486. package/lib/testing/fake-document.js.map +1 -1
  487. package/lib/testing/index.d.ts +1 -1
  488. package/lib/testing/index.d.ts.map +1 -1
  489. package/lib/testing/index.js +2 -1
  490. package/lib/testing/index.js.map +1 -1
  491. package/lib/testing/langium-test-helpers.d.ts.map +1 -1
  492. package/lib/testing/langium-test-helpers.js +1 -0
  493. package/lib/testing/langium-test-helpers.js.map +1 -1
  494. package/lib/testing/make-noop-language-services.js.map +1 -1
  495. package/lib/testing/make-noop-shared-services.d.ts +14 -0
  496. package/lib/testing/make-noop-shared-services.d.ts.map +1 -1
  497. package/lib/testing/make-noop-shared-services.js +28 -2
  498. package/lib/testing/make-noop-shared-services.js.map +1 -1
  499. package/lib/testing/make-test-services.d.ts +72 -14
  500. package/lib/testing/make-test-services.d.ts.map +1 -1
  501. package/lib/testing/make-test-services.js +42 -10
  502. package/lib/testing/make-test-services.js.map +1 -1
  503. package/lib/testing/make-test-tracer.d.ts +12 -0
  504. package/lib/testing/make-test-tracer.d.ts.map +1 -1
  505. package/lib/testing/make-test-tracer.js +13 -0
  506. package/lib/testing/make-test-tracer.js.map +1 -1
  507. package/lib/testing/node/applied-edit-capture.d.ts +29 -0
  508. package/lib/testing/node/applied-edit-capture.d.ts.map +1 -0
  509. package/lib/testing/node/applied-edit-capture.js +117 -0
  510. package/lib/testing/node/applied-edit-capture.js.map +1 -0
  511. package/lib/testing/node/golden-corpus.js.map +1 -1
  512. package/lib/testing/node/index.d.ts +1 -0
  513. package/lib/testing/node/index.d.ts.map +1 -1
  514. package/lib/testing/node/index.js +1 -0
  515. package/lib/testing/node/index.js.map +1 -1
  516. package/lib/testing/node/lsp-harness.d.ts.map +1 -1
  517. package/lib/testing/node/lsp-harness.js +2 -0
  518. package/lib/testing/node/lsp-harness.js.map +1 -1
  519. package/lib/testing/node/lsp-server-connection.d.ts +21 -6
  520. package/lib/testing/node/lsp-server-connection.d.ts.map +1 -1
  521. package/lib/testing/node/lsp-server-connection.js +49 -106
  522. package/lib/testing/node/lsp-server-connection.js.map +1 -1
  523. package/lib/testing/node/scratch-workspace.d.ts.map +1 -1
  524. package/lib/testing/node/scratch-workspace.js +10 -5
  525. package/lib/testing/node/scratch-workspace.js.map +1 -1
  526. package/lib/testing/node/spawned-server.d.ts +30 -1
  527. package/lib/testing/node/spawned-server.d.ts.map +1 -1
  528. package/lib/testing/node/spawned-server.js +39 -2
  529. package/lib/testing/node/spawned-server.js.map +1 -1
  530. package/lib/testing/node/unhandled-rejections.d.ts +20 -0
  531. package/lib/testing/node/unhandled-rejections.d.ts.map +1 -0
  532. package/lib/testing/node/unhandled-rejections.js +32 -0
  533. package/lib/testing/node/unhandled-rejections.js.map +1 -0
  534. package/lib/testing/playwright/browser-capture-bridge.js.map +1 -1
  535. package/lib/testing/playwright/e2e-profiling.js.map +1 -1
  536. package/lib/testing/playwright/flaky-network-proxy.d.ts +76 -0
  537. package/lib/testing/playwright/flaky-network-proxy.d.ts.map +1 -0
  538. package/lib/testing/playwright/flaky-network-proxy.js +164 -0
  539. package/lib/testing/playwright/flaky-network-proxy.js.map +1 -0
  540. package/lib/testing/playwright/index.d.ts +1 -0
  541. package/lib/testing/playwright/index.d.ts.map +1 -1
  542. package/lib/testing/playwright/index.js +1 -0
  543. package/lib/testing/playwright/index.js.map +1 -1
  544. package/lib/testing/playwright/server-log-capture.d.ts +46 -16
  545. package/lib/testing/playwright/server-log-capture.d.ts.map +1 -1
  546. package/lib/testing/playwright/server-log-capture.js +111 -40
  547. package/lib/testing/playwright/server-log-capture.js.map +1 -1
  548. package/lib/testing/playwright/server-log-fixture.d.ts +16 -0
  549. package/lib/testing/playwright/server-log-fixture.d.ts.map +1 -1
  550. package/lib/testing/playwright/server-log-fixture.js +25 -6
  551. package/lib/testing/playwright/server-log-fixture.js.map +1 -1
  552. package/lib/testing/playwright/server-log-region.d.ts +15 -0
  553. package/lib/testing/playwright/server-log-region.d.ts.map +1 -0
  554. package/lib/testing/playwright/server-log-region.js +30 -0
  555. package/lib/testing/playwright/server-log-region.js.map +1 -0
  556. package/lib/testing/playwright/server-log-rename-reporter.d.ts.map +1 -1
  557. package/lib/testing/playwright/server-log-rename-reporter.js +4 -3
  558. package/lib/testing/playwright/server-log-rename-reporter.js.map +1 -1
  559. package/lib/testing/run-update-pipeline.d.ts +8 -5
  560. package/lib/testing/run-update-pipeline.d.ts.map +1 -1
  561. package/lib/testing/run-update-pipeline.js.map +1 -1
  562. package/lib/testing/stub-ast-document-manager.d.ts +11 -52
  563. package/lib/testing/stub-ast-document-manager.d.ts.map +1 -1
  564. package/lib/testing/stub-ast-document-manager.js +31 -62
  565. package/lib/testing/stub-ast-document-manager.js.map +1 -1
  566. package/lib/testing/stub-document-builder.d.ts +33 -11
  567. package/lib/testing/stub-document-builder.d.ts.map +1 -1
  568. package/lib/testing/stub-document-builder.js +103 -5
  569. package/lib/testing/stub-document-builder.js.map +1 -1
  570. package/lib/testing/stub-hydranium-text-documents.d.ts +33 -10
  571. package/lib/testing/stub-hydranium-text-documents.d.ts.map +1 -1
  572. package/lib/testing/stub-hydranium-text-documents.js +132 -16
  573. package/lib/testing/stub-hydranium-text-documents.js.map +1 -1
  574. package/lib/testing/stub-index-manager.js.map +1 -1
  575. package/lib/testing/stub-langium-documents.d.ts +3 -2
  576. package/lib/testing/stub-langium-documents.d.ts.map +1 -1
  577. package/lib/testing/stub-langium-documents.js.map +1 -1
  578. package/lib/testing/stub-model-service.d.ts +9 -8
  579. package/lib/testing/stub-model-service.d.ts.map +1 -1
  580. package/lib/testing/stub-model-service.js +6 -6
  581. package/lib/testing/stub-model-service.js.map +1 -1
  582. package/lib/testing/stub-project-manager.js.map +1 -1
  583. package/lib/testing/stub-self-save-registry.d.ts +1 -1
  584. package/lib/testing/stub-self-save-registry.d.ts.map +1 -1
  585. package/lib/testing/stub-service-registry.d.ts +1 -1
  586. package/lib/testing/stub-service-registry.js.map +1 -1
  587. package/lib/testing/stub-writable-file-system.d.ts +1 -1
  588. package/lib/testing/stub-writable-file-system.d.ts.map +1 -1
  589. package/lib/testing/stub-writable-file-system.js +2 -1
  590. package/lib/testing/stub-writable-file-system.js.map +1 -1
  591. package/lib/util/connection-liveness.d.ts +19 -6
  592. package/lib/util/connection-liveness.d.ts.map +1 -1
  593. package/lib/util/connection-liveness.js +61 -15
  594. package/lib/util/connection-liveness.js.map +1 -1
  595. package/lib/util/environment.d.ts.map +1 -1
  596. package/lib/util/environment.js.map +1 -1
  597. package/lib/util/registry.d.ts.map +1 -1
  598. package/package.json +38 -57
  599. package/src/browser/host-heads-in-worker.ts +142 -0
  600. package/src/browser/index.ts +17 -0
  601. package/src/browser/indexeddb-file-system-store.ts +192 -0
  602. package/src/browser/start-language-server-in-worker.ts +51 -0
  603. package/src/documents/ast-document-manager.ts +467 -233
  604. package/src/documents/client-ids.ts +5 -22
  605. package/src/documents/client-session-errors.ts +24 -0
  606. package/src/documents/client-session-registry.ts +262 -0
  607. package/src/documents/dirty-state-tracker.ts +167 -0
  608. package/src/documents/document-release-handler.ts +404 -0
  609. package/src/documents/document-release-scheduler.ts +121 -0
  610. package/src/documents/file-system-task-queue.ts +74 -0
  611. package/src/documents/hydranium-text-documents.ts +976 -595
  612. package/src/documents/index.ts +10 -2
  613. package/src/documents/language-client-shadow.ts +452 -0
  614. package/src/documents/model-ledger.ts +66 -0
  615. package/src/documents/text-ledger.ts +112 -0
  616. package/src/documents/version-sync-service.ts +275 -0
  617. package/src/index.ts +8 -0
  618. package/src/langium/ast-extension/ast-extension-service.ts +77 -41
  619. package/src/langium/ast-extension/ast-node-builder.ts +66 -22
  620. package/src/langium/bootstrap.ts +95 -52
  621. package/src/langium/build-phase-pass/build-phase-pass-service.ts +29 -19
  622. package/src/langium/build-phase-pass/build-phase-pass.ts +37 -8
  623. package/src/langium/composite-ast-reflection.ts +112 -0
  624. package/src/langium/config/configuration-provider.ts +119 -0
  625. package/src/langium/config/index.ts +1 -0
  626. package/src/langium/diagnostics/hydranium-langium-profiler.ts +15 -39
  627. package/src/langium/diagnostics/log-preamble.ts +1 -1
  628. package/src/langium/diagnostics/logger.ts +38 -11
  629. package/src/langium/diagnostics/lsp-logger.ts +61 -16
  630. package/src/langium/document-builder/build-pipeline-integration.ts +46 -32
  631. package/src/langium/document-builder/build-session.ts +4 -3
  632. package/src/langium/document-builder/document-builder.ts +616 -73
  633. package/src/langium/integration-services.ts +59 -28
  634. package/src/langium/integrity/integrity-rule.ts +16 -8
  635. package/src/langium/integrity/integrity-service.ts +296 -69
  636. package/src/langium/keys/containment.ts +87 -0
  637. package/src/langium/keys/index.ts +1 -0
  638. package/src/langium/keys/name-based-key-provider.ts +4 -0
  639. package/src/langium/language-module.ts +49 -8
  640. package/src/langium/model-service/client-session.ts +704 -0
  641. package/src/langium/model-service/index.ts +2 -0
  642. package/src/langium/model-service/model-events.ts +80 -0
  643. package/src/langium/model-service/model-service.ts +908 -485
  644. package/src/langium/module.ts +212 -67
  645. package/src/langium/naming/name-provider.ts +44 -8
  646. package/src/langium/naming/name-separator-validation.ts +25 -3
  647. package/src/langium/project/abstract-project-manager.ts +13 -5
  648. package/src/langium/project/project-change-event.ts +2 -2
  649. package/src/langium/residency/cst-residency-service.ts +51 -17
  650. package/src/langium/scope/fallback-scope.ts +38 -0
  651. package/src/langium/scope/hydranium-scope-computation.ts +45 -44
  652. package/src/langium/scope/hydranium-scope-provider.ts +64 -27
  653. package/src/langium/scope/index.ts +1 -0
  654. package/src/langium/scope/reference-candidate-provider.ts +6 -5
  655. package/src/langium/scope/scope-extension-service.ts +74 -59
  656. package/src/langium/scope/scoped-ast-node-description.ts +1 -3
  657. package/src/langium/serialization/abstract-serializer.ts +57 -41
  658. package/src/langium/serialization/json-serializer.ts +14 -3
  659. package/src/langium/serialization/serializer.ts +1 -1
  660. package/src/langium/serialization/yaml-serializer.ts +4 -0
  661. package/src/langium/service-registry.ts +41 -2
  662. package/src/langium/shared-services.ts +26 -6
  663. package/src/langium/single-langium-copy.ts +42 -0
  664. package/src/langium/transfer/transfer-encoder.ts +102 -45
  665. package/src/langium/trivia/comment-preserver.ts +1100 -0
  666. package/src/langium/trivia/document-ending-preserver.ts +71 -0
  667. package/src/langium/trivia/index.ts +14 -0
  668. package/src/langium/trivia/trivia-contribution.ts +39 -0
  669. package/src/langium/trivia/trivia-preserver.ts +56 -0
  670. package/src/langium/trivia/trivia-service.ts +99 -0
  671. package/src/langium/update-rewrite/update-rewrite-service.ts +1 -1
  672. package/src/langium/update-rewrite/update-rewrite.ts +1 -1
  673. package/src/langium/validation/document-validator.ts +528 -13
  674. package/src/langium/validation/validation-contribution-collector.ts +10 -1
  675. package/src/langium/workspace/document-uri-policy.ts +32 -18
  676. package/src/langium/workspace/file-not-found.ts +35 -0
  677. package/src/langium/workspace/file-system-provider.ts +253 -16
  678. package/src/langium/workspace/hydranium-langium-document-factory.ts +83 -0
  679. package/src/langium/workspace/hydranium-workspace-lock.ts +86 -2
  680. package/src/langium/workspace/hydranium-workspace-manager.ts +241 -35
  681. package/src/langium/workspace/in-memory-file-system-provider.ts +54 -23
  682. package/src/langium/workspace/index.ts +1 -0
  683. package/src/langium/workspace/initialize-workspace.ts +43 -5
  684. package/src/langium/workspace/langium-documents.ts +19 -1
  685. package/src/langium/workspace/persistent-file-system-provider.ts +26 -14
  686. package/src/langium/workspace/self-save-registry.ts +118 -0
  687. package/src/langium/workspace/virtual-document.ts +106 -25
  688. package/src/langium/workspace/write-lock-scope.ts +27 -12
  689. package/src/launcher/integrated-server.ts +3 -1
  690. package/src/locale/index.ts +10 -0
  691. package/src/locale/server-locale.ts +86 -0
  692. package/src/lsp/completion/hydranium-completion-provider.ts +82 -2
  693. package/src/lsp/connection-features.ts +67 -0
  694. package/src/lsp/diagnostics-connection.ts +56 -0
  695. package/src/lsp/hydranium-document-update-handler.ts +285 -111
  696. package/src/lsp/index.ts +3 -1
  697. package/src/lsp/lsp-latency.ts +62 -0
  698. package/src/lsp/semantic-token-provider.ts +74 -7
  699. package/src/lsp/shared-module.ts +4 -8
  700. package/src/lsp/start-language-server.ts +13 -7
  701. package/src/messages/carriers.ts +23 -15
  702. package/src/messages/index.ts +13 -1
  703. package/src/messages/renderer.ts +212 -0
  704. package/src/node/event-loop-monitor.ts +2 -1
  705. package/src/node/heap-ceiling.ts +108 -0
  706. package/src/node/index.ts +5 -1
  707. package/src/node/latency-from-env.ts +1 -1
  708. package/src/node/log-preamble-node.ts +20 -10
  709. package/src/node/measure-memory.ts +5 -4
  710. package/src/node/memory-monitor.ts +10 -10
  711. package/src/node/node-file-system-provider.ts +214 -57
  712. package/src/node/profile-capture.ts +16 -15
  713. package/src/node/profiling-run.ts +30 -8
  714. package/src/node/rename-over-open-readers.ts +94 -0
  715. package/src/node/server-diagnostics.ts +1 -1
  716. package/src/node/server-state-snapshot.ts +5 -5
  717. package/src/node/socket-launcher.ts +27 -11
  718. package/src/node/startup-cpu-profile.ts +94 -0
  719. package/src/node/stdio-launcher.ts +22 -14
  720. package/src/testing/document-uri-policy-conformance.ts +1 -1
  721. package/src/testing/fake-document.ts +24 -5
  722. package/src/testing/index.ts +2 -1
  723. package/src/testing/langium-test-helpers.ts +1 -0
  724. package/src/testing/make-noop-shared-services.ts +50 -2
  725. package/src/testing/make-test-services.ts +125 -31
  726. package/src/testing/make-test-tracer.ts +26 -0
  727. package/src/testing/node/applied-edit-capture.ts +141 -0
  728. package/src/testing/node/index.ts +1 -0
  729. package/src/testing/node/lsp-harness.ts +2 -0
  730. package/src/testing/node/lsp-server-connection.ts +83 -119
  731. package/src/testing/node/scratch-workspace.ts +10 -5
  732. package/src/testing/node/spawned-server.ts +57 -3
  733. package/src/testing/node/unhandled-rejections.ts +31 -0
  734. package/src/testing/parse-semantic-root.ts +1 -1
  735. package/src/testing/playwright/flaky-network-proxy.ts +240 -0
  736. package/src/testing/playwright/index.ts +1 -0
  737. package/src/testing/playwright/server-log-capture.ts +137 -47
  738. package/src/testing/playwright/server-log-fixture.ts +46 -6
  739. package/src/testing/playwright/server-log-region.ts +32 -0
  740. package/src/testing/playwright/server-log-rename-reporter.ts +4 -3
  741. package/src/testing/run-update-pipeline.ts +8 -5
  742. package/src/testing/stub-ast-document-manager.ts +47 -128
  743. package/src/testing/stub-document-builder.ts +133 -18
  744. package/src/testing/stub-hydranium-text-documents.ts +184 -27
  745. package/src/testing/stub-langium-documents.ts +3 -2
  746. package/src/testing/stub-model-service.ts +11 -10
  747. package/src/testing/stub-self-save-registry.ts +1 -1
  748. package/src/testing/stub-service-registry.ts +1 -1
  749. package/src/testing/stub-writable-file-system.ts +3 -2
  750. package/src/util/connection-liveness.ts +67 -15
  751. package/src/util/environment.ts +9 -1
  752. package/lib/documents/language-client-text-shadow.d.ts +0 -101
  753. package/lib/documents/language-client-text-shadow.d.ts.map +0 -1
  754. package/lib/documents/language-client-text-shadow.js +0 -156
  755. package/lib/documents/language-client-text-shadow.js.map +0 -1
  756. package/lib/documents/self-save-registry.d.ts +0 -55
  757. package/lib/documents/self-save-registry.d.ts.map +0 -1
  758. package/lib/documents/self-save-registry.js.map +0 -1
  759. package/lib/lsp/instrument-connection.d.ts +0 -36
  760. package/lib/lsp/instrument-connection.d.ts.map +0 -1
  761. package/lib/lsp/instrument-connection.js +0 -62
  762. package/lib/lsp/instrument-connection.js.map +0 -1
  763. package/lib/node/process-memory.d.ts +0 -66
  764. package/lib/node/process-memory.d.ts.map +0 -1
  765. package/lib/node/process-memory.js +0 -252
  766. package/lib/node/process-memory.js.map +0 -1
  767. package/src/documents/language-client-text-shadow.ts +0 -175
  768. package/src/documents/self-save-registry.ts +0 -81
  769. package/src/lsp/instrument-connection.ts +0 -66
  770. package/src/node/process-memory.ts +0 -299
@@ -7,18 +7,29 @@
7
7
  * SPDX-License-Identifier: MIT
8
8
  ********************************************************************************/
9
9
 
10
- import { Deferred, type Logger, type Tracer } from '@hydranium/protocol';
11
- import { DefaultWorkspaceManager, DocumentState, type LangiumDocument, UriUtils, type URI } from '@hydranium/langium';
12
- import { type CancellationToken } from 'vscode-languageserver';
10
+ import { Deferred, type Logger, type Tracer, describeError, describeErrorWithStack } from '@hydranium/protocol';
11
+ import {
12
+ DefaultWorkspaceManager,
13
+ DocumentState,
14
+ interruptAndCheck,
15
+ isOperationCancelled,
16
+ type LangiumDocument,
17
+ type Stream,
18
+ UriUtils,
19
+ type URI
20
+ } from '@hydranium/langium';
21
+ import { type CancellationToken, CancellationTokenSource, type InitializeParams } from 'vscode-languageserver';
13
22
  import type { WorkspaceFolder } from 'vscode-languageserver-types';
14
23
  import { type LogNameOptions, resolveLogFilePlaceholder, toLogFileWorkspaceToken } from '../diagnostics/logger.js';
24
+ import type { ServerLocale } from '../../locale/server-locale.js';
15
25
  import type { ProjectChangeEvent } from '../project/project-change-event.js';
16
26
  import type { ProjectManager } from '../project/project-manager.js';
17
27
  import type { ServerSharedServicesMinimal } from '../shared-services.js';
18
- import type { WritableFileSystemProvider } from '../../documents/ast-document-manager.js';
28
+ import type { WritableFileSystemProvider } from './file-system-provider.js';
19
29
  import { type DocumentUriPolicy, findRealpathDivergence } from './document-uri-policy.js';
20
30
  import { type AdditionalDocumentContribution, collectAdditionalDocuments } from './additional-document-contribution.js';
21
31
  import { onProcessEvent } from '../../util/environment.js';
32
+ import { isConnectionGoneError } from '../../util/connection-liveness.js';
22
33
 
23
34
  /**
24
35
  * Module-level guard so repeated workspace-manager construction (e.g.
@@ -36,6 +47,13 @@ let operationCancelledSuppressionInstalled = false;
36
47
  */
37
48
  let operationCancelledSuppressionLogger: Logger | undefined;
38
49
 
50
+ /**
51
+ * Never cancelled: `interruptAndCheck` yields only for a token other than
52
+ * `CancellationToken.None`, and the load must not stop part-way, since Langium
53
+ * checks for cancellation once every document exists.
54
+ */
55
+ const LOAD_YIELD_TOKEN = new CancellationTokenSource().token;
56
+
39
57
  /**
40
58
  * Decide what to do with a process-level unhandled promise rejection.
41
59
  *
@@ -59,7 +77,7 @@ export function handleProcessUnhandledRejection(reason: unknown, logger: Logger)
59
77
  if (typeof reason === 'symbol' && String(reason) === 'Symbol(OperationCancelled)') {
60
78
  return;
61
79
  }
62
- logger.error('Unhandled promise rejection: ' + (reason instanceof Error ? (reason.stack ?? reason.message) : String(reason)));
80
+ logger.error('Unhandled promise rejection: ' + describeErrorWithStack(reason));
63
81
  }
64
82
 
65
83
  /**
@@ -92,6 +110,18 @@ export function installOperationCancelledSuppression(logger: Logger): void {
92
110
  });
93
111
  }
94
112
 
113
+ /** Options for {@link HydraniumWorkspaceManager}. */
114
+ export interface HydraniumWorkspaceManagerOptions extends LogNameOptions {
115
+ /**
116
+ * Whether startup warns about seeded documents the bound
117
+ * `FileSystemProvider` cannot serve (see
118
+ * {@link HydraniumWorkspaceManager.warnIfDocumentsUnserved}). Defaults to
119
+ * `true`; turn it off for a host that drops such documents at their last
120
+ * close on purpose.
121
+ */
122
+ warnUnservedDocuments?: boolean;
123
+ }
124
+
95
125
  /**
96
126
  * Framework {@link DefaultWorkspaceManager} subclass that integrates the
97
127
  * project tier with Langium's workspace startup.
@@ -124,8 +154,8 @@ export function installOperationCancelledSuppression(logger: Logger): void {
124
154
  * URIs (its own members plus any transitive dependents per the
125
155
  * `getAffectedProjects` hook). This manager re-runs
126
156
  * `DocumentBuilder.resetToState(doc, DocumentState.Changed)` on each
127
- * affected document so the next build cycle re-links them with the new
128
- * visibility scope.
157
+ * affected document so the build of the update that changed the descriptor
158
+ * re-links them with the new visibility scope.
129
159
  *
130
160
  * Descriptor URIs that triggered the cycle are intentionally excluded
131
161
  * from the affected set by `AbstractProjectManager.onBuildUpdate` —
@@ -156,19 +186,29 @@ export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
156
186
  readonly workspaceInitialized: Promise<unknown> = this.workspaceInitializedDeferred.promise;
157
187
 
158
188
  protected readonly uriPolicy: DocumentUriPolicy;
189
+ /** Handed the client's locale at init; read by whoever renders in it. */
190
+ protected readonly serverLocale: ServerLocale;
159
191
  protected readonly writableFileSystemProvider: WritableFileSystemProvider;
160
192
  protected readonly additionalDocuments: Record<string, AdditionalDocumentContribution>;
161
193
  /** Registry consulted by {@link warnIfUnroutable} to check a seeded document routes. */
162
194
  protected readonly languageRegistry: ServerSharedServicesMinimal['ServiceRegistry'];
195
+ /** Whether startup runs {@link warnIfDocumentsUnserved}. */
196
+ protected readonly warnUnservedDocuments: boolean;
197
+ /** URIs of the documents the running startup's file traversal loaded; see {@link loadWorkspaceDocuments}. */
198
+ protected readonly traversedUris = new Set<string>();
199
+ /** How many documents {@link loadWorkspaceDocuments} reads and parses before it may yield; below 1 counts as 1. */
200
+ protected readonly loadChunkSize: number = 10;
163
201
 
164
- constructor(services: ServerSharedServicesMinimal, options: LogNameOptions = {}) {
202
+ constructor(services: ServerSharedServicesMinimal, options: HydraniumWorkspaceManagerOptions = {}) {
165
203
  super(services);
166
204
  this.projectManager = services.workspace.ProjectManager;
167
205
  this.projectManager.onProjectsChanged(event => this.onProjectsChanged(event));
168
206
  this.uriPolicy = services.workspace.DocumentUriPolicy;
207
+ this.serverLocale = services.ServerLocale;
169
208
  this.writableFileSystemProvider = services.workspace.FileSystemProvider;
170
209
  this.additionalDocuments = services.additionalDocuments;
171
210
  this.languageRegistry = services.ServiceRegistry;
211
+ this.warnUnservedDocuments = options.warnUnservedDocuments ?? true;
172
212
  this.tracer = services.Tracer.for(options.logName ?? 'WorkspaceManager').trace('instantiated');
173
213
  installOperationCancelledSuppression(this.tracer);
174
214
  }
@@ -197,16 +237,16 @@ export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
197
237
  // seeded. `tags` is read at the done-emit, so the document count pushed
198
238
  // inside the callback appears in the log line.
199
239
  const tags: string[] = [`${contributions.length} contributions`];
200
- let documentCount = 0;
240
+ const seeded: LangiumDocument[] = [];
201
241
  await this.tracer.time(
202
242
  'Load additional documents',
203
243
  async () => {
204
244
  await collectAdditionalDocuments(this.additionalDocuments, folders, document => {
205
- documentCount++;
245
+ seeded.push(document);
206
246
  this.warnIfUnroutable(document);
207
247
  collector(document);
208
248
  });
209
- tags.push(`${documentCount} documents`);
249
+ tags.push(`${seeded.length} documents`);
210
250
  },
211
251
  'info',
212
252
  { logAfterMs: 0, tags }
@@ -217,17 +257,18 @@ export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
217
257
  * Warn when a seeded additional document's URI matches no registered
218
258
  * language.
219
259
  *
220
- * Such a document is added to the workspace and indexed, but every
221
- * per-language service is resolved per URI — so scope computation, naming,
222
- * validation and serialisation all fail to route to it, and it contributes
223
- * nothing to the scopes it was written to populate. Nothing else reports
224
- * this: the document exists, so no lookup errors, it is simply inert.
260
+ * Every per-language service is resolved per URI, so the workspace cannot
261
+ * load such a document: adding it throws, and the startup build fails
262
+ * with an error naming only the extension, not the document. This
263
+ * line names the document and the fix first.
225
264
  *
226
- * The usual cause is a `virtualUri` with no file extension:
227
- * `virtualUri(contributor)` yields `virtual:<contributor>`, and routing has
228
- * nothing to match on — there is no extension, and a virtual document is
229
- * never open in `TextDocuments`, so the declared-languageId rung cannot
230
- * serve it either. The convention is to end the URI with a registered
265
+ * The usual cause is a `fromModel` or `fromStringInLanguage` document
266
+ * under a `virtualUri` with no file extension: `virtualUri(contributor)`
267
+ * yields `virtual:<contributor>`, and routing has nothing to match on —
268
+ * there is no extension, and a virtual document is never open in
269
+ * `TextDocuments`, so the declared-languageId rung cannot serve it either.
270
+ * A `fromString` document under such a URI never gets here: its parse
271
+ * throws first. The convention is to end the URI with a registered
231
272
  * extension by passing it as the last segment,
232
273
  * `virtualUri(contributor, 'name.<ext>')`.
233
274
  */
@@ -237,17 +278,16 @@ export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
237
278
  }
238
279
  const extensions = this.languageRegistry.all.flatMap(language => language.LanguageMetaData.fileExtensions);
239
280
  this.tracer.warn(
240
- `Additional document '${document.uri.toString()}' matches no registered language, so every per-language ` +
241
- 'service (scope computation, naming, validation, serialization) will fail to route to it and it will ' +
242
- `contribute nothing to scopes. End its URI with a registered file extension (${extensions.join(', ')}); ` +
281
+ `Additional document '${document.uri.toString()}' matches no registered language, so the workspace ` +
282
+ `cannot load it and the startup build fails. End its URI with a registered file extension (${extensions.join(', ')}); ` +
243
283
  'for a virtual document that means passing it as the last segment, `virtualUri(contributor, "name.<ext>")`.'
244
284
  );
245
285
  }
246
286
 
247
287
  protected override async performStartup(folders: WorkspaceFolder[]): Promise<LangiumDocument[]> {
248
- // Resolve the `{workspace}` file-tee placeholder (if configured) as early
249
- // as possible — before any build logging — so per-workspace log capture
250
- // names its file correctly and the buffered startup lines flush.
288
+ // Supply the `{workspace}` placeholder as early as possible — before any
289
+ // build logging — so per-workspace log capture names its file correctly
290
+ // and the buffered startup lines flush; the CPU profile reads it too.
251
291
  this.resolveWorkspaceLogTarget(folders);
252
292
  // Snapshot the document set around discovery so the descriptor documents
253
293
  // it creates can be identified afterwards. Plain iteration rather than
@@ -268,11 +308,136 @@ export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
268
308
  discovered.push(document);
269
309
  }
270
310
  }
271
- const documents = await super.performStartup(folders);
311
+ this.traversedUris.clear();
312
+ let documents: LangiumDocument[];
313
+ try {
314
+ documents = await super.performStartup(folders);
315
+ if (this.warnUnservedDocuments) {
316
+ await this.warnIfDocumentsUnserved(documents.filter(document => !this.traversedUris.has(document.uri.toString())));
317
+ }
318
+ } finally {
319
+ this.traversedUris.clear();
320
+ }
272
321
  this.probePathDivergence(folders);
273
322
  return this.withDiscoveredDescriptors(documents, discovered);
274
323
  }
275
324
 
325
+ /**
326
+ * Load the documents the file traversal found through
327
+ * {@link loadTraversedDocument}, {@link loadChunkSize} at a time, yielding
328
+ * between chunks once Langium's interruption period has passed. Langium's
329
+ * own load starts every read at once and parses each as it returns: over a
330
+ * synchronous provider nothing else runs until the last file has parsed, and
331
+ * over the Node provider incoming messages wait through long runs of parses.
332
+ * The cost: at most a chunk of reads is in flight, and each chunk waits for
333
+ * its slowest read, so slow storage takes a round per chunk, not one burst.
334
+ *
335
+ * Each loaded document is recorded, so startup can tell them from the
336
+ * documents `loadAdditionalDocuments` seeded, through the
337
+ * `additionalDocuments` group or an override of its own.
338
+ *
339
+ * The traversal found each of its documents through the provider, so asking
340
+ * it again whether they exist costs one call per workspace file and cannot
341
+ * come out false. Telling them apart by scheme does not work either: the
342
+ * registry's host answers every scheme no other provider claims, a seeded
343
+ * scheme nobody serves included. An override that loads documents without
344
+ * delegating here leaves them unrecorded, so startup asks the provider
345
+ * about each of them.
346
+ */
347
+ protected override async loadWorkspaceDocuments(uris: Stream<URI>, collector: (document: LangiumDocument) => void): Promise<void> {
348
+ const pending = uris.toArray();
349
+ const chunkSize = Math.max(1, this.loadChunkSize);
350
+ for (let i = 0; i < pending.length; i += chunkSize) {
351
+ if (i > 0) {
352
+ await interruptAndCheck(LOAD_YIELD_TOKEN);
353
+ }
354
+ await Promise.all(
355
+ pending.slice(i, i + chunkSize).map(async uri => {
356
+ const document = await this.loadTraversedDocument(uri);
357
+ if (document) {
358
+ this.traversedUris.add(document.uri.toString());
359
+ collector(document);
360
+ }
361
+ })
362
+ );
363
+ }
364
+ }
365
+
366
+ /**
367
+ * Load one document the file traversal found, or answer `undefined` to
368
+ * leave it out of the workspace.
369
+ *
370
+ * A file whose read fails and that the provider's `existsSettled`, or
371
+ * `exists` for a provider without it, reports gone is left out with a debug
372
+ * line, since it went between the scan and the read. A file still there is
373
+ * read once more, since a replacing rename can hide its name for a moment;
374
+ * that read's failure, and cancellation, fail the startup. A check that
375
+ * throws counts the file as there, since it cannot say the file went. The
376
+ * skip is the startup's only: other callers of `getOrCreateDocument` still
377
+ * get the read error.
378
+ */
379
+ protected async loadTraversedDocument(uri: URI): Promise<LangiumDocument | undefined> {
380
+ try {
381
+ return await this.langiumDocuments.getOrCreateDocument(uri);
382
+ } catch (error: unknown) {
383
+ if (isOperationCancelled(error)) {
384
+ throw error;
385
+ }
386
+ const fileSystem = this.writableFileSystemProvider;
387
+ if (!(await (fileSystem.existsSettled?.(uri) ?? fileSystem.exists(uri)).catch(() => true))) {
388
+ this.tracer.debug(`Skipped ${uri.toString()}: it was removed between the workspace scan and its load`);
389
+ return undefined;
390
+ }
391
+ return this.langiumDocuments.getOrCreateDocument(uri);
392
+ }
393
+ }
394
+
395
+ /**
396
+ * Warn once when the bound `FileSystemProvider` cannot serve a seeded
397
+ * document, naming each such document's scheme.
398
+ *
399
+ * The last close keeps a document only if the provider says it `exists`, so
400
+ * each such document leaves the workspace the first time an editor closes
401
+ * it, and whatever resolved against it breaks. The framework's registry
402
+ * serves `virtual:` through the `fileSystemProviders` group and every other
403
+ * scheme through its host, which knows nothing of a scheme an adopter
404
+ * invented for its seeded documents, and nothing else reports the loss. A
405
+ * provider that throws counts as not serving the document, since a startup
406
+ * that failed on a diagnostic would be worse than the loss.
407
+ *
408
+ * Runs over every document startup collected outside the file traversal,
409
+ * which is what `loadAdditionalDocuments` seeded, through the
410
+ * `additionalDocuments` group or an override of that method, once startup
411
+ * has added them to the workspace, unless `warnUnservedDocuments` is
412
+ * `false`.
413
+ */
414
+ protected async warnIfDocumentsUnserved(documents: readonly LangiumDocument[]): Promise<void> {
415
+ const unserved: URI[] = [];
416
+ for (const document of documents) {
417
+ let served = false;
418
+ try {
419
+ served = await this.writableFileSystemProvider.exists(document.uri);
420
+ } catch {
421
+ // Counted as unserved, below.
422
+ }
423
+ if (!served) {
424
+ unserved.push(document.uri);
425
+ }
426
+ }
427
+ if (unserved.length === 0) {
428
+ return;
429
+ }
430
+ const schemes = [...new Set(unserved.map(uri => uri.scheme))];
431
+ const named = unserved.slice(0, 3).map(uri => uri.toString());
432
+ this.tracer.warn(
433
+ `${unserved.length} seeded document(s) under ${schemes.map(scheme => `${scheme}:`).join(', ')} cannot be served by the bound workspace.FileSystemProvider ` +
434
+ `(${named.join(', ')}${unserved.length > 3 ? ', …' : ''}), so each leaves the workspace at its ` +
435
+ `last close. Register a provider under the key ${schemes.map(scheme => `'${scheme}'`).join(', ')} in the shared ` +
436
+ 'fileSystemProviders group, or serve the scheme from the host provider; set warnUnservedDocuments: false ' +
437
+ 'to accept the loss.'
438
+ );
439
+ }
440
+
276
441
  /**
277
442
  * Add back the documents project discovery created that Langium's file
278
443
  * traversal then filtered out.
@@ -347,9 +512,10 @@ export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
347
512
  }
348
513
 
349
514
  /**
350
- * Resolve the `{workspace}` file-tee placeholder from the first workspace
351
- * folder. No-op when no folder is known or no `{workspace}`-templated log
352
- * target is configured. See {@link toLogFileWorkspaceToken} for the token
515
+ * Supply the `{workspace}` placeholder from the first workspace folder, which
516
+ * the log file-tee and the CPU profile's file name both read, whether or not
517
+ * a log target is configured. No-op when no folder is known. See
518
+ * {@link toLogFileWorkspaceToken} for the token
353
519
  * derivation — a log-capturing test harness uses the same function so the
354
520
  * server's file name and the harness's correlation key agree.
355
521
  */
@@ -360,6 +526,31 @@ export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
360
526
  }
361
527
  }
362
528
 
529
+ /**
530
+ * Forward the locale the client declared, then Langium's own read of the
531
+ * params. `DefaultWorkspaceManager.initialize` reads `workspaceFolders`
532
+ * alone, so `params.locale` would otherwise be discarded — and this is the
533
+ * only place it arrives, which the headless init seams route through too.
534
+ *
535
+ * **The ABSENT case is reported from here rather than from `ServerLocale`,
536
+ * because this is the only end that can see it.** `accept` is not called
537
+ * when no locale was declared — nor should it be, since `''` is a claim
538
+ * about a language rather than the absence of one — so a log written there
539
+ * covers one of the two outcomes and leaves the other looking like a server
540
+ * that never reached init. Both lines are at `info` for the reason `accept`
541
+ * gives: the framework ships no catalogue, so an undeclared locale and an
542
+ * untranslated code produce the same English and the log is what separates
543
+ * them.
544
+ */
545
+ override initialize(params: InitializeParams): void {
546
+ if (params.locale) {
547
+ this.serverLocale.accept(params.locale);
548
+ } else {
549
+ this.tracer.info("no locale declared at init — rendering messages in the framework's English");
550
+ }
551
+ super.initialize(params);
552
+ }
553
+
363
554
  /**
364
555
  * Override of Langium's workspace setup to resolve / reject
365
556
  * {@link workspaceInitializedDeferred} once setup completes. Adopters with
@@ -367,22 +558,37 @@ export class HydraniumWorkspaceManager extends DefaultWorkspaceManager {
367
558
  * and either delegate to `super.initializeWorkspace(...)` (preserving the
368
559
  * default resolve) or call `this.workspaceInitializedDeferred.resolve(...)`
369
560
  * themselves after the additional work finishes.
561
+ *
562
+ * A failed setup is logged here, since every framework waiter on
563
+ * {@link workspaceInitialized} discards the rejection; an override that
564
+ * rejects the deferred itself logs its own failure. A failed startup also
565
+ * rejects `ready`, so its waiters fail rather than wait forever; an override
566
+ * that skips `super` and catches a failed startup rejects `_ready` too.
370
567
  */
371
568
  override async initializeWorkspace(folders: WorkspaceFolder[], cancelToken?: CancellationToken): Promise<void> {
372
569
  try {
373
570
  await super.initializeWorkspace(folders, cancelToken);
374
571
  this.workspaceInitializedDeferred.resolve(undefined);
375
- } catch (error) {
572
+ } catch (error: unknown) {
573
+ if (isOperationCancelled(error) || isConnectionGoneError(error)) {
574
+ this.tracer.debug(`Initial workspace build did not complete: ${describeError(error)}`);
575
+ } else {
576
+ this.tracer.error(`Initial workspace build failed: ${describeErrorWithStack(error)}`);
577
+ }
376
578
  this.workspaceInitializedDeferred.reject(error);
579
+ // Langium settles `ready` only after a startup that succeeded. Marked
580
+ // handled, as logged above; a no-op once startup has resolved it.
581
+ this._ready.reject(error);
582
+ this._ready.promise.catch(() => undefined);
377
583
  throw error;
378
584
  }
379
585
  }
380
586
 
381
587
  /**
382
588
  * Default cascade-rebuild handler. Iterates {@link ProjectChangeEvent.affectedDocuments}
383
- * and resets each to {@link DocumentState.Changed} so the next build cycle
384
- * re-runs the pipeline (parse → link → validate) under the new project
385
- * visibility scope.
589
+ * and resets each to {@link DocumentState.Changed} so the build of the update
590
+ * that changed the descriptor re-runs the pipeline (parse → link → validate)
591
+ * under the new project visibility scope.
386
592
  *
387
593
  * Subclasses can override for additional behaviour (e.g. logging,
388
594
  * telemetry, custom rebuild policies); call `super` to preserve the
@@ -9,21 +9,46 @@
9
9
 
10
10
  import { type FileSystemNode, URI } from '@hydranium/langium';
11
11
  import { defineMessage, type Tracer } from '@hydranium/protocol';
12
- import { type WritableFileSystemProvider } from '../../documents/ast-document-manager.js';
12
+ import { type WritableFileSystemProvider } from './file-system-provider.js';
13
13
  import { type LogNameOptions } from '../diagnostics/logger.js';
14
14
  import { serverSharedFactory, type ServerSharedServicesMinimal } from '../shared-services.js';
15
- import { serveVirtualDocument } from './virtual-document.js';
15
+ import { notFound } from './file-not-found.js';
16
16
 
17
17
  /**
18
- * The browser host's spelling of "the document is not there". Its Node
19
- * counterpart is `NO_LOADABLE_CONTENT`: this provider has no `realpath`, so the
20
- * URI policy cannot answer the existence question ahead of the read and the miss
21
- * surfaces here instead.
18
+ * A provider's spelling of "the document is not there", raised wherever a read
19
+ * finds no content — this filesystem, or a URI naming no location a disk-backed
20
+ * provider can reach. Distinct from `NO_LOADABLE_CONTENT`, which the URI policy
21
+ * raises when it can settle the question AHEAD of the read; a provider with no
22
+ * `realpath` cannot, so the miss surfaces here instead.
22
23
  */
23
24
  export const NO_SUCH_FILE = defineMessage('hydranium/core/no-such-file', 'No such file: {uri}');
24
25
 
26
+ /** The same for a node of any kind, so it also covers a directory. */
25
27
  export const NO_SUCH_PATH = defineMessage('hydranium/core/no-such-path', 'No such file or directory: {uri}');
26
28
 
29
+ /**
30
+ * A write addressed a URI the provider cannot reach on disk.
31
+ *
32
+ * Deliberately not a not-found code: {@link NO_SUCH_FILE} reports something
33
+ * missing, which a caller may reasonably answer by creating it — exactly the
34
+ * wrong reading here. The destination is not missing; the URI names no disk
35
+ * location at all, and no retry makes it one.
36
+ *
37
+ * Declared here rather than beside the Node provider that raises it, so the
38
+ * message catalog stays reachable from the portable `.` entry — the Node
39
+ * module pulls `node:fs` and is server-only.
40
+ */
41
+ export const UNSUPPORTED_WRITE = defineMessage(
42
+ 'hydranium/core/unsupported-write',
43
+ 'Cannot write {uri}: the scheme names no location on disk'
44
+ );
45
+
46
+ /** A delete addressed a URI the provider cannot reach on disk, as {@link UNSUPPORTED_WRITE} a write. */
47
+ export const UNSUPPORTED_DELETE = defineMessage(
48
+ 'hydranium/core/unsupported-delete',
49
+ 'Cannot delete {uri}: the scheme names no location on disk'
50
+ );
51
+
27
52
  /**
28
53
  * File content keyed by path, for seeding an {@link InMemoryFileSystemProvider}.
29
54
  *
@@ -117,41 +142,47 @@ export class InMemoryFileSystemProvider implements WritableFileSystemProvider {
117
142
  this.files.set(normalize(uri), content);
118
143
  }
119
144
 
120
- /** Remove the file at `uri`. A no-op when nothing is there. */
121
- deleteFile(uri: URI): void {
122
- this.files.delete(normalize(uri));
145
+ /** Remove the file at `uri`. A no-op when nothing is there; a directory is refused. */
146
+ async deleteFile(uri: URI): Promise<void> {
147
+ const key = normalize(uri);
148
+ if (this.hasChildren(key)) {
149
+ throw new Error(`Cannot delete ${uri.toString()}: it is a directory`);
150
+ }
151
+ this.files.delete(key);
123
152
  }
124
153
 
125
154
  async writeFile(uri: URI, content: string): Promise<void> {
126
155
  this.setFile(uri, content);
127
156
  }
128
157
 
129
- readFile(uri: URI): Promise<string> {
130
- return Promise.resolve(this.readFileSync(uri));
158
+ // `async` on each read whose sync twin can throw, rather than
159
+ // `Promise.resolve(this.<x>Sync(uri))`. That form evaluates the sync call
160
+ // FIRST, so a miss throws before `Promise.resolve` is ever reached — and a
161
+ // synchronous throw escapes the promise chain: `.catch()` never attaches and
162
+ // `Promise.all` dies while its argument array is still being built, so a
163
+ // caller reading several URIs cannot handle the miss it asked about.
164
+ async readFile(uri: URI): Promise<string> {
165
+ return this.readFileSync(uri);
131
166
  }
132
167
 
133
168
  readFileSync(uri: URI): string {
134
- const served = serveVirtualDocument(this.services, uri);
135
- if (served !== undefined) {
136
- return served;
137
- }
138
169
  const content = this.files.get(normalize(uri));
139
170
  if (content === undefined) {
140
- throw new Error(NO_SUCH_FILE.format({ uri: uri.toString() }));
171
+ throw notFound(NO_SUCH_FILE.format({ uri: uri.toString() }), uri);
141
172
  }
142
173
  return content;
143
174
  }
144
175
 
145
- readBinary(uri: URI): Promise<Uint8Array> {
146
- return Promise.resolve(this.readBinarySync(uri));
176
+ async readBinary(uri: URI): Promise<Uint8Array> {
177
+ return this.readBinarySync(uri);
147
178
  }
148
179
 
149
180
  readBinarySync(uri: URI): Uint8Array {
150
181
  return new TextEncoder().encode(this.readFileSync(uri));
151
182
  }
152
183
 
153
- stat(uri: URI): Promise<FileSystemNode> {
154
- return Promise.resolve(this.statSync(uri));
184
+ async stat(uri: URI): Promise<FileSystemNode> {
185
+ return this.statSync(uri);
155
186
  }
156
187
 
157
188
  statSync(uri: URI): FileSystemNode {
@@ -162,7 +193,7 @@ export class InMemoryFileSystemProvider implements WritableFileSystemProvider {
162
193
  if (this.hasChildren(path)) {
163
194
  return { isFile: false, isDirectory: true, uri };
164
195
  }
165
- throw new Error(NO_SUCH_PATH.format({ uri: uri.toString() }));
196
+ throw notFound(NO_SUCH_PATH.format({ uri: uri.toString() }), uri);
166
197
  }
167
198
 
168
199
  exists(uri: URI): Promise<boolean> {
@@ -239,8 +270,8 @@ function normalize(uri: URI | string): string {
239
270
  * services context exactly where a Node host spreads `NodeFileSystem`.
240
271
  *
241
272
  * A host that needs to reach the provider afterwards — to seed or mutate it
242
- * mid-test — reads it back off `shared.workspace.FileSystemProvider`, since the
243
- * slot owns construction.
273
+ * mid-test — narrows `shared.workspace.FileSystemProvider.host` to this
274
+ * class, since the slot owns construction.
244
275
  */
245
276
  export function inMemoryFileSystem(options: InMemoryFileSystemOptions = {}): {
246
277
  fileSystemProvider: (services: unknown) => WritableFileSystemProvider;
@@ -11,6 +11,7 @@ export * from './document-uri-policy.js';
11
11
  export * from './file-system-provider.js';
12
12
  export * from './in-memory-file-system-provider.js';
13
13
  export * from './persistent-file-system-provider.js';
14
+ export * from './self-save-registry.js';
14
15
  export * from './index-manager.js';
15
16
  export * from './initialize-workspace.js';
16
17
  export * from './langium-documents.js';
@@ -8,6 +8,7 @@
8
8
  ********************************************************************************/
9
9
 
10
10
  import { UriUtils, URI } from '@hydranium/langium';
11
+ import type { Locale } from '@hydranium/protocol';
11
12
  // Bare `'path'` (not `node:path`) so a browser bundle can alias it to a POSIX
12
13
  // shim — this is the only filesystem-path use left on the portable `.` entry,
13
14
  // and it's the headless/CLI string-input convenience of `toWorkspaceFolders`.
@@ -18,6 +19,33 @@ import type { ServerSharedServicesMinimal } from '../shared-services.js';
18
19
  /** A workspace folder root accepted by the headless init seams: a filesystem path or a {@link URI}. */
19
20
  export type WorkspaceFolderInput = string | URI;
20
21
 
22
+ /**
23
+ * Options for the headless init seams.
24
+ *
25
+ * **Optional, and the parameter is optional too**, so that no existing caller
26
+ * has to change to gain a field it does not set.
27
+ */
28
+ export interface ProgrammaticInitOptions {
29
+ /**
30
+ * The locale to render user-facing server messages in — the headless
31
+ * equivalent of LSP `initialize`'s `locale`, for a head with no LSP
32
+ * connection (`startStdioServer`, the CLI subcommands, a test harness).
33
+ *
34
+ * Omitted means no locale, which the default renderer resolves as the
35
+ * framework's English. That is the correct answer for a headless tool: it
36
+ * has no reading user to have a language.
37
+ *
38
+ * **An IETF language tag, hyphenated — `de`, `de-CH`, `zh-Hant-TW` — and
39
+ * not the POSIX or Java spelling.** An LSP client is held to that syntax by
40
+ * the protocol, while a headless caller supplies the string itself and the
41
+ * obvious source is an environment variable holding `de_DE` or
42
+ * `en_US.UTF-8`. Neither is a tag, and the string is passed through
43
+ * unchecked, so a renderer that parses it finds nothing to match and every
44
+ * message renders in English.
45
+ */
46
+ readonly locale?: Locale;
47
+ }
48
+
21
49
  /**
22
50
  * Normalize the seam's flexible folder argument to LSP {@link WorkspaceFolder}s.
23
51
  * A `string` is resolved to an absolute filesystem path and wrapped as a
@@ -58,17 +86,25 @@ function toWorkspaceFolders(folders: WorkspaceFolderInput | ReadonlyArray<Worksp
58
86
  *
59
87
  * @param services the shared services tree the workspace manager lives on
60
88
  * @param folders one or more workspace roots (filesystem paths or URIs)
89
+ * @param options the message locale, when the caller has one
61
90
  */
62
91
  export async function initializeWorkspaceProgrammatically(
63
92
  services: ServerSharedServicesMinimal,
64
- folders: WorkspaceFolderInput | ReadonlyArray<WorkspaceFolderInput>
93
+ folders: WorkspaceFolderInput | ReadonlyArray<WorkspaceFolderInput>,
94
+ options: ProgrammaticInitOptions = {}
65
95
  ): Promise<void> {
66
96
  const workspaceFolders = toWorkspaceFolders(folders);
67
97
  const manager = services.workspace.WorkspaceManager;
68
- // `initialize` records the folders (DefaultWorkspaceManager reads only this
98
+ // `locale` goes through the synthesized params rather than a direct
99
+ // `acceptLocale` call, so this seam and a real LSP `initialize` reach the
100
+ // slot by the SAME path — an adopter overriding the capture in
101
+ // `HydraniumWorkspaceManager.initialize` is honoured headlessly too, which a
102
+ // second write site here would silently bypass.
103
+ //
104
+ // `initialize` records the folders (DefaultWorkspaceManager reads only that
69
105
  // field); `initialized` runs `mutex.write(initializeWorkspace)` and resolves
70
106
  // once discovery + the init build settle, so awaiting it is the ready gate.
71
- manager.initialize({ workspaceFolders } as InitializeParams);
107
+ manager.initialize({ workspaceFolders, locale: options.locale } as InitializeParams);
72
108
  await manager.initialized({} as InitializedParams);
73
109
  }
74
110
 
@@ -91,12 +127,14 @@ export async function initializeWorkspaceProgrammatically(
91
127
  *
92
128
  * @param services the shared services tree the workspace manager lives on
93
129
  * @param folders one or more workspace roots (filesystem paths or URIs)
130
+ * @param options the message locale, when the caller has one
94
131
  */
95
132
  export async function buildWorkspaceProgrammatically(
96
133
  services: ServerSharedServicesMinimal,
97
- folders: WorkspaceFolderInput | ReadonlyArray<WorkspaceFolderInput>
134
+ folders: WorkspaceFolderInput | ReadonlyArray<WorkspaceFolderInput>,
135
+ options: ProgrammaticInitOptions = {}
98
136
  ): Promise<void> {
99
- await initializeWorkspaceProgrammatically(services, folders);
137
+ await initializeWorkspaceProgrammatically(services, folders, options);
100
138
  const documents = services.workspace.LangiumDocuments.all.toArray();
101
139
  await services.workspace.DocumentBuilder.build(documents, { validation: true });
102
140
  }