@hydranium/core 1.0.0-next.8 → 1.0.0-next.85

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 (306) hide show
  1. package/lib/documents/ast-document-manager.d.ts +75 -16
  2. package/lib/documents/ast-document-manager.d.ts.map +1 -1
  3. package/lib/documents/ast-document-manager.js +57 -19
  4. package/lib/documents/ast-document-manager.js.map +1 -1
  5. package/lib/documents/client-ids.d.ts +5 -19
  6. package/lib/documents/client-ids.d.ts.map +1 -1
  7. package/lib/documents/client-ids.js +5 -19
  8. package/lib/documents/client-ids.js.map +1 -1
  9. package/lib/documents/hydranium-text-documents.d.ts +55 -21
  10. package/lib/documents/hydranium-text-documents.d.ts.map +1 -1
  11. package/lib/documents/hydranium-text-documents.js +142 -46
  12. package/lib/documents/hydranium-text-documents.js.map +1 -1
  13. package/lib/documents/language-client-text-shadow.d.ts +41 -9
  14. package/lib/documents/language-client-text-shadow.d.ts.map +1 -1
  15. package/lib/documents/language-client-text-shadow.js +56 -11
  16. package/lib/documents/language-client-text-shadow.js.map +1 -1
  17. package/lib/documents/self-save-registry.d.ts +37 -6
  18. package/lib/documents/self-save-registry.d.ts.map +1 -1
  19. package/lib/documents/self-save-registry.js +28 -15
  20. package/lib/documents/self-save-registry.js.map +1 -1
  21. package/lib/index.d.ts +2 -0
  22. package/lib/index.d.ts.map +1 -1
  23. package/lib/index.js +5 -0
  24. package/lib/index.js.map +1 -1
  25. package/lib/langium/ast-extension/ast-node-builder.d.ts +32 -9
  26. package/lib/langium/ast-extension/ast-node-builder.d.ts.map +1 -1
  27. package/lib/langium/ast-extension/ast-node-builder.js +60 -22
  28. package/lib/langium/ast-extension/ast-node-builder.js.map +1 -1
  29. package/lib/langium/bootstrap.d.ts.map +1 -1
  30. package/lib/langium/bootstrap.js +16 -9
  31. package/lib/langium/bootstrap.js.map +1 -1
  32. package/lib/langium/config/configuration-provider.d.ts +81 -0
  33. package/lib/langium/config/configuration-provider.d.ts.map +1 -0
  34. package/lib/langium/config/configuration-provider.js +112 -0
  35. package/lib/langium/config/configuration-provider.js.map +1 -0
  36. package/lib/langium/config/index.d.ts +1 -0
  37. package/lib/langium/config/index.d.ts.map +1 -1
  38. package/lib/langium/config/index.js +1 -0
  39. package/lib/langium/config/index.js.map +1 -1
  40. package/lib/langium/diagnostics/lsp-logger.d.ts +17 -0
  41. package/lib/langium/diagnostics/lsp-logger.d.ts.map +1 -1
  42. package/lib/langium/diagnostics/lsp-logger.js +40 -6
  43. package/lib/langium/diagnostics/lsp-logger.js.map +1 -1
  44. package/lib/langium/document-builder/build-pipeline-integration.d.ts +13 -1
  45. package/lib/langium/document-builder/build-pipeline-integration.d.ts.map +1 -1
  46. package/lib/langium/document-builder/build-pipeline-integration.js +1 -1
  47. package/lib/langium/document-builder/build-pipeline-integration.js.map +1 -1
  48. package/lib/langium/document-builder/build-session.d.ts +93 -0
  49. package/lib/langium/document-builder/build-session.d.ts.map +1 -0
  50. package/lib/langium/document-builder/build-session.js +72 -0
  51. package/lib/langium/document-builder/build-session.js.map +1 -0
  52. package/lib/langium/document-builder/document-builder.d.ts +150 -7
  53. package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
  54. package/lib/langium/document-builder/document-builder.js +298 -11
  55. package/lib/langium/document-builder/document-builder.js.map +1 -1
  56. package/lib/langium/document-builder/index.d.ts +1 -0
  57. package/lib/langium/document-builder/index.d.ts.map +1 -1
  58. package/lib/langium/document-builder/index.js +1 -0
  59. package/lib/langium/document-builder/index.js.map +1 -1
  60. package/lib/langium/integration-services.d.ts +45 -1
  61. package/lib/langium/integration-services.d.ts.map +1 -1
  62. package/lib/langium/integration-services.js +10 -5
  63. package/lib/langium/integration-services.js.map +1 -1
  64. package/lib/langium/integrity/integrity-service.d.ts +5 -0
  65. package/lib/langium/integrity/integrity-service.d.ts.map +1 -1
  66. package/lib/langium/integrity/integrity-service.js +34 -1
  67. package/lib/langium/integrity/integrity-service.js.map +1 -1
  68. package/lib/langium/keys/containment.d.ts +64 -0
  69. package/lib/langium/keys/containment.d.ts.map +1 -0
  70. package/lib/langium/keys/containment.js +53 -0
  71. package/lib/langium/keys/containment.js.map +1 -0
  72. package/lib/langium/keys/index.d.ts +1 -0
  73. package/lib/langium/keys/index.d.ts.map +1 -1
  74. package/lib/langium/keys/index.js +1 -0
  75. package/lib/langium/keys/index.js.map +1 -1
  76. package/lib/langium/keys/name-based-key-provider.d.ts +4 -0
  77. package/lib/langium/keys/name-based-key-provider.d.ts.map +1 -1
  78. package/lib/langium/keys/name-based-key-provider.js +4 -0
  79. package/lib/langium/keys/name-based-key-provider.js.map +1 -1
  80. package/lib/langium/model-service/model-service.d.ts +149 -10
  81. package/lib/langium/model-service/model-service.d.ts.map +1 -1
  82. package/lib/langium/model-service/model-service.js +120 -93
  83. package/lib/langium/model-service/model-service.js.map +1 -1
  84. package/lib/langium/module.d.ts +84 -15
  85. package/lib/langium/module.d.ts.map +1 -1
  86. package/lib/langium/module.js +26 -12
  87. package/lib/langium/module.js.map +1 -1
  88. package/lib/langium/naming/name-provider.d.ts +25 -4
  89. package/lib/langium/naming/name-provider.d.ts.map +1 -1
  90. package/lib/langium/naming/name-provider.js +2 -1
  91. package/lib/langium/naming/name-provider.js.map +1 -1
  92. package/lib/langium/naming/name-separator-validation.d.ts +23 -0
  93. package/lib/langium/naming/name-separator-validation.d.ts.map +1 -1
  94. package/lib/langium/naming/name-separator-validation.js +30 -1
  95. package/lib/langium/naming/name-separator-validation.js.map +1 -1
  96. package/lib/langium/residency/cst-residency-service.d.ts +31 -9
  97. package/lib/langium/residency/cst-residency-service.d.ts.map +1 -1
  98. package/lib/langium/residency/cst-residency-service.js +13 -56
  99. package/lib/langium/residency/cst-residency-service.js.map +1 -1
  100. package/lib/langium/scope/hydranium-scope-provider.d.ts +32 -13
  101. package/lib/langium/scope/hydranium-scope-provider.d.ts.map +1 -1
  102. package/lib/langium/scope/hydranium-scope-provider.js +37 -20
  103. package/lib/langium/scope/hydranium-scope-provider.js.map +1 -1
  104. package/lib/langium/shared-services.d.ts +15 -2
  105. package/lib/langium/shared-services.d.ts.map +1 -1
  106. package/lib/langium/shared-services.js.map +1 -1
  107. package/lib/langium/transfer/transfer-encoder.d.ts +60 -17
  108. package/lib/langium/transfer/transfer-encoder.d.ts.map +1 -1
  109. package/lib/langium/transfer/transfer-encoder.js +38 -16
  110. package/lib/langium/transfer/transfer-encoder.js.map +1 -1
  111. package/lib/langium/validation/document-validator.d.ts +294 -10
  112. package/lib/langium/validation/document-validator.d.ts.map +1 -1
  113. package/lib/langium/validation/document-validator.js +448 -5
  114. package/lib/langium/validation/document-validator.js.map +1 -1
  115. package/lib/langium/workspace/document-uri-policy.d.ts +3 -4
  116. package/lib/langium/workspace/document-uri-policy.d.ts.map +1 -1
  117. package/lib/langium/workspace/document-uri-policy.js +3 -4
  118. package/lib/langium/workspace/document-uri-policy.js.map +1 -1
  119. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts +25 -0
  120. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts.map +1 -1
  121. package/lib/langium/workspace/hydranium-langium-document-factory.js +25 -0
  122. package/lib/langium/workspace/hydranium-langium-document-factory.js.map +1 -1
  123. package/lib/langium/workspace/hydranium-workspace-manager.d.ts +21 -1
  124. package/lib/langium/workspace/hydranium-workspace-manager.d.ts.map +1 -1
  125. package/lib/langium/workspace/hydranium-workspace-manager.js +28 -0
  126. package/lib/langium/workspace/hydranium-workspace-manager.js.map +1 -1
  127. package/lib/langium/workspace/in-memory-file-system-provider.d.ts +8 -0
  128. package/lib/langium/workspace/in-memory-file-system-provider.d.ts.map +1 -1
  129. package/lib/langium/workspace/in-memory-file-system-provider.js +11 -2
  130. package/lib/langium/workspace/in-memory-file-system-provider.js.map +1 -1
  131. package/lib/langium/workspace/initialize-workspace.d.ts +22 -2
  132. package/lib/langium/workspace/initialize-workspace.d.ts.map +1 -1
  133. package/lib/langium/workspace/initialize-workspace.js +13 -5
  134. package/lib/langium/workspace/initialize-workspace.js.map +1 -1
  135. package/lib/langium/workspace/langium-documents.d.ts +79 -17
  136. package/lib/langium/workspace/langium-documents.d.ts.map +1 -1
  137. package/lib/langium/workspace/langium-documents.js +83 -28
  138. package/lib/langium/workspace/langium-documents.js.map +1 -1
  139. package/lib/locale/index.d.ts +10 -0
  140. package/lib/locale/index.d.ts.map +1 -0
  141. package/lib/locale/index.js +10 -0
  142. package/lib/locale/index.js.map +1 -0
  143. package/lib/locale/server-locale.d.ts +73 -0
  144. package/lib/locale/server-locale.d.ts.map +1 -0
  145. package/lib/locale/server-locale.js +61 -0
  146. package/lib/locale/server-locale.js.map +1 -0
  147. package/lib/lsp/hydranium-document-update-handler.js +1 -1
  148. package/lib/lsp/hydranium-document-update-handler.js.map +1 -1
  149. package/lib/lsp/index.d.ts +1 -1
  150. package/lib/lsp/index.d.ts.map +1 -1
  151. package/lib/lsp/index.js +1 -1
  152. package/lib/lsp/index.js.map +1 -1
  153. package/lib/lsp/lsp-latency.d.ts +39 -0
  154. package/lib/lsp/lsp-latency.d.ts.map +1 -0
  155. package/lib/lsp/lsp-latency.js +58 -0
  156. package/lib/lsp/lsp-latency.js.map +1 -0
  157. package/lib/lsp/semantic-token-provider.d.ts +34 -1
  158. package/lib/lsp/semantic-token-provider.d.ts.map +1 -1
  159. package/lib/lsp/semantic-token-provider.js +55 -8
  160. package/lib/lsp/semantic-token-provider.js.map +1 -1
  161. package/lib/messages/carriers.d.ts +54 -0
  162. package/lib/messages/carriers.d.ts.map +1 -0
  163. package/lib/messages/carriers.js +62 -0
  164. package/lib/messages/carriers.js.map +1 -0
  165. package/lib/messages/index.d.ts +25 -0
  166. package/lib/messages/index.d.ts.map +1 -0
  167. package/lib/messages/index.js +25 -0
  168. package/lib/messages/index.js.map +1 -0
  169. package/lib/messages/renderer.d.ts +136 -0
  170. package/lib/messages/renderer.d.ts.map +1 -0
  171. package/lib/messages/renderer.js +159 -0
  172. package/lib/messages/renderer.js.map +1 -0
  173. package/lib/node/heap-ceiling.d.ts +61 -0
  174. package/lib/node/heap-ceiling.d.ts.map +1 -0
  175. package/lib/node/heap-ceiling.js +72 -0
  176. package/lib/node/heap-ceiling.js.map +1 -0
  177. package/lib/node/index.d.ts +1 -0
  178. package/lib/node/index.d.ts.map +1 -1
  179. package/lib/node/index.js +1 -0
  180. package/lib/node/index.js.map +1 -1
  181. package/lib/node/latency-from-env.d.ts +1 -1
  182. package/lib/node/latency-from-env.js +1 -1
  183. package/lib/node/node-file-system-provider.d.ts.map +1 -1
  184. package/lib/node/node-file-system-provider.js +1 -40
  185. package/lib/node/node-file-system-provider.js.map +1 -1
  186. package/lib/node/profiling-run.d.ts +2 -2
  187. package/lib/node/profiling-run.js +1 -1
  188. package/lib/node/profiling-run.js.map +1 -1
  189. package/lib/node/rename-over-open-readers.d.ts +52 -0
  190. package/lib/node/rename-over-open-readers.d.ts.map +1 -0
  191. package/lib/node/rename-over-open-readers.js +66 -0
  192. package/lib/node/rename-over-open-readers.js.map +1 -0
  193. package/lib/testing/fake-document.d.ts +16 -4
  194. package/lib/testing/fake-document.d.ts.map +1 -1
  195. package/lib/testing/fake-document.js +18 -3
  196. package/lib/testing/fake-document.js.map +1 -1
  197. package/lib/testing/make-noop-shared-services.d.ts +14 -0
  198. package/lib/testing/make-noop-shared-services.d.ts.map +1 -1
  199. package/lib/testing/make-noop-shared-services.js +28 -2
  200. package/lib/testing/make-noop-shared-services.js.map +1 -1
  201. package/lib/testing/make-test-services.d.ts +44 -8
  202. package/lib/testing/make-test-services.d.ts.map +1 -1
  203. package/lib/testing/make-test-services.js +19 -3
  204. package/lib/testing/make-test-services.js.map +1 -1
  205. package/lib/testing/node/spawned-server.d.ts +14 -0
  206. package/lib/testing/node/spawned-server.d.ts.map +1 -1
  207. package/lib/testing/node/spawned-server.js +33 -1
  208. package/lib/testing/node/spawned-server.js.map +1 -1
  209. package/lib/testing/playwright/flaky-network-proxy.d.ts +76 -0
  210. package/lib/testing/playwright/flaky-network-proxy.d.ts.map +1 -0
  211. package/lib/testing/playwright/flaky-network-proxy.js +164 -0
  212. package/lib/testing/playwright/flaky-network-proxy.js.map +1 -0
  213. package/lib/testing/playwright/index.d.ts +1 -0
  214. package/lib/testing/playwright/index.d.ts.map +1 -1
  215. package/lib/testing/playwright/index.js +1 -0
  216. package/lib/testing/playwright/index.js.map +1 -1
  217. package/lib/testing/playwright/server-log-capture.d.ts +14 -4
  218. package/lib/testing/playwright/server-log-capture.d.ts.map +1 -1
  219. package/lib/testing/playwright/server-log-capture.js +21 -4
  220. package/lib/testing/playwright/server-log-capture.js.map +1 -1
  221. package/lib/testing/playwright/server-log-rename-reporter.d.ts.map +1 -1
  222. package/lib/testing/playwright/server-log-rename-reporter.js +10 -1
  223. package/lib/testing/playwright/server-log-rename-reporter.js.map +1 -1
  224. package/lib/testing/stub-ast-document-manager.d.ts +5 -5
  225. package/lib/testing/stub-ast-document-manager.d.ts.map +1 -1
  226. package/lib/testing/stub-ast-document-manager.js +4 -6
  227. package/lib/testing/stub-ast-document-manager.js.map +1 -1
  228. package/lib/testing/stub-document-builder.d.ts +8 -0
  229. package/lib/testing/stub-document-builder.d.ts.map +1 -1
  230. package/lib/testing/stub-document-builder.js +22 -3
  231. package/lib/testing/stub-document-builder.js.map +1 -1
  232. package/lib/testing/stub-langium-documents.d.ts +3 -2
  233. package/lib/testing/stub-langium-documents.d.ts.map +1 -1
  234. package/lib/testing/stub-langium-documents.js.map +1 -1
  235. package/lib/testing/stub-model-service.d.ts +5 -4
  236. package/lib/testing/stub-model-service.d.ts.map +1 -1
  237. package/lib/testing/stub-model-service.js +2 -2
  238. package/lib/testing/stub-model-service.js.map +1 -1
  239. package/package.json +17 -8
  240. package/src/documents/ast-document-manager.ts +129 -36
  241. package/src/documents/client-ids.ts +5 -22
  242. package/src/documents/hydranium-text-documents.ts +167 -61
  243. package/src/documents/language-client-text-shadow.ts +59 -11
  244. package/src/documents/self-save-registry.ts +52 -13
  245. package/src/index.ts +5 -0
  246. package/src/langium/ast-extension/ast-node-builder.ts +66 -22
  247. package/src/langium/bootstrap.ts +16 -9
  248. package/src/langium/config/configuration-provider.ts +119 -0
  249. package/src/langium/config/index.ts +1 -0
  250. package/src/langium/diagnostics/lsp-logger.ts +41 -6
  251. package/src/langium/document-builder/build-pipeline-integration.ts +14 -1
  252. package/src/langium/document-builder/build-session.ts +87 -0
  253. package/src/langium/document-builder/document-builder.ts +339 -11
  254. package/src/langium/document-builder/index.ts +1 -0
  255. package/src/langium/integration-services.ts +67 -6
  256. package/src/langium/integrity/integrity-service.ts +35 -1
  257. package/src/langium/keys/containment.ts +87 -0
  258. package/src/langium/keys/index.ts +1 -0
  259. package/src/langium/keys/name-based-key-provider.ts +4 -0
  260. package/src/langium/model-service/model-service.ts +211 -30
  261. package/src/langium/module.ts +106 -21
  262. package/src/langium/naming/name-provider.ts +27 -5
  263. package/src/langium/naming/name-separator-validation.ts +34 -5
  264. package/src/langium/residency/cst-residency-service.ts +36 -12
  265. package/src/langium/scope/hydranium-scope-provider.ts +40 -22
  266. package/src/langium/shared-services.ts +19 -2
  267. package/src/langium/transfer/transfer-encoder.ts +85 -24
  268. package/src/langium/validation/document-validator.ts +537 -11
  269. package/src/langium/workspace/document-uri-policy.ts +3 -4
  270. package/src/langium/workspace/hydranium-langium-document-factory.ts +34 -0
  271. package/src/langium/workspace/hydranium-workspace-manager.ts +30 -1
  272. package/src/langium/workspace/in-memory-file-system-provider.ts +13 -3
  273. package/src/langium/workspace/initialize-workspace.ts +34 -5
  274. package/src/langium/workspace/langium-documents.ts +106 -33
  275. package/src/locale/index.ts +10 -0
  276. package/src/locale/server-locale.ts +86 -0
  277. package/src/lsp/hydranium-document-update-handler.ts +1 -1
  278. package/src/lsp/index.ts +1 -1
  279. package/src/lsp/lsp-latency.ts +62 -0
  280. package/src/lsp/semantic-token-provider.ts +74 -7
  281. package/src/messages/carriers.ts +78 -0
  282. package/src/messages/index.ts +36 -0
  283. package/src/messages/renderer.ts +204 -0
  284. package/src/node/heap-ceiling.ts +108 -0
  285. package/src/node/index.ts +1 -0
  286. package/src/node/latency-from-env.ts +1 -1
  287. package/src/node/node-file-system-provider.ts +1 -41
  288. package/src/node/profiling-run.ts +3 -3
  289. package/src/node/rename-over-open-readers.ts +78 -0
  290. package/src/testing/fake-document.ts +24 -5
  291. package/src/testing/make-noop-shared-services.ts +50 -2
  292. package/src/testing/make-test-services.ts +73 -18
  293. package/src/testing/node/spawned-server.ts +35 -1
  294. package/src/testing/playwright/flaky-network-proxy.ts +240 -0
  295. package/src/testing/playwright/index.ts +1 -0
  296. package/src/testing/playwright/server-log-capture.ts +24 -5
  297. package/src/testing/playwright/server-log-rename-reporter.ts +12 -1
  298. package/src/testing/stub-ast-document-manager.ts +10 -14
  299. package/src/testing/stub-document-builder.ts +32 -3
  300. package/src/testing/stub-langium-documents.ts +3 -2
  301. package/src/testing/stub-model-service.ts +7 -6
  302. package/lib/lsp/instrument-connection.d.ts +0 -36
  303. package/lib/lsp/instrument-connection.d.ts.map +0 -1
  304. package/lib/lsp/instrument-connection.js +0 -62
  305. package/lib/lsp/instrument-connection.js.map +0 -1
  306. package/src/lsp/instrument-connection.ts +0 -66
@@ -8,10 +8,11 @@
8
8
  ********************************************************************************/
9
9
 
10
10
  import {
11
+ hasMessageIdentity,
11
12
  type Tracer,
12
13
  type TransferDiagnostic,
13
14
  type TransferElement,
14
- type TransferDocument,
15
+ TransferDocument,
15
16
  type TransferTypeFor
16
17
  } from '@hydranium/protocol';
17
18
  import { AstUtils, type AstNode, DocumentCache, DocumentState, isAstNode, isReference, type LangiumDocument } from '@hydranium/langium';
@@ -19,7 +20,7 @@ import { Diagnostic, DiagnosticSeverity } from 'vscode-languageserver-protocol';
19
20
  import { type AstDocument } from '../../documents/ast-document-manager.js';
20
21
  import { type LogNameOptions } from '../diagnostics/logger.js';
21
22
  import { type ServerSharedServicesMinimal } from '../shared-services.js';
22
- import { type TransferLspDiagnostic } from '../validation/document-validator.js';
23
+ import { type AstDiagnostic } from '../validation/document-validator.js';
23
24
 
24
25
  /**
25
26
  * Which set of properties {@link TransferEncoder.toTransfer} emits.
@@ -28,11 +29,13 @@ import { type TransferLspDiagnostic } from '../validation/document-validator.js'
28
29
  * including AST-extension-derived computed scalars and synthetic child
29
30
  * mirrors. This is the wire shape clients consume, and the default.
30
31
  * - `'grammar'` — only the grammar-declared properties, per
31
- * `AstReflection.getTypeMetaData($type).properties`. Excludes every
32
- * computed / synthetic property by construction (no naming convention,
33
- * no registration). Yields the authored state a serializer round-trips —
34
- * a diffable, acyclic baseline for field-level recording / forward-write
35
- * reconcile.
32
+ * `AstReflection.getTypeMetaData($type).properties`, each carrying the
33
+ * node's own authored value. Excludes every computed / synthetic property
34
+ * by construction (no naming convention, no registration) and bypasses the
35
+ * `resolvePropertyValue` substitution hook, so neither a computed KEY nor a
36
+ * computed VALUE can reach this shape. Yields the authored state a
37
+ * serializer round-trips — a diffable, acyclic baseline for field-level
38
+ * recording / forward-write reconcile.
36
39
  */
37
40
  export type TransferMode = 'full' | 'grammar';
38
41
 
@@ -79,6 +82,37 @@ export interface TransferEnvelopeSource<TDiagnostic> {
79
82
  readonly diagnostics: readonly (TDiagnostic | Diagnostic)[];
80
83
  }
81
84
 
85
+ /**
86
+ * The AST→transfer contract a DI slot holds, implemented by
87
+ * {@link DefaultTransferEncoder}.
88
+ *
89
+ * **This is an interface and not the class, and that is load-bearing.** A class
90
+ * in a slot drags its `protected` members into every assignability check, which
91
+ * TypeScript compares NOMINALLY — so the slot type could not be satisfied by a
92
+ * subclass declared against a second physical copy of this package, and an
93
+ * adopter narrowing the slot had to intersect with the framework's declaration
94
+ * rather than replace it, leaving method resolution dependent on declaration
95
+ * order. An interface has no protected members and is compared structurally, so
96
+ * neither applies.
97
+ *
98
+ * **The transfer returns are the structural base ({@link TransferElement}), not
99
+ * the per-grammar overlay.** The overlay cannot parameterise this contract:
100
+ * `TransferTypeFor` reaches `keyof TTransferMap`, which makes that parameter
101
+ * measured-INVARIANT, and invariant parameters relate only when their arguments
102
+ * are mutually assignable — so a map-parameterised contract admits no adopter
103
+ * instantiation at all. Heads read this contract and do not know adopter maps;
104
+ * an adopter recovers the precise type by declaring its own slot, which it can
105
+ * now do by replacement.
106
+ */
107
+ export interface TransferEncoder<TDiagnostic extends TransferDiagnostic = TransferDiagnostic> {
108
+ toTransfer<T extends AstNode>(ast: T, mode?: TransferMode): TransferElement;
109
+ toTransferDocument(langiumDocument: LangiumDocument): TransferDocument<TransferElement, TDiagnostic>;
110
+ astDocumentToTransferDocument<TAst extends AstNode>(
111
+ document: AstDocument<TAst, AstDiagnostic>
112
+ ): TransferDocument<TransferElement, TDiagnostic>;
113
+ toTransferDiagnostic(diagnostic: AstDiagnostic): TDiagnostic;
114
+ }
115
+
82
116
  /**
83
117
  * One-directional structural mapper from a Langium AST into the wire
84
118
  * transfer-model shape ({@link TransferElement}-based JSON).
@@ -112,7 +146,8 @@ export interface TransferEnvelopeSource<TDiagnostic> {
112
146
  * - {@link propertyKeys} — which property names the walk visits.
113
147
  * - {@link shouldEmitProperty} — per-key filter on top of the default
114
148
  * `$`-internals strip.
115
- * - {@link resolvePropertyValue} — value substitution per property.
149
+ * - {@link resolvePropertyValue} — value substitution per property, `'full'`
150
+ * mode only (see there for why `'grammar'` bypasses it).
116
151
  * - {@link finalizeTransferNode} — post-decoration per encoded node.
117
152
  * - {@link toTransferValue} — recursion seam per property value. Override
118
153
  * to special-case reference encoding or to drop specific value shapes.
@@ -120,10 +155,10 @@ export interface TransferEnvelopeSource<TDiagnostic> {
120
155
  * - {@link toTransferDocument} — bundle root + diagnostics into the wire
121
156
  * {@link TransferDocument} envelope. Override to filter / merge
122
157
  * diagnostics from auxiliary sources or to project a synthesised root.
123
- * - {@link toTransferDiagnostic} — project a {@link TransferLspDiagnostic}
158
+ * - {@link toTransferDiagnostic} — project a {@link AstDiagnostic}
124
159
  * (the framework validator's output) to {@link TDiagnostic}.
125
160
  */
126
- export class TransferEncoder<
161
+ export class DefaultTransferEncoder<
127
162
  // The map is intentionally unconstrained — adopters supply typed
128
163
  // overlays whose specific-key shapes don't structurally satisfy a
129
164
  // `Record<string, TransferElement>` index signature. `TransferTypeFor`
@@ -226,7 +261,14 @@ export class TransferEncoder<
226
261
  if (!this.shouldEmitProperty(ast, key, context)) {
227
262
  continue;
228
263
  }
229
- const value = this.resolvePropertyValue(ast, key, context);
264
+ // `'grammar'` reads the authored value straight off the node rather than
265
+ // through `resolvePropertyValue`. The mode promises a shape the serializer
266
+ // round-trips, and a value-substitution hook cannot honour that: what it
267
+ // returns is by construction not what the document declared. Scoping the
268
+ // hook to `'full'` is what makes that guarantee structural instead of a
269
+ // rule every override has to remember.
270
+ const value =
271
+ context.mode === 'grammar' ? (ast as unknown as Record<string, unknown>)[key] : this.resolvePropertyValue(ast, key, context);
230
272
  // `'grammar'` lists every declared property, including those absent on
231
273
  // this node; skip the absent ones. (`'full'` enumerates only own
232
274
  // properties, so absent properties never surface there.) Part of the
@@ -267,8 +309,17 @@ export class TransferEncoder<
267
309
  }
268
310
 
269
311
  /**
270
- * Which value the walk emits under `key`. Default: the node's own value.
271
- * Override to substitute a derived value under a grammar property name.
312
+ * Which value the walk emits under `key`, in `'full'` mode ONLY. Default:
313
+ * the node's own value.
314
+ *
315
+ * Override to substitute a derived value under a grammar property name — an
316
+ * inheritance-resolved field, a preference-dependent label. `'grammar'`
317
+ * bypasses this hook and reads the node directly: that mode's contract is
318
+ * the authored state a serializer round-trips, and a substituted value is by
319
+ * construction not the one the document declared. An override that applied
320
+ * in both modes would leave the grammar shape carrying derived values under
321
+ * declared property names — diffable and acyclic still, but no longer
322
+ * authored, which is the property every consumer of that mode relies on.
272
323
  */
273
324
  protected resolvePropertyValue(ast: AstNode, key: string, _context: EncodeContext): unknown {
274
325
  return (ast as unknown as Record<string, unknown>)[key];
@@ -340,12 +391,12 @@ export class TransferEncoder<
340
391
  source: TransferEnvelopeSource<TDiagnostic>,
341
392
  root: TransferTypeFor<TAst, TTransferMap>
342
393
  ): TransferDocument<TransferTypeFor<TAst, TTransferMap>, TDiagnostic> {
343
- return {
344
- uri: source.uri,
345
- version: source.version,
394
+ return TransferDocument.create(
395
+ source.uri,
396
+ source.version,
346
397
  root,
347
- diagnostics: source.diagnostics.map(diagnostic => this.toTransferDiagnostic(diagnostic as TransferLspDiagnostic))
348
- };
398
+ source.diagnostics.map(diagnostic => this.toTransferDiagnostic(diagnostic as AstDiagnostic))
399
+ );
349
400
  }
