gdc-common-utils-ts 1.14.9 → 1.14.13

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 (258) hide show
  1. package/README.md +55 -2
  2. package/dist/claims/claim-list-helpers.d.ts +21 -0
  3. package/dist/claims/claim-list-helpers.js +50 -0
  4. package/dist/claims/claims-helpers-allergy-intolerance.d.ts +10 -0
  5. package/dist/claims/claims-helpers-allergy-intolerance.js +47 -0
  6. package/dist/claims/claims-helpers-appointment-response.d.ts +8 -0
  7. package/dist/claims/claims-helpers-appointment-response.js +20 -0
  8. package/dist/claims/claims-helpers-appointment.d.ts +10 -0
  9. package/dist/claims/claims-helpers-appointment.js +26 -0
  10. package/dist/claims/claims-helpers-care-plan.d.ts +8 -0
  11. package/dist/claims/claims-helpers-care-plan.js +20 -0
  12. package/dist/claims/claims-helpers-clinical-impression.d.ts +10 -0
  13. package/dist/claims/claims-helpers-clinical-impression.js +26 -0
  14. package/dist/claims/claims-helpers-communication.d.ts +17 -0
  15. package/dist/claims/claims-helpers-communication.js +57 -0
  16. package/dist/claims/claims-helpers-composition.d.ts +12 -0
  17. package/dist/claims/claims-helpers-composition.js +32 -0
  18. package/dist/claims/claims-helpers-condition.d.ts +10 -0
  19. package/dist/claims/claims-helpers-condition.js +47 -0
  20. package/dist/claims/claims-helpers-consent.d.ts +112 -0
  21. package/dist/claims/claims-helpers-consent.js +271 -0
  22. package/dist/claims/claims-helpers-coverage.d.ts +10 -0
  23. package/dist/claims/claims-helpers-coverage.js +26 -0
  24. package/dist/claims/claims-helpers-device-use-statement.d.ts +8 -0
  25. package/dist/claims/claims-helpers-device-use-statement.js +20 -0
  26. package/dist/claims/claims-helpers-device.d.ts +8 -0
  27. package/dist/claims/claims-helpers-device.js +20 -0
  28. package/dist/claims/claims-helpers-diagnostic-report.d.ts +12 -0
  29. package/dist/claims/claims-helpers-diagnostic-report.js +32 -0
  30. package/dist/claims/claims-helpers-document-reference.d.ts +8 -0
  31. package/dist/claims/claims-helpers-document-reference.js +20 -0
  32. package/dist/claims/claims-helpers-encounter.d.ts +10 -0
  33. package/dist/claims/claims-helpers-encounter.js +26 -0
  34. package/dist/claims/claims-helpers-flag.d.ts +8 -0
  35. package/dist/claims/claims-helpers-flag.js +20 -0
  36. package/dist/claims/claims-helpers-immunization.d.ts +8 -0
  37. package/dist/claims/claims-helpers-immunization.js +20 -0
  38. package/dist/claims/claims-helpers-location.d.ts +10 -0
  39. package/dist/claims/claims-helpers-location.js +26 -0
  40. package/dist/claims/claims-helpers-medication-statement.d.ts +88 -0
  41. package/dist/claims/claims-helpers-medication-statement.js +259 -0
  42. package/dist/claims/claims-helpers-observation.d.ts +8 -0
  43. package/dist/claims/claims-helpers-observation.js +20 -0
  44. package/dist/claims/claims-helpers-organization.d.ts +12 -0
  45. package/dist/claims/claims-helpers-organization.js +32 -0
  46. package/dist/claims/claims-helpers-procedure.d.ts +8 -0
  47. package/dist/claims/claims-helpers-procedure.js +20 -0
  48. package/dist/claims/claims-helpers-related-person.d.ts +8 -0
  49. package/dist/claims/claims-helpers-related-person.js +20 -0
  50. package/dist/claims/index.d.ts +24 -0
  51. package/dist/claims/index.js +24 -0
  52. package/dist/constants/fhir-resource-types.d.ts +16 -0
  53. package/dist/constants/fhir-resource-types.js +8 -0
  54. package/dist/convert/convert-allergy-intolerance.d.ts +3 -0
  55. package/dist/convert/convert-allergy-intolerance.js +34 -0
  56. package/dist/convert/convert-appointment-response.d.ts +3 -0
  57. package/dist/convert/convert-appointment-response.js +32 -0
  58. package/dist/convert/convert-appointment.d.ts +3 -0
  59. package/dist/convert/convert-appointment.js +61 -0
  60. package/dist/convert/convert-care-plan.d.ts +3 -0
  61. package/dist/convert/convert-care-plan.js +58 -0
  62. package/dist/convert/convert-clinical-impression.d.ts +3 -0
  63. package/dist/convert/convert-clinical-impression.js +42 -0
  64. package/dist/convert/convert-composition.d.ts +3 -0
  65. package/dist/convert/convert-composition.js +35 -0
  66. package/dist/convert/convert-condition.d.ts +3 -0
  67. package/dist/convert/convert-condition.js +24 -0
  68. package/dist/convert/convert-coverage.d.ts +3 -0
  69. package/dist/convert/convert-coverage.js +51 -0
  70. package/dist/convert/convert-device-use-statement.d.ts +3 -0
  71. package/dist/convert/convert-device-use-statement.js +28 -0
  72. package/dist/convert/convert-device.d.ts +3 -0
  73. package/dist/convert/convert-device.js +37 -0
  74. package/dist/convert/convert-diagnostic-report.d.ts +3 -0
  75. package/dist/convert/convert-diagnostic-report.js +55 -0
  76. package/dist/convert/convert-document-reference.d.ts +3 -0
  77. package/dist/convert/convert-document-reference.js +35 -0
  78. package/dist/convert/convert-encounter.d.ts +3 -0
  79. package/dist/convert/convert-encounter.js +68 -0
  80. package/dist/convert/convert-flag.d.ts +3 -0
  81. package/dist/convert/convert-flag.js +34 -0
  82. package/dist/convert/convert-immunization.d.ts +3 -0
  83. package/dist/convert/convert-immunization.js +56 -0
  84. package/dist/convert/convert-location.d.ts +3 -0
  85. package/dist/convert/convert-location.js +44 -0
  86. package/dist/convert/convert-medication-statement.d.ts +3 -0
  87. package/dist/convert/convert-medication-statement.js +64 -0
  88. package/dist/convert/convert-observation.d.ts +3 -0
  89. package/dist/convert/convert-observation.js +57 -0
  90. package/dist/convert/convert-organization.d.ts +3 -0
  91. package/dist/convert/convert-organization.js +39 -0
  92. package/dist/convert/convert-procedure.d.ts +3 -0
  93. package/dist/convert/convert-procedure.js +50 -0
  94. package/dist/convert/convert-related-person.d.ts +3 -0
  95. package/dist/convert/convert-related-person.js +31 -0
  96. package/dist/convert/convert-shared.d.ts +34 -0
  97. package/dist/convert/convert-shared.js +179 -0
  98. package/dist/convert/index.d.ts +22 -0
  99. package/dist/convert/index.js +22 -0
  100. package/dist/examples/communication-bundle-document-request.js +2 -2
  101. package/dist/examples/communication-bundle-session.js +2 -2
  102. package/dist/examples/shared.d.ts +21 -2
  103. package/dist/examples/shared.js +74 -1
  104. package/dist/index.d.ts +2 -0
  105. package/dist/index.js +2 -0
  106. package/dist/models/bundle.d.ts +13 -1
  107. package/dist/models/interoperable-claims/appointment-claims.d.ts +23 -1
  108. package/dist/models/interoperable-claims/appointment-claims.js +22 -1
  109. package/dist/models/interoperable-claims/appointment-response-claims.d.ts +14 -0
  110. package/dist/models/interoperable-claims/appointment-response-claims.js +13 -0
  111. package/dist/models/interoperable-claims/care-plan-claims.d.ts +24 -0
  112. package/dist/models/interoperable-claims/care-plan-claims.js +44 -0
  113. package/dist/models/interoperable-claims/clinical-impression-claims.d.ts +17 -0
  114. package/dist/models/interoperable-claims/clinical-impression-claims.js +30 -0
  115. package/dist/models/interoperable-claims/coverage-claims.d.ts +16 -0
  116. package/dist/models/interoperable-claims/coverage-claims.js +28 -0
  117. package/dist/models/interoperable-claims/device-claims.d.ts +18 -0
  118. package/dist/models/interoperable-claims/device-claims.js +32 -0
  119. package/dist/models/interoperable-claims/diagnostic-report-claims.d.ts +2 -2
  120. package/dist/models/interoperable-claims/diagnostic-report-claims.js +1 -1
  121. package/dist/models/interoperable-claims/encounter-claims.d.ts +18 -0
  122. package/dist/models/interoperable-claims/encounter-claims.js +32 -0
  123. package/dist/models/interoperable-claims/flag-claims.d.ts +16 -0
  124. package/dist/models/interoperable-claims/flag-claims.js +28 -0
  125. package/dist/models/interoperable-claims/immunization-claims.d.ts +23 -0
  126. package/dist/models/interoperable-claims/immunization-claims.js +42 -0
  127. package/dist/models/interoperable-claims/index.d.ts +12 -0
  128. package/dist/models/interoperable-claims/index.js +12 -0
  129. package/dist/models/interoperable-claims/location-claims.d.ts +22 -0
  130. package/dist/models/interoperable-claims/location-claims.js +34 -0
  131. package/dist/models/interoperable-claims/observation-claims.d.ts +26 -0
  132. package/dist/models/interoperable-claims/observation-claims.js +48 -0
  133. package/dist/models/interoperable-claims/organization-claims.d.ts +18 -0
  134. package/dist/models/interoperable-claims/organization-claims.js +27 -0
  135. package/dist/models/interoperable-claims/procedure-claims.d.ts +22 -0
  136. package/dist/models/interoperable-claims/procedure-claims.js +40 -0
  137. package/dist/models/interoperable-claims/related-person-claims.d.ts +14 -0
  138. package/dist/models/interoperable-claims/related-person-claims.js +24 -0
  139. package/dist/utils/appointment-claim-helpers.d.ts +10 -0
  140. package/dist/utils/appointment-claim-helpers.js +26 -0
  141. package/dist/utils/appointment-response-claim-helpers.d.ts +8 -0
  142. package/dist/utils/appointment-response-claim-helpers.js +20 -0
  143. package/dist/utils/bundle-document-builder.d.ts +36 -0
  144. package/dist/utils/bundle-document-builder.js +311 -0
  145. package/dist/utils/claims-helpers-allergy-intolerance.d.ts +1 -0
  146. package/dist/utils/claims-helpers-allergy-intolerance.js +1 -0
  147. package/dist/utils/claims-helpers-appointment-response.d.ts +1 -0
  148. package/dist/utils/claims-helpers-appointment-response.js +1 -0
  149. package/dist/utils/claims-helpers-appointment.d.ts +1 -0
  150. package/dist/utils/claims-helpers-appointment.js +1 -0
  151. package/dist/utils/claims-helpers-care-plan.d.ts +1 -0
  152. package/dist/utils/claims-helpers-care-plan.js +1 -0
  153. package/dist/utils/claims-helpers-clinical-impression.d.ts +1 -0
  154. package/dist/utils/claims-helpers-clinical-impression.js +1 -0
  155. package/dist/utils/claims-helpers-communication.d.ts +1 -0
  156. package/dist/utils/claims-helpers-communication.js +1 -0
  157. package/dist/utils/claims-helpers-composition.d.ts +1 -0
  158. package/dist/utils/claims-helpers-composition.js +1 -0
  159. package/dist/utils/claims-helpers-condition.d.ts +1 -0
  160. package/dist/utils/claims-helpers-condition.js +1 -0
  161. package/dist/utils/claims-helpers-consent.d.ts +1 -0
  162. package/dist/utils/claims-helpers-consent.js +1 -0
  163. package/dist/utils/claims-helpers-coverage.d.ts +1 -0
  164. package/dist/utils/claims-helpers-coverage.js +1 -0
  165. package/dist/utils/claims-helpers-device-use-statement.d.ts +1 -0
  166. package/dist/utils/claims-helpers-device-use-statement.js +1 -0
  167. package/dist/utils/claims-helpers-device.d.ts +1 -0
  168. package/dist/utils/claims-helpers-device.js +1 -0
  169. package/dist/utils/claims-helpers-diagnostic-report.d.ts +1 -0
  170. package/dist/utils/claims-helpers-diagnostic-report.js +1 -0
  171. package/dist/utils/claims-helpers-document-reference.d.ts +1 -0
  172. package/dist/utils/claims-helpers-document-reference.js +1 -0
  173. package/dist/utils/claims-helpers-encounter.d.ts +1 -0
  174. package/dist/utils/claims-helpers-encounter.js +1 -0
  175. package/dist/utils/claims-helpers-flag.d.ts +1 -0
  176. package/dist/utils/claims-helpers-flag.js +1 -0
  177. package/dist/utils/claims-helpers-immunization.d.ts +1 -0
  178. package/dist/utils/claims-helpers-immunization.js +1 -0
  179. package/dist/utils/claims-helpers-location.d.ts +1 -0
  180. package/dist/utils/claims-helpers-location.js +1 -0
  181. package/dist/utils/claims-helpers-medication-statement.d.ts +1 -0
  182. package/dist/utils/claims-helpers-medication-statement.js +1 -0
  183. package/dist/utils/claims-helpers-observation.d.ts +1 -0
  184. package/dist/utils/claims-helpers-observation.js +1 -0
  185. package/dist/utils/claims-helpers-organization.d.ts +1 -0
  186. package/dist/utils/claims-helpers-organization.js +1 -0
  187. package/dist/utils/claims-helpers-procedure.d.ts +1 -0
  188. package/dist/utils/claims-helpers-procedure.js +1 -0
  189. package/dist/utils/claims-helpers-related-person.d.ts +1 -0
  190. package/dist/utils/claims-helpers-related-person.js +1 -0
  191. package/dist/utils/clinical-impression-claim-helpers.d.ts +10 -0
  192. package/dist/utils/clinical-impression-claim-helpers.js +26 -0
  193. package/dist/utils/clinical-resource-converters.d.ts +91 -62
  194. package/dist/utils/clinical-resource-converters.js +135 -273
  195. package/dist/utils/communication-bundle-document-request.d.ts +6 -4
  196. package/dist/utils/communication-bundle-document-request.js +7 -5
  197. package/dist/utils/communication-bundle-session.js +1 -1
  198. package/dist/utils/composition-claim-helpers.d.ts +12 -0
  199. package/dist/utils/composition-claim-helpers.js +32 -0
  200. package/dist/utils/consent-claim-helpers.d.ts +2 -2
  201. package/dist/utils/consent-claim-helpers.js +2 -2
  202. package/dist/utils/convert-allergy-intolerance.d.ts +3 -0
  203. package/dist/utils/convert-allergy-intolerance.js +34 -0
  204. package/dist/utils/convert-appointment-response.d.ts +3 -0
  205. package/dist/utils/convert-appointment-response.js +32 -0
  206. package/dist/utils/convert-appointment.d.ts +3 -0
  207. package/dist/utils/convert-appointment.js +61 -0
  208. package/dist/utils/convert-care-plan.d.ts +3 -0
  209. package/dist/utils/convert-care-plan.js +58 -0
  210. package/dist/utils/convert-clinical-impression.d.ts +3 -0
  211. package/dist/utils/convert-clinical-impression.js +42 -0
  212. package/dist/utils/convert-composition.d.ts +3 -0
  213. package/dist/utils/convert-composition.js +35 -0
  214. package/dist/utils/convert-condition.d.ts +3 -0
  215. package/dist/utils/convert-condition.js +24 -0
  216. package/dist/utils/convert-coverage.d.ts +3 -0
  217. package/dist/utils/convert-coverage.js +51 -0
  218. package/dist/utils/convert-device-use-statement.d.ts +3 -0
  219. package/dist/utils/convert-device-use-statement.js +28 -0
  220. package/dist/utils/convert-device.d.ts +3 -0
  221. package/dist/utils/convert-device.js +37 -0
  222. package/dist/utils/convert-diagnostic-report.d.ts +3 -0
  223. package/dist/utils/convert-diagnostic-report.js +55 -0
  224. package/dist/utils/convert-document-reference.d.ts +3 -0
  225. package/dist/utils/convert-document-reference.js +35 -0
  226. package/dist/utils/convert-encounter.d.ts +3 -0
  227. package/dist/utils/convert-encounter.js +68 -0
  228. package/dist/utils/convert-flag.d.ts +3 -0
  229. package/dist/utils/convert-flag.js +34 -0
  230. package/dist/utils/convert-immunization.d.ts +3 -0
  231. package/dist/utils/convert-immunization.js +56 -0
  232. package/dist/utils/convert-medication-statement.d.ts +3 -0
  233. package/dist/utils/convert-medication-statement.js +64 -0
  234. package/dist/utils/convert-observation.d.ts +3 -0
  235. package/dist/utils/convert-observation.js +57 -0
  236. package/dist/utils/convert-procedure.d.ts +3 -0
  237. package/dist/utils/convert-procedure.js +50 -0
  238. package/dist/utils/convert-related-person.d.ts +3 -0
  239. package/dist/utils/convert-related-person.js +31 -0
  240. package/dist/utils/convert-shared.d.ts +34 -0
  241. package/dist/utils/convert-shared.js +179 -0
  242. package/dist/utils/coverage-claim-helpers.d.ts +10 -0
  243. package/dist/utils/coverage-claim-helpers.js +26 -0
  244. package/dist/utils/diagnostic-report-claim-helpers.d.ts +12 -0
  245. package/dist/utils/diagnostic-report-claim-helpers.js +32 -0
  246. package/dist/utils/encounter-claim-helpers.d.ts +10 -0
  247. package/dist/utils/encounter-claim-helpers.js +26 -0
  248. package/dist/utils/fhir-cid.d.ts +49 -0
  249. package/dist/utils/fhir-cid.js +75 -0
  250. package/dist/utils/index.d.ts +4 -6
  251. package/dist/utils/index.js +4 -6
  252. package/dist/utils/ips-bundle-claims.d.ts +52 -0
  253. package/dist/utils/ips-bundle-claims.js +104 -0
  254. package/dist/utils/jwt.d.ts +16 -0
  255. package/dist/utils/jwt.js +21 -0
  256. package/dist/utils/related-person-claim-helpers.d.ts +8 -0
  257. package/dist/utils/related-person-claim-helpers.js +20 -0
  258. package/package.json +17 -1
@@ -0,0 +1,179 @@
1
+ // Copyright 2026 Conéctate Soluciones y Aplicaciones SL under the Apache License, Version 2.0.
2
+ // File: src/utils/convert-shared.ts
3
+ export function isPlainObject(value) {
4
+ return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
5
+ }
6
+ export function codingFromValue(value) {
7
+ if (!value)
8
+ return undefined;
9
+ const [system, code] = value.split('|');
10
+ if (!code)
11
+ return [{ code: system }];
12
+ return [{ system, code }];
13
+ }
14
+ export function codingToValue(coding) {
15
+ if (!coding?.code)
16
+ return undefined;
17
+ return coding.system ? `${coding.system}|${coding.code}` : coding.code;
18
+ }
19
+ export function referenceToValue(reference) {
20
+ return reference?.reference;
21
+ }
22
+ export function referenceListToCsv(references) {
23
+ const values = (references || [])
24
+ .map((item) => item?.reference)
25
+ .filter((item) => Boolean(item));
26
+ return values.length ? values.join(',') : undefined;
27
+ }
28
+ export function codingListToCsv(codings) {
29
+ const values = (codings || [])
30
+ .map((item) => codingToValue(item))
31
+ .filter((item) => Boolean(item));
32
+ return values.length ? values.join(',') : undefined;
33
+ }
34
+ export function requireClaim(claims, key) {
35
+ const value = claims[key];
36
+ if (!value)
37
+ throw new Error(`Missing required claim: ${key}`);
38
+ return value;
39
+ }
40
+ export function requireSubjectIdentifier(value, key) {
41
+ if (!value.startsWith('urn:') && !value.startsWith('did:web:')) {
42
+ throw new Error(`Invalid ${key}: expected urn:* or did:web:*`);
43
+ }
44
+ }
45
+ export function requireDidWeb(value, key) {
46
+ if (!value.startsWith('did:web:')) {
47
+ throw new Error(`Invalid ${key}: expected did:web:*`);
48
+ }
49
+ }
50
+ function stringifyClaimLeaf(value) {
51
+ if (value === undefined || value === null)
52
+ return undefined;
53
+ if (typeof value === 'string')
54
+ return value;
55
+ if (typeof value === 'number' || typeof value === 'boolean')
56
+ return String(value);
57
+ return undefined;
58
+ }
59
+ function flattenClaimPath(prefix, value, out) {
60
+ const primitive = stringifyClaimLeaf(value);
61
+ if (primitive !== undefined) {
62
+ out[prefix] = primitive;
63
+ if (typeof value === 'number' || typeof value === 'boolean') {
64
+ out[`${prefix}#type`] = typeof value;
65
+ }
66
+ return;
67
+ }
68
+ if (Array.isArray(value)) {
69
+ value.forEach((entry, index) => {
70
+ flattenClaimPath(`${prefix}[${index}]`, entry, out);
71
+ });
72
+ return;
73
+ }
74
+ if (isPlainObject(value)) {
75
+ for (const [key, nestedValue] of Object.entries(value)) {
76
+ if (key === 'meta' && isPlainObject(nestedValue) && 'claims' in nestedValue) {
77
+ const nestedMeta = { ...nestedValue };
78
+ delete nestedMeta.claims;
79
+ if (Object.keys(nestedMeta).length === 0)
80
+ continue;
81
+ flattenClaimPath(`${prefix}.${key}`, nestedMeta, out);
82
+ continue;
83
+ }
84
+ flattenClaimPath(`${prefix}.${key}`, nestedValue, out);
85
+ }
86
+ }
87
+ }
88
+ function parseClaimPath(path) {
89
+ const segments = [];
90
+ const re = /([^[.\]]+)|\[(\d+)\]/g;
91
+ let match;
92
+ while ((match = re.exec(path)) !== null) {
93
+ if (match[1])
94
+ segments.push(match[1]);
95
+ else if (match[2])
96
+ segments.push(Number(match[2]));
97
+ }
98
+ return segments;
99
+ }
100
+ function coerceClaimLeaf(value, typeHint) {
101
+ if (typeHint === 'boolean')
102
+ return value === 'true';
103
+ if (typeHint === 'number')
104
+ return Number(value);
105
+ return value;
106
+ }
107
+ function assignInflatedPath(target, path, value, typeHint) {
108
+ const segments = parseClaimPath(path);
109
+ if (segments.length === 0)
110
+ return;
111
+ let cursor = target;
112
+ for (let index = 0; index < segments.length; index += 1) {
113
+ const segment = segments[index];
114
+ const nextSegment = segments[index + 1];
115
+ const isLast = index === segments.length - 1;
116
+ if (typeof segment === 'number') {
117
+ if (!Array.isArray(cursor))
118
+ return;
119
+ if (isLast) {
120
+ cursor[segment] = coerceClaimLeaf(value, typeHint);
121
+ return;
122
+ }
123
+ if (cursor[segment] === undefined)
124
+ cursor[segment] = typeof nextSegment === 'number' ? [] : {};
125
+ cursor = cursor[segment];
126
+ continue;
127
+ }
128
+ if (!isPlainObject(cursor))
129
+ return;
130
+ if (isLast) {
131
+ cursor[segment] = coerceClaimLeaf(value, typeHint);
132
+ return;
133
+ }
134
+ if (cursor[segment] === undefined)
135
+ cursor[segment] = typeof nextSegment === 'number' ? [] : {};
136
+ cursor = cursor[segment];
137
+ }
138
+ }
139
+ /**
140
+ * Generic structural fallback for unsupported resources.
141
+ */
142
+ export function fhirResourceToFlatClaims(resource, context = 'org.hl7.fhir.r4') {
143
+ if (!resource?.resourceType) {
144
+ throw new Error('FHIR resource must define resourceType.');
145
+ }
146
+ const out = { '@context': context };
147
+ for (const [key, value] of Object.entries(resource)) {
148
+ if (key === 'resourceType')
149
+ continue;
150
+ flattenClaimPath(`${resource.resourceType}.${key}`, value, out);
151
+ }
152
+ return out;
153
+ }
154
+ /**
155
+ * Generic structural regeneration for unsupported resources.
156
+ */
157
+ export function flatClaimsToFhirResource(claims) {
158
+ const typeHints = new Map();
159
+ for (const [key, value] of Object.entries(claims || {})) {
160
+ if (key.endsWith('#type') && typeof value === 'string') {
161
+ typeHints.set(key.slice(0, -5), value);
162
+ }
163
+ }
164
+ const entries = Object.entries(claims || {}).filter(([key, value]) => key !== '@context' && !key.endsWith('#type') && value !== undefined);
165
+ const firstClaimKey = entries[0]?.[0];
166
+ if (!firstClaimKey || !firstClaimKey.includes('.')) {
167
+ throw new Error('Flat claims must contain at least one contextualized resource claim.');
168
+ }
169
+ const resourceType = firstClaimKey.split('.')[0];
170
+ const resource = { resourceType };
171
+ for (const [key, value] of entries) {
172
+ if (typeof value !== 'string')
173
+ continue;
174
+ if (!key.startsWith(`${resourceType}.`))
175
+ continue;
176
+ assignInflatedPath(resource, key.slice(resourceType.length + 1), value, typeHints.get(key));
177
+ }
178
+ return resource;
179
+ }
@@ -0,0 +1,10 @@
1
+ import { type GenericInteroperableClaims } from './claim-list-helpers.js';
2
+ export type CoverageInteroperableClaims = GenericInteroperableClaims;
3
+ export declare function getCoverageClaimList(claims: CoverageInteroperableClaims, claimKey: string): string[];
4
+ export declare function setCoverageClaimList(claims: CoverageInteroperableClaims, claimKey: string, values: string | readonly string[]): CoverageInteroperableClaims;
5
+ export declare function addCoverageClaimList(claims: CoverageInteroperableClaims, claimKey: string, values: string | readonly string[]): CoverageInteroperableClaims;
6
+ export declare function removeCoverageClaimList(claims: CoverageInteroperableClaims, claimKey: string, values: string | readonly string[]): CoverageInteroperableClaims;
7
+ export declare function getCoverageIdentifier(claims: CoverageInteroperableClaims): string;
8
+ export declare function setCoverageIdentifier(claims: CoverageInteroperableClaims, value: string): CoverageInteroperableClaims;
9
+ export declare function getCoveragePayorList(claims: CoverageInteroperableClaims): string[];
10
+ export declare function setCoveragePayorList(claims: CoverageInteroperableClaims, values: string | readonly string[]): CoverageInteroperableClaims;
@@ -0,0 +1,26 @@
1
+ import { CoverageClaim } from '../models/interoperable-claims/coverage-claims.js';
2
+ import { addClaimValues, getClaimValues, normalizeClaimScalar, removeClaimValues, setClaimValues, } from './claim-list-helpers.js';
3
+ export function getCoverageClaimList(claims, claimKey) {
4
+ return getClaimValues(claims, claimKey);
5
+ }
6
+ export function setCoverageClaimList(claims, claimKey, values) {
7
+ return setClaimValues(claims, claimKey, values);
8
+ }
9
+ export function addCoverageClaimList(claims, claimKey, values) {
10
+ return addClaimValues(claims, claimKey, values);
11
+ }
12
+ export function removeCoverageClaimList(claims, claimKey, values) {
13
+ return removeClaimValues(claims, claimKey, values);
14
+ }
15
+ export function getCoverageIdentifier(claims) {
16
+ return normalizeClaimScalar(claims[CoverageClaim.Identifier]);
17
+ }
18
+ export function setCoverageIdentifier(claims, value) {
19
+ return { ...claims, [CoverageClaim.Identifier]: normalizeClaimScalar(value) };
20
+ }
21
+ export function getCoveragePayorList(claims) {
22
+ return getCoverageClaimList(claims, CoverageClaim.Payor);
23
+ }
24
+ export function setCoveragePayorList(claims, values) {
25
+ return setCoverageClaimList(claims, CoverageClaim.Payor, values);
26
+ }
@@ -0,0 +1,12 @@
1
+ import { type GenericInteroperableClaims } from './claim-list-helpers.js';
2
+ export type DiagnosticReportInteroperableClaims = GenericInteroperableClaims;
3
+ export declare function getDiagnosticReportClaimList(claims: DiagnosticReportInteroperableClaims, claimKey: string): string[];
4
+ export declare function setDiagnosticReportClaimList(claims: DiagnosticReportInteroperableClaims, claimKey: string, values: string | readonly string[]): DiagnosticReportInteroperableClaims;
5
+ export declare function addDiagnosticReportClaimList(claims: DiagnosticReportInteroperableClaims, claimKey: string, values: string | readonly string[]): DiagnosticReportInteroperableClaims;
6
+ export declare function removeDiagnosticReportClaimList(claims: DiagnosticReportInteroperableClaims, claimKey: string, values: string | readonly string[]): DiagnosticReportInteroperableClaims;
7
+ export declare function getDiagnosticReportIdentifier(claims: DiagnosticReportInteroperableClaims): string;
8
+ export declare function setDiagnosticReportIdentifier(claims: DiagnosticReportInteroperableClaims, value: string): DiagnosticReportInteroperableClaims;
9
+ export declare function getDiagnosticReportResultList(claims: DiagnosticReportInteroperableClaims): string[];
10
+ export declare function setDiagnosticReportResultList(claims: DiagnosticReportInteroperableClaims, values: string | readonly string[]): DiagnosticReportInteroperableClaims;
11
+ export declare function getDiagnosticReportContainedDocumentIdentifierList(claims: DiagnosticReportInteroperableClaims): string[];
12
+ export declare function setDiagnosticReportContainedDocumentIdentifierList(claims: DiagnosticReportInteroperableClaims, values: string | readonly string[]): DiagnosticReportInteroperableClaims;
@@ -0,0 +1,32 @@
1
+ import { DiagnosticReportClaim } from '../models/interoperable-claims/diagnostic-report-claims.js';
2
+ import { addClaimValues, getClaimValues, normalizeClaimScalar, removeClaimValues, setClaimValues, } from './claim-list-helpers.js';
3
+ export function getDiagnosticReportClaimList(claims, claimKey) {
4
+ return getClaimValues(claims, claimKey);
5
+ }
6
+ export function setDiagnosticReportClaimList(claims, claimKey, values) {
7
+ return setClaimValues(claims, claimKey, values);
8
+ }
9
+ export function addDiagnosticReportClaimList(claims, claimKey, values) {
10
+ return addClaimValues(claims, claimKey, values);
11
+ }
12
+ export function removeDiagnosticReportClaimList(claims, claimKey, values) {
13
+ return removeClaimValues(claims, claimKey, values);
14
+ }
15
+ export function getDiagnosticReportIdentifier(claims) {
16
+ return normalizeClaimScalar(claims[DiagnosticReportClaim.Identifier]);
17
+ }
18
+ export function setDiagnosticReportIdentifier(claims, value) {
19
+ return { ...claims, [DiagnosticReportClaim.Identifier]: normalizeClaimScalar(value) };
20
+ }
21
+ export function getDiagnosticReportResultList(claims) {
22
+ return getDiagnosticReportClaimList(claims, DiagnosticReportClaim.Result);
23
+ }
24
+ export function setDiagnosticReportResultList(claims, values) {
25
+ return setDiagnosticReportClaimList(claims, DiagnosticReportClaim.Result, values);
26
+ }
27
+ export function getDiagnosticReportContainedDocumentIdentifierList(claims) {
28
+ return getDiagnosticReportClaimList(claims, DiagnosticReportClaim.ContainedDocuments);
29
+ }
30
+ export function setDiagnosticReportContainedDocumentIdentifierList(claims, values) {
31
+ return setDiagnosticReportClaimList(claims, DiagnosticReportClaim.ContainedDocuments, values);
32
+ }
@@ -0,0 +1,10 @@
1
+ import { type GenericInteroperableClaims } from './claim-list-helpers.js';
2
+ export type EncounterInteroperableClaims = GenericInteroperableClaims;
3
+ export declare function getEncounterClaimList(claims: EncounterInteroperableClaims, claimKey: string): string[];
4
+ export declare function setEncounterClaimList(claims: EncounterInteroperableClaims, claimKey: string, values: string | readonly string[]): EncounterInteroperableClaims;
5
+ export declare function addEncounterClaimList(claims: EncounterInteroperableClaims, claimKey: string, values: string | readonly string[]): EncounterInteroperableClaims;
6
+ export declare function removeEncounterClaimList(claims: EncounterInteroperableClaims, claimKey: string, values: string | readonly string[]): EncounterInteroperableClaims;
7
+ export declare function getEncounterIdentifier(claims: EncounterInteroperableClaims): string;
8
+ export declare function setEncounterIdentifier(claims: EncounterInteroperableClaims, value: string): EncounterInteroperableClaims;
9
+ export declare function getEncounterParticipantList(claims: EncounterInteroperableClaims): string[];
10
+ export declare function setEncounterParticipantList(claims: EncounterInteroperableClaims, values: string | readonly string[]): EncounterInteroperableClaims;
@@ -0,0 +1,26 @@
1
+ import { EncounterClaim } from '../models/interoperable-claims/encounter-claims.js';
2
+ import { addClaimValues, getClaimValues, normalizeClaimScalar, removeClaimValues, setClaimValues, } from './claim-list-helpers.js';
3
+ export function getEncounterClaimList(claims, claimKey) {
4
+ return getClaimValues(claims, claimKey);
5
+ }
6
+ export function setEncounterClaimList(claims, claimKey, values) {
7
+ return setClaimValues(claims, claimKey, values);
8
+ }
9
+ export function addEncounterClaimList(claims, claimKey, values) {
10
+ return addClaimValues(claims, claimKey, values);
11
+ }
12
+ export function removeEncounterClaimList(claims, claimKey, values) {
13
+ return removeClaimValues(claims, claimKey, values);
14
+ }
15
+ export function getEncounterIdentifier(claims) {
16
+ return normalizeClaimScalar(claims[EncounterClaim.Identifier]);
17
+ }
18
+ export function setEncounterIdentifier(claims, value) {
19
+ return { ...claims, [EncounterClaim.Identifier]: normalizeClaimScalar(value) };
20
+ }
21
+ export function getEncounterParticipantList(claims) {
22
+ return getEncounterClaimList(claims, EncounterClaim.Participant);
23
+ }
24
+ export function setEncounterParticipantList(claims, values) {
25
+ return setEncounterClaimList(claims, EncounterClaim.Participant, values);
26
+ }
@@ -34,6 +34,31 @@ export type ClaimsCidResult = {
34
34
  canonicalJson: string;
35
35
  digestHex: string;
36
36
  };
37
+ export type ClaimsContentHashOptions = {
38
+ /**
39
+ * Excludes JSON-LD envelope keys such as `@context`, `@type`, and `@id`.
40
+ * Default: true.
41
+ */
42
+ stripJsonLdEnvelope?: boolean;
43
+ /**
44
+ * Excludes transport/storage identifiers such as `id`, `*.id`,
45
+ * `identifier`, `*.identifier`, and `*.identifier.value`.
46
+ *
47
+ * This is the recommended default for clinical document/resource dedupe
48
+ * because those identifiers often reflect transport or logical identity,
49
+ * not semantic content.
50
+ *
51
+ * Default: true.
52
+ */
53
+ stripIdentifiers?: boolean;
54
+ /**
55
+ * Excludes claim keys that already carry a derived content version such as
56
+ * `*.meta.versionId`.
57
+ *
58
+ * Default: true.
59
+ */
60
+ stripVersionClaims?: boolean;
61
+ };
37
62
  export type FhirCidVersionMapping = {
38
63
  resourceType?: string;
39
64
  resourceId?: string;
@@ -44,7 +69,31 @@ export type FhirCidVersionMapping = {
44
69
  export declare function canonicalizeFhirResource(resource: Record<string, unknown>, options?: FhirCanonicalizationOptions): string;
45
70
  export declare function buildCidV1FromCanonicalJson(canonicalJson: string, multicodecCode?: number): FhirCidResult;
46
71
  export declare function canonicalizeClaimsForCid(claims: Record<string, unknown>): string;
72
+ /**
73
+ * Canonicalizes flat claims into deterministic JSON suitable for semantic
74
+ * content hashing.
75
+ *
76
+ * This differs from `canonicalizeClaimsForCid(...)` because it is designed for
77
+ * deduplication/versioning of clinical content, not for preserving logical
78
+ * identifiers. By default it removes:
79
+ *
80
+ * - JSON-LD envelope keys such as `@context`
81
+ * - transport/storage identifiers such as `id` and `identifier`
82
+ * - derived version keys such as `*.meta.versionId`
83
+ *
84
+ * The resulting object is sorted alphanumerically and serialized with stable
85
+ * key ordering so the same semantic content always yields the same hash.
86
+ */
87
+ export declare function canonicalizeClaimsForContentHash(claims: Record<string, unknown>, options?: ClaimsContentHashOptions): string;
47
88
  export declare function claimsToCid(claims: Record<string, unknown>): ClaimsCidResult;
89
+ /**
90
+ * Builds a content-addressed CID from flat claims after removing envelope,
91
+ * identifier, and version fields that should not affect semantic equality.
92
+ *
93
+ * Use this helper when the question is "does this document/resource content
94
+ * already exist?" rather than "what is the logical identifier of this object?".
95
+ */
96
+ export declare function claimsToContentCid(claims: Record<string, unknown>, options?: ClaimsContentHashOptions): ClaimsCidResult;
48
97
  export declare function assignCidToClaimsId(claims: Record<string, unknown>): {
49
98
  claims: Record<string, unknown>;
50
99
  cid: string;
@@ -95,6 +95,65 @@ export function canonicalizeClaimsForCid(claims) {
95
95
  }, 0);
96
96
  return JSON.stringify(normalized);
97
97
  }
98
+ function shouldStripClaimKeyForContentHash(key, options) {
99
+ const normalizedKey = String(key || '').trim();
100
+ if (!normalizedKey)
101
+ return false;
102
+ if (options.stripJsonLdEnvelope && (normalizedKey === '@context'
103
+ || normalizedKey === '@type'
104
+ || normalizedKey === '@id')) {
105
+ return true;
106
+ }
107
+ const lowerKey = normalizedKey.toLowerCase();
108
+ if (options.stripVersionClaims && lowerKey.endsWith('.meta.versionid')) {
109
+ return true;
110
+ }
111
+ if (!options.stripIdentifiers)
112
+ return false;
113
+ if (lowerKey === 'id'
114
+ || lowerKey.endsWith('.id')
115
+ || lowerKey === 'identifier'
116
+ || lowerKey.endsWith('.identifier')
117
+ || lowerKey.endsWith('.identifier.value')) {
118
+ return true;
119
+ }
120
+ return false;
121
+ }
122
+ /**
123
+ * Canonicalizes flat claims into deterministic JSON suitable for semantic
124
+ * content hashing.
125
+ *
126
+ * This differs from `canonicalizeClaimsForCid(...)` because it is designed for
127
+ * deduplication/versioning of clinical content, not for preserving logical
128
+ * identifiers. By default it removes:
129
+ *
130
+ * - JSON-LD envelope keys such as `@context`
131
+ * - transport/storage identifiers such as `id` and `identifier`
132
+ * - derived version keys such as `*.meta.versionId`
133
+ *
134
+ * The resulting object is sorted alphanumerically and serialized with stable
135
+ * key ordering so the same semantic content always yields the same hash.
136
+ */
137
+ export function canonicalizeClaimsForContentHash(claims, options = {}) {
138
+ const normalizedOptions = {
139
+ stripJsonLdEnvelope: options.stripJsonLdEnvelope ?? true,
140
+ stripIdentifiers: options.stripIdentifiers ?? true,
141
+ stripVersionClaims: options.stripVersionClaims ?? true,
142
+ };
143
+ const stripped = {};
144
+ for (const [key, value] of Object.entries(claims || {})) {
145
+ if (shouldStripClaimKeyForContentHash(key, normalizedOptions)) {
146
+ continue;
147
+ }
148
+ stripped[key] = value;
149
+ }
150
+ const normalized = canonicalizeValue(stripped, {
151
+ stripMetaVersionId: false,
152
+ stripNarrativeText: false,
153
+ stripNestedElementIds: false,
154
+ }, 0);
155
+ return JSON.stringify(normalized);
156
+ }
98
157
  export function claimsToCid(claims) {
99
158
  const canonicalJson = canonicalizeClaimsForCid(claims);
100
159
  const cidData = buildCidV1FromCanonicalJson(canonicalJson, DEFAULT_MULTICODEC_DAG_JSON);
@@ -104,6 +163,22 @@ export function claimsToCid(claims) {
104
163
  digestHex: cidData.digestHex,
105
164
  };
106
165
  }
166
+ /**
167
+ * Builds a content-addressed CID from flat claims after removing envelope,
168
+ * identifier, and version fields that should not affect semantic equality.
169
+ *
170
+ * Use this helper when the question is "does this document/resource content
171
+ * already exist?" rather than "what is the logical identifier of this object?".
172
+ */
173
+ export function claimsToContentCid(claims, options = {}) {
174
+ const canonicalJson = canonicalizeClaimsForContentHash(claims, options);
175
+ const cidData = buildCidV1FromCanonicalJson(canonicalJson, DEFAULT_MULTICODEC_DAG_JSON);
176
+ return {
177
+ cid: cidData.cid,
178
+ canonicalJson,
179
+ digestHex: cidData.digestHex,
180
+ };
181
+ }
107
182
  export function assignCidToClaimsId(claims) {
108
183
  const out = JSON.parse(JSON.stringify(claims || {}));
109
184
  const { cid } = claimsToCid(out);
@@ -4,13 +4,11 @@ export * from './base-convert';
4
4
  export * from './baseN';
5
5
  export * from './bundle';
6
6
  export * from './bundle-query';
7
+ export * from '../claims';
7
8
  export * from './content';
8
- export * from './claim-list-helpers';
9
+ export * from '../convert';
10
+ export * from './bundle-document-builder';
9
11
  export * from './consent';
10
- export * from './consent-claim-helpers';
11
- export * from './condition-claim-helpers';
12
- export * from './medication-claim-helpers';
13
- export * from './allergy-intolerance-claim-helpers';
14
12
  export * from './did';
15
13
  export * from './did-resolution';
16
14
  export * from './dataspace-discovery';
@@ -23,7 +21,6 @@ export * from './discovery-normalization';
23
21
  export * from './format-converter';
24
22
  export * from './fhir-cid';
25
23
  export * from './communication-fhir-r4';
26
- export * from './communication-claim-helpers';
27
24
  export * from './communication-document-reference';
28
25
  export * from './communication-bundle-document-request';
29
26
  export * from './communication-identity';
@@ -32,6 +29,7 @@ export * from './clinical-resource-converters';
32
29
  export * from './clinical-resource-view';
33
30
  export * from './fhir-validator';
34
31
  export * from './individual-form-pdf';
32
+ export * from './ips-bundle-claims';
35
33
  export * from './jwt';
36
34
  export * from './manager-error';
37
35
  export * from './multibase58';
@@ -4,13 +4,11 @@ export * from './base-convert.js';
4
4
  export * from './baseN.js';
5
5
  export * from './bundle.js';
6
6
  export * from './bundle-query.js';
7
+ export * from '../claims/index.js';
7
8
  export * from './content.js';
8
- export * from './claim-list-helpers.js';
9
+ export * from '../convert/index.js';
10
+ export * from './bundle-document-builder.js';
9
11
  export * from './consent.js';
10
- export * from './consent-claim-helpers.js';
11
- export * from './condition-claim-helpers.js';
12
- export * from './medication-claim-helpers.js';
13
- export * from './allergy-intolerance-claim-helpers.js';
14
12
  export * from './did.js';
15
13
  export * from './did-resolution.js';
16
14
  export * from './dataspace-discovery.js';
@@ -23,7 +21,6 @@ export * from './discovery-normalization.js';
23
21
  export * from './format-converter.js';
24
22
  export * from './fhir-cid.js';
25
23
  export * from './communication-fhir-r4.js';
26
- export * from './communication-claim-helpers.js';
27
24
  export * from './communication-document-reference.js';
28
25
  export * from './communication-bundle-document-request.js';
29
26
  export * from './communication-identity.js';
@@ -32,6 +29,7 @@ export * from './clinical-resource-converters.js';
32
29
  export * from './clinical-resource-view.js';
33
30
  export * from './fhir-validator.js';
34
31
  export * from './individual-form-pdf.js';
32
+ export * from './ips-bundle-claims.js';
35
33
  export * from './jwt.js';
36
34
  export * from './manager-error.js';
37
35
  export * from './multibase58.js';
@@ -0,0 +1,52 @@
1
+ import type { BundleEntry, BundleEntryResource } from '../models/bundle.js';
2
+ export declare const DEFAULT_META_CLAIM_TAG_SYSTEM = "urn:gdc:fhir:meta-claim";
3
+ export type BundleLike = Readonly<{
4
+ resourceType?: string;
5
+ type?: string;
6
+ entry?: readonly BundleEntry[];
7
+ data?: readonly BundleEntry[];
8
+ }>;
9
+ export type ResourceMetaClaimsExtraction = Readonly<{
10
+ resourceType: string;
11
+ fullUrl?: string;
12
+ claims: Record<string, unknown>;
13
+ }>;
14
+ export type FhirMetaTagCoding = Readonly<{
15
+ system: string;
16
+ code: string;
17
+ display?: string;
18
+ }>;
19
+ /**
20
+ * Removes the versioned/contextualized FHIR prefix from a flattened claim key.
21
+ *
22
+ * Examples:
23
+ * - `org.hl7.fhir.r4.Immunization.vaccine-code` -> `Immunization.vaccine-code`
24
+ * - `org.hl7.fhir.api.MedicationStatement.subject` -> `MedicationStatement.subject`
25
+ * - `Consent.identifier` -> `Consent.identifier`
26
+ */
27
+ export declare function toVersionAgnosticMetaClaimKey(claimKey: string): string;
28
+ /**
29
+ * Extracts all `resource.meta.claims` blocks from a FHIR/JSON:API bundle.
30
+ *
31
+ * This is intentionally claims-first: only resources that already carry
32
+ * `resource.meta.claims` are returned.
33
+ */
34
+ export declare function extractResourceMetaClaimsFromBundle(bundle: BundleLike): ResourceMetaClaimsExtraction[];
35
+ /**
36
+ * Builds FHIR `meta.tag[]` codings from a flat claims record.
37
+ *
38
+ * The generated `code` is version-agnostic so UI/frontends can use the same
39
+ * tag keys across `org.hl7.fhir.r4.*` and `org.hl7.fhir.api.*` payloads.
40
+ */
41
+ export declare function createFhirMetaTagsFromClaims(claims: Record<string, unknown>, options?: Readonly<{
42
+ system?: string;
43
+ includeContext?: boolean;
44
+ }>): FhirMetaTagCoding[];
45
+ /**
46
+ * Returns a shallow resource copy whose `meta.tag[]` is derived from
47
+ * `resource.meta.claims`.
48
+ */
49
+ export declare function withDerivedFhirMetaTagsFromClaims<T extends BundleEntryResource>(resource: T, options?: Readonly<{
50
+ system?: string;
51
+ includeContext?: boolean;
52
+ }>): T;