gdc-common-utils-ts 2.9.29 → 2.9.30
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.
|
@@ -26,6 +26,22 @@ function splitCsv(value) {
|
|
|
26
26
|
.map((item) => item.trim())
|
|
27
27
|
.filter(Boolean);
|
|
28
28
|
}
|
|
29
|
+
function buildCompositionSubjectResource(subjectReference) {
|
|
30
|
+
const typedReference = /^([A-Z][A-Za-z0-9]*)\/([^/]+)$/.exec(subjectReference);
|
|
31
|
+
if (typedReference) {
|
|
32
|
+
return {
|
|
33
|
+
resourceType: typedReference[1],
|
|
34
|
+
id: typedReference[2],
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
if (/^[A-Z][A-Za-z0-9]*\//.test(subjectReference)) {
|
|
38
|
+
throw new TypeError('bundle_document_subject_reference_invalid');
|
|
39
|
+
}
|
|
40
|
+
return {
|
|
41
|
+
resourceType: ResourceTypesFhirR4.Patient,
|
|
42
|
+
id: subjectReference,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
29
45
|
export function getSimpleClaimAttributeName(key) {
|
|
30
46
|
const value = asTrimmedString(key);
|
|
31
47
|
if (!value)
|
|
@@ -511,6 +527,9 @@ export function buildBundleDocumentFromClaims(input) {
|
|
|
511
527
|
const compositionTitle = asTrimmedString(compositionClaims[CompositionClaim.Title]);
|
|
512
528
|
const compositionDate = asTrimmedString(compositionClaims[CompositionClaim.Date]);
|
|
513
529
|
const compositionAuthorList = splitCsv(compositionClaims[CompositionClaim.Author]);
|
|
530
|
+
const compositionAttesterList = splitCsv(compositionClaims[CompositionClaim.Attester]);
|
|
531
|
+
const compositionAttesterModeList = splitCsv(compositionClaims[CompositionClaim.AttesterMode]);
|
|
532
|
+
const compositionAttesterTimeList = String(compositionClaims[CompositionClaim.AttesterTime] || '').split(',');
|
|
514
533
|
const compositionSections = new Map();
|
|
515
534
|
const visibleEntries = [];
|
|
516
535
|
const resourceByReference = new Map();
|
|
@@ -590,16 +609,20 @@ export function buildBundleDocumentFromClaims(input) {
|
|
|
590
609
|
...(compositionAuthorList.length > 0 ? {
|
|
591
610
|
author: compositionAuthorList.map((reference) => ({ reference })),
|
|
592
611
|
} : {}),
|
|
612
|
+
...(compositionAttesterList.length > 0 ? {
|
|
613
|
+
attester: compositionAttesterList.map((reference, index) => ({
|
|
614
|
+
party: { reference },
|
|
615
|
+
mode: compositionAttesterModeList[index],
|
|
616
|
+
...(compositionAttesterTimeList[index] ? { time: compositionAttesterTimeList[index] } : {}),
|
|
617
|
+
})),
|
|
618
|
+
} : {}),
|
|
593
619
|
meta: { claims: compositionClaims },
|
|
594
620
|
section: Array.from(compositionSections.values()),
|
|
595
621
|
},
|
|
596
622
|
},
|
|
597
623
|
...(compositionSubject
|
|
598
624
|
? [{
|
|
599
|
-
resource:
|
|
600
|
-
resourceType: 'Patient',
|
|
601
|
-
id: compositionSubject,
|
|
602
|
-
},
|
|
625
|
+
resource: buildCompositionSubjectResource(compositionSubject),
|
|
603
626
|
}]
|
|
604
627
|
: []),
|
|
605
628
|
...visibleEntries,
|
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
import type { BundleEntry, BundleJsonApi } from '../models/bundle.js';
|
|
2
2
|
import { AllowedResourceType, BundleType, type BuiltBundleEntry, type BundleOperation, type ResourceTypeEntryEditor } from '../models/bundle-editor-types.js';
|
|
3
|
+
import { type CompositionAttesterMode } from '../models/interoperable-claims/composition-claims.js';
|
|
3
4
|
import { type ValidateBundleDocumentResult } from './bundle-document-builder.js';
|
|
4
5
|
import { buildEmployeePurgeBundle, buildEmployeeSearchBundle } from './employee.js';
|
|
5
6
|
import { BundleEntryEditor } from './bundle-entry-editor.js';
|
|
7
|
+
export type CompositionAttesterInput = Readonly<{
|
|
8
|
+
reference: string;
|
|
9
|
+
mode: CompositionAttesterMode;
|
|
10
|
+
time?: string;
|
|
11
|
+
}>;
|
|
6
12
|
export declare class BundleEditor {
|
|
7
13
|
private bundleOperation;
|
|
8
14
|
private allowedResourceType;
|
|
@@ -77,6 +83,10 @@ export declare class BundleEditor {
|
|
|
77
83
|
setCompositionAuthorList(references: readonly string[]): this;
|
|
78
84
|
/** Returns the normalized `Composition.author` reference list staged for the future document root. */
|
|
79
85
|
getCompositionAuthorList(): string[];
|
|
86
|
+
/** Replaces the aligned professional/legal attestation metadata for the document Composition. */
|
|
87
|
+
setCompositionAttesterList(attesters: readonly CompositionAttesterInput[]): this;
|
|
88
|
+
/** Returns the positionally aligned Composition attesters currently staged for document authoring. */
|
|
89
|
+
getCompositionAttesterList(): CompositionAttesterInput[];
|
|
80
90
|
/**
|
|
81
91
|
* Opens one new entry and returns a generic entry editor for that slot.
|
|
82
92
|
*
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
import { ClaimsPersonSchemaorg } from '../constants/schemaorg.js';
|
|
10
10
|
import { ResourceTypesFhirR4 } from '../constants/fhir-resource-types.js';
|
|
11
11
|
import { BundleEditorValidationIssues, BundleTypes, } from '../models/bundle-editor-types.js';
|
|
12
|
-
import { CompositionClaim } from '../models/interoperable-claims/composition-claims.js';
|
|
12
|
+
import { CompositionAttesterModes, CompositionClaim, } from '../models/interoperable-claims/composition-claims.js';
|
|
13
13
|
import { getClaimValues, setClaimValues } from '../claims/claim-list-helpers.js';
|
|
14
14
|
import { buildBundleDocumentFromClaims } from './bundle-document-builder.js';
|
|
15
15
|
import { buildEmployeeBatchEntry, buildEmployeePurgeBundle, buildEmployeeSearchBundle, EmployeeBundleOperations, EmployeeResourceTypes, } from './employee.js';
|
|
@@ -165,6 +165,41 @@ export class BundleEditor {
|
|
|
165
165
|
getCompositionAuthorList() {
|
|
166
166
|
return this.getCompositionCsvClaimList(CompositionClaim.Author);
|
|
167
167
|
}
|
|
168
|
+
/** Replaces the aligned professional/legal attestation metadata for the document Composition. */
|
|
169
|
+
setCompositionAttesterList(attesters) {
|
|
170
|
+
const normalized = attesters.map((attester) => ({
|
|
171
|
+
reference: normalizeOptionalIdentifier(attester.reference),
|
|
172
|
+
mode: normalizeOptionalIdentifier(attester.mode),
|
|
173
|
+
time: normalizeOptionalIdentifier(attester.time),
|
|
174
|
+
}));
|
|
175
|
+
if (normalized.some((attester) => !attester.reference || !attester.mode
|
|
176
|
+
|| !Object.values(CompositionAttesterModes).includes(attester.mode))) {
|
|
177
|
+
throw new TypeError('bundle_document_attester_invalid');
|
|
178
|
+
}
|
|
179
|
+
if (normalized.length === 0) {
|
|
180
|
+
delete this.compositionClaims[CompositionClaim.Attester];
|
|
181
|
+
delete this.compositionClaims[CompositionClaim.AttesterMode];
|
|
182
|
+
delete this.compositionClaims[CompositionClaim.AttesterTime];
|
|
183
|
+
return this;
|
|
184
|
+
}
|
|
185
|
+
this.compositionClaims[CompositionClaim.Attester] = normalized.map(({ reference }) => reference).join(',');
|
|
186
|
+
this.compositionClaims[CompositionClaim.AttesterMode] = normalized.map(({ mode }) => mode).join(',');
|
|
187
|
+
this.compositionClaims[CompositionClaim.AttesterTime] = normalized.map(({ time }) => time || '').join(',');
|
|
188
|
+
return this;
|
|
189
|
+
}
|
|
190
|
+
/** Returns the positionally aligned Composition attesters currently staged for document authoring. */
|
|
191
|
+
getCompositionAttesterList() {
|
|
192
|
+
const references = String(this.compositionClaims[CompositionClaim.Attester] || '').split(',');
|
|
193
|
+
const modes = String(this.compositionClaims[CompositionClaim.AttesterMode] || '').split(',');
|
|
194
|
+
const times = String(this.compositionClaims[CompositionClaim.AttesterTime] || '').split(',');
|
|
195
|
+
if (references.length === 1 && !references[0])
|
|
196
|
+
return [];
|
|
197
|
+
return references.map((reference, index) => ({
|
|
198
|
+
reference,
|
|
199
|
+
mode: modes[index],
|
|
200
|
+
...(times[index] ? { time: times[index] } : {}),
|
|
201
|
+
}));
|
|
202
|
+
}
|
|
168
203
|
/**
|
|
169
204
|
* Opens one new entry and returns a generic entry editor for that slot.
|
|
170
205
|
*
|