350
401
 
351
402
  /**
@@ -359,7 +410,7 @@ export class TransferEncoder<
359
410
  * second `LangiumDocuments.getDocument` lookup.
360
411
  *
361
412
  * The `diagnostic` projection assumes the snapshot's diagnostics carry
362
- * the `TransferLspDiagnostic` shape ({@link Diagnostic} plus the
413
+ * the `AstDiagnostic` shape ({@link Diagnostic} plus the
363
414
  * framework validator's `element` / `property` decoration). Snapshots
364
415
  * built from raw Langium diagnostics structurally satisfy this — the
365
416
  * extra fields are optional in the projection.
@@ -370,7 +421,7 @@ export class TransferEncoder<
370
421
  * assembly seam rather than duplicating it.
371
422
  */
372
423
  astDocumentToTransferDocument<TAst extends AstNode>(
373
- document: AstDocument<TAst, TDiagnostic | TransferLspDiagnostic>
424
+ document: AstDocument<TAst, AstDiagnostic>
374
425
  ): TransferDocument<TransferTypeFor<TAst, TTransferMap>, TDiagnostic> {
375
426
  const root = this.encodeNode(document.root, this.createEncodeContext('full', document.uri)) as TransferTypeFor<TAst, TTransferMap>;
376
427
  return this.assembleTransferDocument<TAst>(document, root);
@@ -378,7 +429,7 @@ export class TransferEncoder<
378
429
 
379
430
  /**
380
431
  * Project an LSP-shaped diagnostic (typically a
381
- * {@link TransferLspDiagnostic} produced by
432
+ * {@link AstDiagnostic} produced by
382
433
  * `HydraniumDocumentValidator` — adds `element` + optional `property`
383
434
  * to the standard {@link Diagnostic} shape) to the wire-diagnostic
384
435
  * shape.
@@ -387,15 +438,24 @@ export class TransferEncoder<
387
438
  * LSP severity enum to the wire string union, discriminates the
388
439
  * diagnostic type from Langium's `data.code` (`'lexing-error'` /
389
440
  * `'parsing-error'` else `'validation-error'`), passes through
390
- * message / element / property / code. Adopters whose validator
441
+ * message / element / property / code, and lifts the framework message
442
+ * params out of `data` so a translating surface can render a
443
+ * parameterised diagnostic rather than a template with its placeholders
444
+ * left standing. Adopters whose validator
391
445
  * doesn't decorate diagnostics with `element` still get a valid
392
446
  * `TransferDiagnostic` — the field falls back to `''`.
393
447
  *
394
448
  * Override only if the wire-diagnostic shape needs fields beyond
395
449
  * what {@link TransferDiagnostic} carries.
396
450
  */
397
- toTransferDiagnostic(diagnostic: TransferLspDiagnostic): TDiagnostic {
451
+ toTransferDiagnostic(diagnostic: AstDiagnostic): TDiagnostic {
398
452
  const langiumCode = (diagnostic.data as { code?: string } | undefined)?.code;
453
+ // The same `data` the Langium code comes out of also carries the framework
454
+ // message identity, under its own key so the two conventions co-exist.
455
+ // Taking the params from there rather than from `code` is what lets a
456
+ // translating surface render a PARAMETERISED diagnostic: `code` survives on
457
+ // its own and yields a template with its placeholders left standing.
458
+ const identity = hasMessageIdentity(diagnostic.data) ? diagnostic.data.hydranium : undefined;
399
459
  const result: TransferDiagnostic = {
400
460
  type: langiumCode === 'lexing-error' ? 'lexing-error' : langiumCode === 'parsing-error' ? 'parsing-error' : 'validation-error',
401
461
  element: diagnostic.element ?? '',
@@ -408,7 +468,8 @@ export class TransferEncoder<
408
468
  : diagnostic.severity === DiagnosticSeverity.Warning
409
469
  ? 'warning'
410
470
  : 'info',
411
- code: typeof diagnostic.code === 'number' || typeof diagnostic.code === 'string' ? diagnostic.code : langiumCode
471
+ code: typeof diagnostic.code === 'number' || typeof diagnostic.code === 'string' ? diagnostic.code : langiumCode,
472
+ params: identity?.params
412
473
  };
413
474
  return result as TDiagnostic;
414
475
  }