gdc-common-utils-ts 2.9.28 → 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.
@@ -45,6 +45,7 @@ export declare const SmartOpenIdAcrValues: Readonly<{
45
45
  /** Wire-level request keys used by identity/auth operations. */
46
46
  export declare const IdentityAuthRequestFields: Readonly<{
47
47
  readonly SubjectToken: "subject_token";
48
+ readonly EmployeeAuthorizationUrn: "employee_authorization_urn";
48
49
  readonly ClientInstanceId: "client_instance_id";
49
50
  readonly LicenseId: "license_id";
50
51
  readonly ClientId: "client_id";
@@ -45,6 +45,7 @@ export const SmartOpenIdAcrValues = Object.freeze({
45
45
  /** Wire-level request keys used by identity/auth operations. */
46
46
  export const IdentityAuthRequestFields = Object.freeze({
47
47
  SubjectToken: 'subject_token',
48
+ EmployeeAuthorizationUrn: 'employee_authorization_urn',
48
49
  ClientInstanceId: 'client_instance_id',
49
50
  LicenseId: 'license_id',
50
51
  ClientId: 'client_id',
@@ -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
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gdc-common-utils-ts",
3
- "version": "2.9.28",
3
+ "version": "2.9.30",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },