gdc-common-utils-ts 2.8.4 → 2.8.5

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.
@@ -1,13 +1,41 @@
1
1
  // Copyright 2026 Conéctate Soluciones y Aplicaciones SL under the Apache License, Version 2.0.
2
2
  // File: src/utils/convert-composition.ts
3
3
  import { CompositionClaim } from '../models/interoperable-claims/composition-claims.js';
4
- import { codingFromValue, codingToValue, referenceListToCsv, referenceToValue } from './convert-shared.js';
4
+ import { codingFromValue, codingToValue, referenceListToCsv, referenceToValue, requireClaim } from './convert-shared.js';
5
+ function splitAlignedCsv(value) {
6
+ return value === undefined ? [] : value.split(',').map((item) => item.trim());
7
+ }
8
+ function attestersFromClaims(claims) {
9
+ const partyClaim = claims[CompositionClaim.Attester];
10
+ const modeClaim = claims[CompositionClaim.AttesterMode];
11
+ const timeClaim = claims[CompositionClaim.AttesterTime];
12
+ if (partyClaim === undefined && modeClaim === undefined && timeClaim === undefined)
13
+ return undefined;
14
+ const modes = splitAlignedCsv(requireClaim(claims, CompositionClaim.AttesterMode));
15
+ const parties = splitAlignedCsv(partyClaim);
16
+ const times = splitAlignedCsv(timeClaim);
17
+ if (modes.some((mode) => !mode) || parties.length > modes.length || times.length > modes.length) {
18
+ throw new Error('Composition attester claims must be positionally aligned with non-empty attester modes.');
19
+ }
20
+ return modes.map((mode, index) => ({
21
+ mode,
22
+ ...(parties[index] ? { party: { reference: parties[index] } } : {}),
23
+ ...(times[index] ? { time: times[index] } : {}),
24
+ }));
25
+ }
26
+ function alignedAttesterValue(attesters, select) {
27
+ if (attesters.length === 0)
28
+ return undefined;
29
+ return attesters.map((attester) => select(attester) || '').join(',');
30
+ }
5
31
  export function compositionFlatToFhirR4(claims) {
6
32
  return {
7
33
  resourceType: 'Composition',
8
34
  identifier: claims[CompositionClaim.Identifier] ? { value: claims[CompositionClaim.Identifier] } : undefined,
9
35
  subject: claims[CompositionClaim.Subject] ? { reference: claims[CompositionClaim.Subject] } : undefined,
10
36
  author: claims[CompositionClaim.Author] ? claims[CompositionClaim.Author].split(',').map((reference) => ({ reference: reference.trim() })) : undefined,
37
+ attester: attestersFromClaims(claims),
38
+ custodian: claims[CompositionClaim.Custodian] ? { reference: claims[CompositionClaim.Custodian] } : undefined,
11
39
  date: claims[CompositionClaim.Date],
12
40
  title: claims[CompositionClaim.Title],
13
41
  type: claims[CompositionClaim.Type] ? { coding: codingFromValue(claims[CompositionClaim.Type]) } : undefined,
@@ -17,6 +45,9 @@ export function compositionFlatToFhirR4(claims) {
17
45
  };
18
46
  }
19
47
  export function compositionFhirR4ToFlat(resource) {
48
+ const attesters = Array.isArray(resource.attester)
49
+ ? resource.attester
50
+ : [];
20
51
  const sectionValues = Array.isArray(resource.section)
21
52
  ? resource.section
22
53
  .map((item) => codingToValue(item?.code?.coding?.[0]))
@@ -26,6 +57,10 @@ export function compositionFhirR4ToFlat(resource) {
26
57
  [CompositionClaim.Subject]: referenceToValue(resource.subject),
27
58
  [CompositionClaim.Section]: sectionValues.length ? sectionValues.join(',') : undefined,
28
59
  [CompositionClaim.Author]: referenceListToCsv(resource.author),
60
+ [CompositionClaim.Attester]: alignedAttesterValue(attesters, (attester) => attester.party?.reference),
61
+ [CompositionClaim.AttesterMode]: alignedAttesterValue(attesters, (attester) => attester.mode),
62
+ [CompositionClaim.AttesterTime]: alignedAttesterValue(attesters, (attester) => attester.time),
63
+ [CompositionClaim.Custodian]: referenceToValue(resource.custodian),
29
64
  [CompositionClaim.Date]: resource.date,
30
65
  [CompositionClaim.Entry]: undefined,
31
66
  [CompositionClaim.Type]: codingToValue(resource.type?.coding?.[0]),
@@ -2,6 +2,14 @@ export declare const CompositionClaim: {
2
2
  readonly Subject: "Composition.subject";
3
3
  readonly Section: "Composition.section";
4
4
  readonly Author: "Composition.author";
5
+ /** CSV of Composition.attester.party references, aligned with AttesterMode and AttesterTime. */
6
+ readonly Attester: "Composition.attester";
7
+ /** CSV of required R4 Composition.attester.mode values, one per attester. */
8
+ readonly AttesterMode: "Composition.attester-mode";
9
+ /** CSV of optional R4 Composition.attester.time values, positionally aligned with AttesterMode. */
10
+ readonly AttesterTime: "Composition.attester-time";
11
+ /** Composition.custodian Organization reference. */
12
+ readonly Custodian: "Composition.custodian";
5
13
  readonly Date: "Composition.date";
6
14
  readonly Entry: "Composition.entry";
7
15
  readonly Type: "Composition.type";
@@ -4,6 +4,14 @@ export const CompositionClaim = {
4
4
  Subject: 'Composition.subject',
5
5
  Section: 'Composition.section',
6
6
  Author: 'Composition.author',
7
+ /** CSV of Composition.attester.party references, aligned with AttesterMode and AttesterTime. */
8
+ Attester: 'Composition.attester',
9
+ /** CSV of required R4 Composition.attester.mode values, one per attester. */
10
+ AttesterMode: 'Composition.attester-mode',
11
+ /** CSV of optional R4 Composition.attester.time values, positionally aligned with AttesterMode. */
12
+ AttesterTime: 'Composition.attester-time',
13
+ /** Composition.custodian Organization reference. */
14
+ Custodian: 'Composition.custodian',
7
15
  Date: 'Composition.date',
8
16
  Entry: 'Composition.entry',
9
17
  Type: 'Composition.type',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gdc-common-utils-ts",
3
- "version": "2.8.4",
3
+ "version": "2.8.5",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },