gdc-common-utils-ts 2.3.0 → 2.3.2
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.
- package/README.md +22 -0
- package/dist/CryptographyService.d.ts +3 -0
- package/dist/CryptographyService.js +64 -35
- package/dist/constants/identity-identifiers.d.ts +60 -7
- package/dist/constants/identity-identifiers.js +58 -7
- package/dist/constants/schemaorg.d.ts +4 -0
- package/dist/constants/schemaorg.js +4 -0
- package/dist/constants/urn.d.ts +1 -0
- package/dist/constants/urn.js +1 -0
- package/dist/convert/index.d.ts +1 -0
- package/dist/convert/index.js +1 -0
- package/dist/convert/schemaorg-to-gaia-x.d.ts +116 -0
- package/dist/convert/schemaorg-to-gaia-x.js +211 -0
- package/dist/examples/shared.d.ts +1 -1
- package/dist/examples/shared.js +1 -1
- package/dist/models/bundle-editor-types.d.ts +13 -3
- package/dist/models/bundle-editor-types.js +9 -1
- package/dist/models/gaia-x.d.ts +132 -0
- package/dist/models/gaia-x.js +26 -0
- package/dist/models/index.d.ts +2 -0
- package/dist/models/index.js +2 -0
- package/dist/models/interoperable-claims/invoice-claims.d.ts +1 -1
- package/dist/models/interoperable-claims/invoice-claims.js +2 -2
- package/dist/models/interoperable-claims/observation-claims.d.ts +2 -2
- package/dist/models/interoperable-claims/observation-claims.js +2 -2
- package/dist/models/jwe.d.ts +25 -0
- package/dist/models/subject-identifier-ledger.d.ts +16 -0
- package/dist/models/subject-identifier-ledger.js +1 -0
- package/dist/utils/bundle-editor-core.d.ts +9 -0
- package/dist/utils/bundle-editor-core.js +46 -0
- package/dist/utils/bundle-editor.d.ts +2 -0
- package/dist/utils/bundle-editor.js +2 -0
- package/dist/utils/bundle-entry-editor.d.ts +6 -0
- package/dist/utils/bundle-entry-editor.js +20 -0
- package/dist/utils/communication-consent-access-editor.d.ts +14 -1
- package/dist/utils/communication-consent-access-editor.js +27 -0
- package/dist/utils/consent-entry-editor.d.ts +42 -0
- package/dist/utils/consent-entry-editor.js +80 -0
- package/dist/utils/did.d.ts +2 -2
- package/dist/utils/did.js +3 -3
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +1 -0
- package/dist/utils/individual-identifier.d.ts +14 -0
- package/dist/utils/individual-identifier.js +39 -0
- package/dist/utils/multibasehash.d.ts +19 -5
- package/dist/utils/multibasehash.js +35 -10
- package/dist/utils/multiformat-profile.d.ts +4 -2
- package/dist/utils/multiformat-profile.js +5 -3
- package/dist/utils/related-person-entry-editor.d.ts +32 -0
- package/dist/utils/related-person-entry-editor.js +97 -0
- package/dist/utils/same-as.d.ts +10 -0
- package/dist/utils/same-as.js +28 -3
- package/package.json +2 -1
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
// Copyright 2026 Antifraud Services Inc. under the Apache License, Version 2.0.
|
|
2
|
+
import { ClaimsOrganizationSchemaorg, ClaimsServiceSchemaorg } from '../constants/schemaorg.js';
|
|
3
|
+
import { GaiaXCredentialAttachmentFormat, GaiaXCredentialAttachmentRole, GaiaXCredentialMediaType, } from '../models/gaia-x.js';
|
|
4
|
+
const W3C_VC_V2_CONTEXT = 'https://www.w3.org/ns/credentials/v2';
|
|
5
|
+
function requiredClaim(claims, key, label) {
|
|
6
|
+
const value = String(claims[key] ?? '').trim();
|
|
7
|
+
if (!value)
|
|
8
|
+
throw new Error(`Missing ${label} required for Gaia-X projection.`);
|
|
9
|
+
return value;
|
|
10
|
+
}
|
|
11
|
+
function optionalClaim(claims, key) {
|
|
12
|
+
const value = String(claims[key] ?? '').trim();
|
|
13
|
+
return value || undefined;
|
|
14
|
+
}
|
|
15
|
+
function requiredInput(value, label) {
|
|
16
|
+
const normalized = value.trim();
|
|
17
|
+
if (!normalized)
|
|
18
|
+
throw new Error(`Missing ${label} required for Gaia-X projection.`);
|
|
19
|
+
return normalized;
|
|
20
|
+
}
|
|
21
|
+
function asObject(value) {
|
|
22
|
+
return value && typeof value === 'object' && !Array.isArray(value)
|
|
23
|
+
? value
|
|
24
|
+
: undefined;
|
|
25
|
+
}
|
|
26
|
+
function asString(value) {
|
|
27
|
+
return typeof value === 'string' ? value.trim() : '';
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Reads the canonical schema.org `PropertyValue` organization identifier.
|
|
31
|
+
* During migration it also accepts the historical nested
|
|
32
|
+
* `identifier.identifier` form. When the structure is absent, `taxID` becomes
|
|
33
|
+
* a VAT/TAX fallback, matching ICA's OrganizationCredential issuance rule.
|
|
34
|
+
*/
|
|
35
|
+
export function resolveSchemaOrgOrganizationRegistrationIdentifier(credentialSubject) {
|
|
36
|
+
const outerIdentifier = asObject(credentialSubject.identifier);
|
|
37
|
+
const identifier = asObject(outerIdentifier?.identifier) || outerIdentifier;
|
|
38
|
+
const taxId = asString(credentialSubject.taxID || credentialSubject.taxId);
|
|
39
|
+
const value = asString(identifier?.value) || taxId;
|
|
40
|
+
if (!value)
|
|
41
|
+
throw new Error('Missing OrganizationCredential credentialSubject.identifier.value or taxID.');
|
|
42
|
+
const explicitType = asString(identifier?.additionalType || outerIdentifier?.additionalType);
|
|
43
|
+
return {
|
|
44
|
+
additionalType: explicitType || (/^VAT[A-Z]{2}-/i.test(value) ? 'VAT' : 'TAX'),
|
|
45
|
+
value,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Converts canonical schema.org organization claims into an unsigned Gaia-X
|
|
50
|
+
* ICAM 25.11 LegalPerson VC draft.
|
|
51
|
+
*
|
|
52
|
+
* Semantic boundary:
|
|
53
|
+
* - Gaia-X `LegalPerson` is the juridical organization/legal entity. It is not
|
|
54
|
+
* GDC's natural-person `LegalRepresentativeCredential`.
|
|
55
|
+
* - representative claims are intentionally never projected by this function.
|
|
56
|
+
* - VAT/tax remains in the source schema.org OrganizationCredential. Gaia-X's
|
|
57
|
+
* `gx:legalRegistrationNumber` is a resolvable reference to the separate
|
|
58
|
+
* registration/notary credential, not an assertion synthesized from VAT.
|
|
59
|
+
* - this function is deterministic and does not sign. The authoritative GW
|
|
60
|
+
* signs the returned draft as VC-JWT; ICA caches and verifies that exact JWT.
|
|
61
|
+
*
|
|
62
|
+
* This projection targets the credential structure and semantic model described
|
|
63
|
+
* by Gaia-X ICAM 25.11. Passing the resulting shape tests neither Gaia-X policy
|
|
64
|
+
* compliance nor GXDCH/TCK conformance.
|
|
65
|
+
*
|
|
66
|
+
* @see https://docs.gaia-x.eu/technical-committee/identity-credential-access-management/25.11/gaia-x_credentials/
|
|
67
|
+
* @see https://docs.gaia-x.eu/technical-committee/identity-credential-access-management/25.11/semantic_model/
|
|
68
|
+
*/
|
|
69
|
+
export function buildGaiaXLegalPersonCredentialDraft(input) {
|
|
70
|
+
const subdivision = optionalClaim(input.claims, ClaimsOrganizationSchemaorg.addressRegion);
|
|
71
|
+
const country = optionalClaim(input.claims, ClaimsOrganizationSchemaorg.addressCountry);
|
|
72
|
+
if (!subdivision && !country) {
|
|
73
|
+
throw new Error('Missing organization ISO 3166-2 address subdivision or ISO 3166-1 country.');
|
|
74
|
+
}
|
|
75
|
+
const gaiaXAddress = subdivision
|
|
76
|
+
? { 'gx:countrySubdivisionCode': subdivision }
|
|
77
|
+
: { 'gx:countryCode': country };
|
|
78
|
+
const website = optionalClaim(input.claims, ClaimsOrganizationSchemaorg.url);
|
|
79
|
+
return {
|
|
80
|
+
'@context': [W3C_VC_V2_CONTEXT],
|
|
81
|
+
type: ['VerifiableCredential', 'LegalPerson'],
|
|
82
|
+
id: requiredInput(input.credentialId, 'credentialId'),
|
|
83
|
+
issuer: requiredInput(input.issuerId, 'issuerId'),
|
|
84
|
+
validFrom: requiredInput(input.validFrom, 'validFrom'),
|
|
85
|
+
credentialSubject: {
|
|
86
|
+
id: requiredInput(input.subjectId, 'subjectId'),
|
|
87
|
+
type: 'gx:LegalPerson',
|
|
88
|
+
'gx:legalName': requiredClaim(input.claims, ClaimsOrganizationSchemaorg.legalName, 'organization legal name'),
|
|
89
|
+
'gx:legalRegistrationNumber': {
|
|
90
|
+
id: requiredInput(input.legalRegistrationNumberCredentialId, 'legal registration number credential id'),
|
|
91
|
+
},
|
|
92
|
+
'gx:headquarterAddress': gaiaXAddress,
|
|
93
|
+
'gx:legalAddress': gaiaXAddress,
|
|
94
|
+
...(website ? { 'gx:website': website } : {}),
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Projects an ICA/GDC schema.org OrganizationCredential into a Gaia-X
|
|
100
|
+
* LegalPerson draft while preserving the organization `credentialSubject.id`.
|
|
101
|
+
*
|
|
102
|
+
* The source VC and Gaia-X VC are different signed statements, so their
|
|
103
|
+
* credential IDs must not silently collide. By default the Gaia-X credential
|
|
104
|
+
* receives `<source credential id>#gaia-x-legal-person`; callers may provide a
|
|
105
|
+
* separately resolvable ID. `registrationIdentifier` is returned for the
|
|
106
|
+
* notary/GXDCH registration step, while `gx:legalRegistrationNumber` remains a
|
|
107
|
+
* reference to the resulting registration credential.
|
|
108
|
+
*/
|
|
109
|
+
export function buildGaiaXLegalPersonProjectionFromOrganizationCredential(input) {
|
|
110
|
+
const sourceCredentialId = requiredInput(asString(input.organizationCredential.id), 'source credential id');
|
|
111
|
+
const subject = asObject(input.organizationCredential.credentialSubject);
|
|
112
|
+
if (!subject)
|
|
113
|
+
throw new Error('OrganizationCredential requires one object credentialSubject.');
|
|
114
|
+
const subjectId = requiredInput(asString(subject.id || subject['@id']), 'organization credentialSubject.id');
|
|
115
|
+
const registrationIdentifier = resolveSchemaOrgOrganizationRegistrationIdentifier(subject);
|
|
116
|
+
const address = asObject(subject.address);
|
|
117
|
+
const claims = {
|
|
118
|
+
[ClaimsOrganizationSchemaorg.legalName]: asString(subject.legalName || subject.name),
|
|
119
|
+
[ClaimsOrganizationSchemaorg.url]: asString(subject.url),
|
|
120
|
+
[ClaimsOrganizationSchemaorg.addressRegion]: input.addressSubdivisionCode || asString(address?.addressRegion),
|
|
121
|
+
[ClaimsOrganizationSchemaorg.addressCountry]: input.addressCountryCode || asString(address?.addressCountry),
|
|
122
|
+
[ClaimsOrganizationSchemaorg.identifierType]: registrationIdentifier.additionalType,
|
|
123
|
+
[ClaimsOrganizationSchemaorg.identifierValue]: registrationIdentifier.value,
|
|
124
|
+
};
|
|
125
|
+
return {
|
|
126
|
+
sourceCredentialId,
|
|
127
|
+
registrationIdentifier,
|
|
128
|
+
credential: buildGaiaXLegalPersonCredentialDraft({
|
|
129
|
+
claims,
|
|
130
|
+
credentialId: input.credentialId || `${sourceCredentialId}#gaia-x-legal-person`,
|
|
131
|
+
subjectId,
|
|
132
|
+
issuerId: input.issuerId,
|
|
133
|
+
legalRegistrationNumberCredentialId: input.legalRegistrationNumberCredentialId,
|
|
134
|
+
validFrom: input.validFrom,
|
|
135
|
+
}),
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Converts schema.org service claims into an unsigned Gaia-X ServiceOffering
|
|
140
|
+
* VC draft. A service offering is independent from the participant credential:
|
|
141
|
+
* it references the LegalPerson credential through `gx:providedBy` and carries
|
|
142
|
+
* its own mandatory terms reference.
|
|
143
|
+
*
|
|
144
|
+
* The GW must sign this draft as a separate VC-JWT. A DCAT DataService is useful
|
|
145
|
+
* catalog metadata but is not a substitute for this credential.
|
|
146
|
+
*/
|
|
147
|
+
export function buildGaiaXServiceOfferingCredentialDraft(input) {
|
|
148
|
+
const name = optionalClaim(input.claims, ClaimsServiceSchemaorg.name);
|
|
149
|
+
const description = optionalClaim(input.claims, ClaimsServiceSchemaorg.description);
|
|
150
|
+
const endpointUrl = optionalClaim(input.claims, ClaimsServiceSchemaorg.url);
|
|
151
|
+
return {
|
|
152
|
+
'@context': [W3C_VC_V2_CONTEXT],
|
|
153
|
+
type: ['VerifiableCredential', 'ServiceOffering'],
|
|
154
|
+
id: requiredInput(input.credentialId, 'credentialId'),
|
|
155
|
+
issuer: requiredInput(input.issuerId, 'issuerId'),
|
|
156
|
+
validFrom: requiredInput(input.validFrom, 'validFrom'),
|
|
157
|
+
credentialSubject: {
|
|
158
|
+
id: requiredInput(input.subjectId, 'subjectId'),
|
|
159
|
+
type: 'gx:ServiceOffering',
|
|
160
|
+
'gx:providedBy': { id: requiredInput(input.providedByCredentialId, 'providedBy credential id') },
|
|
161
|
+
'gx:serviceOfferingTermsAndConditions': [{
|
|
162
|
+
'gx:url': requiredInput(input.termsAndConditionsUrl, 'terms and conditions URL'),
|
|
163
|
+
'gx:hash': requiredInput(input.termsAndConditionsHash, 'terms and conditions hash'),
|
|
164
|
+
}],
|
|
165
|
+
...(name ? { 'gx:name': name } : {}),
|
|
166
|
+
...(description ? { 'gx:description': description } : {}),
|
|
167
|
+
...(endpointUrl ? { 'gx:endpoint': [{ 'gx:endpointURL': endpointUrl }] } : {}),
|
|
168
|
+
},
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
/** Builds the mandatory first Gaia-X participant attachment for ICA discovery. */
|
|
172
|
+
export function buildGaiaXParticipantAttachment(input) {
|
|
173
|
+
return buildGaiaXVcJwtAttachment({
|
|
174
|
+
...input,
|
|
175
|
+
role: GaiaXCredentialAttachmentRole.Participant,
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
/** Wraps an exact signed Gaia-X VC-JWT without decoding or re-signing it. */
|
|
179
|
+
export function buildGaiaXVcJwtAttachment(input) {
|
|
180
|
+
return {
|
|
181
|
+
id: requiredInput(input.id, 'attachment id'),
|
|
182
|
+
format: GaiaXCredentialAttachmentFormat,
|
|
183
|
+
role: input.role,
|
|
184
|
+
media_type: GaiaXCredentialMediaType.VcJwt,
|
|
185
|
+
data: { json: { jwt: requiredInput(input.jwt, 'VC-JWT') } },
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Assembles one ICA member discovery entry and enforces the interoperable
|
|
190
|
+
* ordering contract: schema.org OrganizationCredential first in `vc[]`, and
|
|
191
|
+
* Gaia-X participant VC-JWT first in `attachments[]`.
|
|
192
|
+
*
|
|
193
|
+
* The caller owns signature verification and cache freshness. This helper does
|
|
194
|
+
* not derive or duplicate VAT outside `vc[]` and does not mutate signed data.
|
|
195
|
+
*/
|
|
196
|
+
export function buildIcaMemberDiscoveryData(input) {
|
|
197
|
+
if (!input.vc.length) {
|
|
198
|
+
throw new Error('ICA member discovery requires vc[0] OrganizationCredential.');
|
|
199
|
+
}
|
|
200
|
+
if (input.attachments[0]?.role !== GaiaXCredentialAttachmentRole.Participant) {
|
|
201
|
+
throw new Error('ICA member discovery requires the Gaia-X participant VC-JWT as attachments[0].');
|
|
202
|
+
}
|
|
203
|
+
return {
|
|
204
|
+
id: requiredInput(input.id, 'member id'),
|
|
205
|
+
vc: [...input.vc],
|
|
206
|
+
did: { document: input.did.document, meta: { ...input.did.meta } },
|
|
207
|
+
attachments: [...input.attachments],
|
|
208
|
+
...(input.dcat ? { dcat: input.dcat } : {}),
|
|
209
|
+
...(input.meta ? { meta: input.meta } : {}),
|
|
210
|
+
};
|
|
211
|
+
}
|
|
@@ -131,7 +131,7 @@ export declare const EXAMPLE_PROVIDER_SECTOR_DID: string;
|
|
|
131
131
|
*
|
|
132
132
|
* There are two valid base roots:
|
|
133
133
|
* - hosted provider root:
|
|
134
|
-
* `did:web:<host.domain>:<sector
|
|
134
|
+
* `did:web:<host.domain>:<sector>:organization:taxid:<provider-tax-id>`
|
|
135
135
|
* - external provider custom-domain root:
|
|
136
136
|
* `did:web:<sector.provider.domain>`
|
|
137
137
|
*
|
package/dist/examples/shared.js
CHANGED
|
@@ -156,7 +156,7 @@ export const EXAMPLE_PROVIDER_SECTOR_DID = EXAMPLE_PROVIDER_DOMAIN_DID;
|
|
|
156
156
|
*
|
|
157
157
|
* There are two valid base roots:
|
|
158
158
|
* - hosted provider root:
|
|
159
|
-
* `did:web:<host.domain>:<sector
|
|
159
|
+
* `did:web:<host.domain>:<sector>:organization:taxid:<provider-tax-id>`
|
|
160
160
|
* - external provider custom-domain root:
|
|
161
161
|
* `did:web:<sector.provider.domain>`
|
|
162
162
|
*
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type BundleEntry, type BundleJsonApi, type BundleRequest } from './bundle';
|
|
2
|
-
import {
|
|
2
|
+
import { type EmployeeClaims } from '../utils/employee';
|
|
3
3
|
import type { BundleEntryEditor } from '../utils/bundle-entry-editor';
|
|
4
4
|
import type { EmployeeEntryEditor } from '../utils/employee-entry-editor';
|
|
5
5
|
import type { VitalSignEntryEditor } from '../utils/vital-sign-entry-editor';
|
|
@@ -18,11 +18,21 @@ import type { CoverageEntryEditor } from '../utils/coverage-entry-editor';
|
|
|
18
18
|
import type { ImmunizationEntryEditor } from '../utils/immunization-entry-editor';
|
|
19
19
|
import type { ProcedureEntryEditor } from '../utils/procedure-entry-editor';
|
|
20
20
|
import type { DiagnosticReportEntryEditor } from '../utils/diagnostic-report-entry-editor';
|
|
21
|
-
|
|
21
|
+
import type { ConsentEntryEditor } from '../utils/consent-entry-editor';
|
|
22
|
+
import type { RelatedPersonEntryEditor } from '../utils/related-person-entry-editor';
|
|
23
|
+
/** Runtime-neutral business operations staged by `BundleEditor`. */
|
|
24
|
+
export declare const BundleOperations: Readonly<{
|
|
25
|
+
readonly create: "create";
|
|
26
|
+
readonly search: "search";
|
|
27
|
+
readonly disable: "disable";
|
|
28
|
+
readonly purge: "purge";
|
|
29
|
+
}>;
|
|
30
|
+
export type BundleOperation = (typeof BundleOperations)[keyof typeof BundleOperations];
|
|
22
31
|
/** Resource types that the shared bundle editors currently know how to open as typed entry editors. */
|
|
23
32
|
export declare const BundleEditableResourceTypes: Readonly<{
|
|
24
33
|
readonly employee: "Employee";
|
|
25
34
|
readonly consent: "Consent";
|
|
35
|
+
readonly relatedPerson: "RelatedPerson";
|
|
26
36
|
readonly observation: "Observation";
|
|
27
37
|
readonly vitalSign: "Observation";
|
|
28
38
|
readonly allergyIntolerance: "AllergyIntolerance";
|
|
@@ -86,4 +96,4 @@ export type BundleJsonApiShape = BundleJsonApi<BundleEntry>;
|
|
|
86
96
|
* resource type they requested, instead of falling back to the generic
|
|
87
97
|
* `BundleEntryEditor` API.
|
|
88
98
|
*/
|
|
89
|
-
export type ResourceTypeEntryEditor<T extends AllowedResourceType> = T extends typeof BundleEditableResourceTypes.employee ? EmployeeEntryEditor : T extends typeof BundleEditableResourceTypes.vitalSign ? VitalSignEntryEditor : T extends typeof BundleEditableResourceTypes.observation ? ObservationEntryEditor : T extends typeof BundleEditableResourceTypes.allergyIntolerance ? AllergyIntoleranceEntryEditor : T extends typeof BundleEditableResourceTypes.condition ? ConditionEntryEditor : T extends typeof BundleEditableResourceTypes.medicationStatement ? MedicationStatementEntryEditor : T extends typeof BundleEditableResourceTypes.documentReference ? DocumentReferenceEntryEditor : T extends typeof BundleEditableResourceTypes.carePlan ? CarePlanEntryEditor : T extends typeof BundleEditableResourceTypes.flag ? FlagEntryEditor : T extends typeof BundleEditableResourceTypes.clinicalImpression ? ClinicalImpressionEntryEditor : T extends typeof BundleEditableResourceTypes.device ? DeviceEntryEditor : T extends typeof BundleEditableResourceTypes.deviceUseStatement ? DeviceUseStatementEntryEditor : T extends typeof BundleEditableResourceTypes.encounter ? EncounterEntryEditor : T extends typeof BundleEditableResourceTypes.coverage ? CoverageEntryEditor : T extends typeof BundleEditableResourceTypes.immunization ? ImmunizationEntryEditor : T extends typeof BundleEditableResourceTypes.procedure ? ProcedureEntryEditor : T extends typeof BundleEditableResourceTypes.diagnosticReport ? DiagnosticReportEntryEditor : BundleEntryEditor;
|
|
99
|
+
export type ResourceTypeEntryEditor<T extends AllowedResourceType> = T extends typeof BundleEditableResourceTypes.employee ? EmployeeEntryEditor : T extends typeof BundleEditableResourceTypes.consent ? ConsentEntryEditor : T extends typeof BundleEditableResourceTypes.relatedPerson ? RelatedPersonEntryEditor : T extends typeof BundleEditableResourceTypes.vitalSign ? VitalSignEntryEditor : T extends typeof BundleEditableResourceTypes.observation ? ObservationEntryEditor : T extends typeof BundleEditableResourceTypes.allergyIntolerance ? AllergyIntoleranceEntryEditor : T extends typeof BundleEditableResourceTypes.condition ? ConditionEntryEditor : T extends typeof BundleEditableResourceTypes.medicationStatement ? MedicationStatementEntryEditor : T extends typeof BundleEditableResourceTypes.documentReference ? DocumentReferenceEntryEditor : T extends typeof BundleEditableResourceTypes.carePlan ? CarePlanEntryEditor : T extends typeof BundleEditableResourceTypes.flag ? FlagEntryEditor : T extends typeof BundleEditableResourceTypes.clinicalImpression ? ClinicalImpressionEntryEditor : T extends typeof BundleEditableResourceTypes.device ? DeviceEntryEditor : T extends typeof BundleEditableResourceTypes.deviceUseStatement ? DeviceUseStatementEntryEditor : T extends typeof BundleEditableResourceTypes.encounter ? EncounterEntryEditor : T extends typeof BundleEditableResourceTypes.coverage ? CoverageEntryEditor : T extends typeof BundleEditableResourceTypes.immunization ? ImmunizationEntryEditor : T extends typeof BundleEditableResourceTypes.procedure ? ProcedureEntryEditor : T extends typeof BundleEditableResourceTypes.diagnosticReport ? DiagnosticReportEntryEditor : BundleEntryEditor;
|
|
@@ -5,11 +5,19 @@
|
|
|
5
5
|
* - Do not move helper implementations or class logic here.
|
|
6
6
|
*/
|
|
7
7
|
import { ResourceTypesFhirR4 } from '../constants/fhir-resource-types.js';
|
|
8
|
-
import { EmployeeResourceTypes, } from '../utils/employee.js';
|
|
8
|
+
import { EmployeeBundleOperations, EmployeeResourceTypes, } from '../utils/employee.js';
|
|
9
|
+
/** Runtime-neutral business operations staged by `BundleEditor`. */
|
|
10
|
+
export const BundleOperations = Object.freeze({
|
|
11
|
+
create: EmployeeBundleOperations.create,
|
|
12
|
+
search: EmployeeBundleOperations.search,
|
|
13
|
+
disable: EmployeeBundleOperations.disable,
|
|
14
|
+
purge: EmployeeBundleOperations.purge,
|
|
15
|
+
});
|
|
9
16
|
/** Resource types that the shared bundle editors currently know how to open as typed entry editors. */
|
|
10
17
|
export const BundleEditableResourceTypes = Object.freeze({
|
|
11
18
|
employee: EmployeeResourceTypes.employee,
|
|
12
19
|
consent: ResourceTypesFhirR4.Consent,
|
|
20
|
+
relatedPerson: ResourceTypesFhirR4.RelatedPerson,
|
|
13
21
|
observation: ResourceTypesFhirR4.Observation,
|
|
14
22
|
vitalSign: ResourceTypesFhirR4.Observation,
|
|
15
23
|
allergyIntolerance: ResourceTypesFhirR4.AllergyIntolerance,
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import type { DidCommAttachment } from './comm';
|
|
2
|
+
import type { DidDocument } from './did';
|
|
3
|
+
export type JsonObject = Record<string, unknown>;
|
|
4
|
+
/** Versioned Gaia-X profile targeted by the schema.org semantic projection. */
|
|
5
|
+
export declare const GaiaXProfile: Readonly<{
|
|
6
|
+
readonly Icam2511: "icam-25.11";
|
|
7
|
+
}>;
|
|
8
|
+
/** Media types used to transport signed Gaia-X credentials without decoding them. */
|
|
9
|
+
export declare const GaiaXCredentialMediaType: Readonly<{
|
|
10
|
+
readonly VcJwt: "application/vc+jwt";
|
|
11
|
+
}>;
|
|
12
|
+
/** DIDComm attachment format identifier used by the existing ICA contract. */
|
|
13
|
+
export declare const GaiaXCredentialAttachmentFormat: "vc+jwt";
|
|
14
|
+
/**
|
|
15
|
+
* Semantic roles for Gaia-X VC-JWT attachments in an ICA member aggregate.
|
|
16
|
+
*
|
|
17
|
+
* `Participant` is deliberately first in a member's `attachments[]`. It is the
|
|
18
|
+
* Gaia-X legal-entity projection corresponding to the same organization
|
|
19
|
+
* represented by the first schema.org `OrganizationCredential` in `vc[]`.
|
|
20
|
+
* They are different signed credentials and MUST NOT be treated as bytewise or
|
|
21
|
+
* schema-equivalent copies.
|
|
22
|
+
*/
|
|
23
|
+
export declare const GaiaXCredentialAttachmentRole: Readonly<{
|
|
24
|
+
readonly Participant: "gaia-x-participant-vc-jwt";
|
|
25
|
+
readonly LegalRegistrationNumber: "gaia-x-legal-registration-number-vc-jwt";
|
|
26
|
+
readonly TermsAndConditions: "gaia-x-terms-and-conditions-vc-jwt";
|
|
27
|
+
readonly ServiceOffering: "gaia-x-service-offering-vc-jwt";
|
|
28
|
+
}>;
|
|
29
|
+
export type GaiaXCredentialAttachmentRoleValue = typeof GaiaXCredentialAttachmentRole[keyof typeof GaiaXCredentialAttachmentRole];
|
|
30
|
+
/** DIDComm attachment containing the compact, already-signed Gaia-X VC-JWT. */
|
|
31
|
+
export interface GaiaXVcJwtAttachment extends DidCommAttachment {
|
|
32
|
+
media_type: typeof GaiaXCredentialMediaType.VcJwt;
|
|
33
|
+
format: typeof GaiaXCredentialAttachmentFormat;
|
|
34
|
+
role: GaiaXCredentialAttachmentRoleValue;
|
|
35
|
+
data: {
|
|
36
|
+
json: {
|
|
37
|
+
jwt: string;
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/** Cache metadata kept next to a resolved artifact, never inside that artifact. */
|
|
42
|
+
export interface IcaDiscoveryArtifactMeta {
|
|
43
|
+
sourceUrl?: string;
|
|
44
|
+
fetchedAt: string;
|
|
45
|
+
sourceUpdatedAt?: string;
|
|
46
|
+
verifiedAt?: string;
|
|
47
|
+
expiresAt?: string;
|
|
48
|
+
etag?: string;
|
|
49
|
+
contentHash?: string;
|
|
50
|
+
}
|
|
51
|
+
/** Resolved DID document plus cache provenance, following the old document/meta split. */
|
|
52
|
+
export interface IcaDiscoveredDid {
|
|
53
|
+
document: DidDocument;
|
|
54
|
+
meta: IcaDiscoveryArtifactMeta;
|
|
55
|
+
}
|
|
56
|
+
/** Resolved DCAT document plus cache provenance. */
|
|
57
|
+
export interface IcaDiscoveredDcat {
|
|
58
|
+
document: JsonObject;
|
|
59
|
+
meta: IcaDiscoveryArtifactMeta;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* One authorized ICA member's complete discovery record.
|
|
63
|
+
*
|
|
64
|
+
* The VAT is intentionally not repeated at this level. Consumers obtain legal
|
|
65
|
+
* identifiers from the authoritative schema.org OrganizationCredential in
|
|
66
|
+
* `vc[0].credentialSubject.taxID` (or the versioned equivalent). `attachments`
|
|
67
|
+
* contains exact Gaia-X VC-JWT artifacts, while `did.document` and
|
|
68
|
+
* `dcat.document` make discovery possible without a second host request.
|
|
69
|
+
*/
|
|
70
|
+
export interface IcaMemberDiscoveryData {
|
|
71
|
+
id: string;
|
|
72
|
+
vc: JsonObject[];
|
|
73
|
+
did: IcaDiscoveredDid;
|
|
74
|
+
attachments: GaiaXVcJwtAttachment[];
|
|
75
|
+
dcat?: IcaDiscoveredDcat;
|
|
76
|
+
meta?: {
|
|
77
|
+
assembledAt: string;
|
|
78
|
+
refreshAfter?: string;
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/** DIDComm/JSON:API-compatible body returned by ICA member autodiscovery. */
|
|
82
|
+
export interface IcaMemberDiscoveryBody {
|
|
83
|
+
data: IcaMemberDiscoveryData[];
|
|
84
|
+
meta: {
|
|
85
|
+
generatedAt: string;
|
|
86
|
+
maxAgeSeconds?: number;
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
export interface GaiaXLegalPersonCredentialSubject extends JsonObject {
|
|
90
|
+
id: string;
|
|
91
|
+
type: 'gx:LegalPerson';
|
|
92
|
+
'gx:legalName': string;
|
|
93
|
+
'gx:legalRegistrationNumber': {
|
|
94
|
+
id: string;
|
|
95
|
+
};
|
|
96
|
+
'gx:headquarterAddress': {
|
|
97
|
+
'gx:countrySubdivisionCode': string;
|
|
98
|
+
} | {
|
|
99
|
+
'gx:countryCode': string;
|
|
100
|
+
};
|
|
101
|
+
'gx:legalAddress': {
|
|
102
|
+
'gx:countrySubdivisionCode': string;
|
|
103
|
+
} | {
|
|
104
|
+
'gx:countryCode': string;
|
|
105
|
+
};
|
|
106
|
+
'gx:website'?: string;
|
|
107
|
+
}
|
|
108
|
+
export interface GaiaXServiceOfferingCredentialSubject extends JsonObject {
|
|
109
|
+
id: string;
|
|
110
|
+
type: 'gx:ServiceOffering';
|
|
111
|
+
'gx:providedBy': {
|
|
112
|
+
id: string;
|
|
113
|
+
};
|
|
114
|
+
'gx:serviceOfferingTermsAndConditions': Array<{
|
|
115
|
+
'gx:url': string;
|
|
116
|
+
'gx:hash': string;
|
|
117
|
+
}>;
|
|
118
|
+
'gx:name'?: string;
|
|
119
|
+
'gx:description'?: string;
|
|
120
|
+
'gx:endpoint'?: Array<{
|
|
121
|
+
'gx:endpointURL': string;
|
|
122
|
+
}>;
|
|
123
|
+
}
|
|
124
|
+
/** Unsigned VC Data Model 2.0 draft. Signing and VC-JWT encoding belong to the GW. */
|
|
125
|
+
export interface GaiaXCredentialDraft<TSubject extends JsonObject> extends JsonObject {
|
|
126
|
+
'@context': ['https://www.w3.org/ns/credentials/v2'];
|
|
127
|
+
type: ['VerifiableCredential', 'LegalPerson' | 'ServiceOffering'];
|
|
128
|
+
id: string;
|
|
129
|
+
issuer: string;
|
|
130
|
+
validFrom: string;
|
|
131
|
+
credentialSubject: TSubject;
|
|
132
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// Copyright 2026 Antifraud Services Inc. under the Apache License, Version 2.0.
|
|
2
|
+
/** Versioned Gaia-X profile targeted by the schema.org semantic projection. */
|
|
3
|
+
export const GaiaXProfile = Object.freeze({
|
|
4
|
+
Icam2511: 'icam-25.11',
|
|
5
|
+
});
|
|
6
|
+
/** Media types used to transport signed Gaia-X credentials without decoding them. */
|
|
7
|
+
export const GaiaXCredentialMediaType = Object.freeze({
|
|
8
|
+
VcJwt: 'application/vc+jwt',
|
|
9
|
+
});
|
|
10
|
+
/** DIDComm attachment format identifier used by the existing ICA contract. */
|
|
11
|
+
export const GaiaXCredentialAttachmentFormat = 'vc+jwt';
|
|
12
|
+
/**
|
|
13
|
+
* Semantic roles for Gaia-X VC-JWT attachments in an ICA member aggregate.
|
|
14
|
+
*
|
|
15
|
+
* `Participant` is deliberately first in a member's `attachments[]`. It is the
|
|
16
|
+
* Gaia-X legal-entity projection corresponding to the same organization
|
|
17
|
+
* represented by the first schema.org `OrganizationCredential` in `vc[]`.
|
|
18
|
+
* They are different signed credentials and MUST NOT be treated as bytewise or
|
|
19
|
+
* schema-equivalent copies.
|
|
20
|
+
*/
|
|
21
|
+
export const GaiaXCredentialAttachmentRole = Object.freeze({
|
|
22
|
+
Participant: 'gaia-x-participant-vc-jwt',
|
|
23
|
+
LegalRegistrationNumber: 'gaia-x-legal-registration-number-vc-jwt',
|
|
24
|
+
TermsAndConditions: 'gaia-x-terms-and-conditions-vc-jwt',
|
|
25
|
+
ServiceOffering: 'gaia-x-service-offering-vc-jwt',
|
|
26
|
+
});
|
package/dist/models/index.d.ts
CHANGED
|
@@ -21,6 +21,7 @@ export * from './dataspace-protocol';
|
|
|
21
21
|
export * from './device-license';
|
|
22
22
|
export * from './did';
|
|
23
23
|
export * from './fhir-documents';
|
|
24
|
+
export * from './gaia-x';
|
|
24
25
|
export * from './interoperable-claims';
|
|
25
26
|
export * from './indexing';
|
|
26
27
|
export * from './identity-bootstrap';
|
|
@@ -46,6 +47,7 @@ export * from './permission-templates';
|
|
|
46
47
|
export * from './resource-document';
|
|
47
48
|
export * from './relationship-access';
|
|
48
49
|
export * from './response';
|
|
50
|
+
export * from './subject-identifier-ledger';
|
|
49
51
|
export * from './urlPath';
|
|
50
52
|
export * from './verifiable-credential';
|
|
51
53
|
export * from './wallet';
|
package/dist/models/index.js
CHANGED
|
@@ -21,6 +21,7 @@ export * from './dataspace-protocol.js';
|
|
|
21
21
|
export * from './device-license.js';
|
|
22
22
|
export * from './did.js';
|
|
23
23
|
export * from './fhir-documents.js';
|
|
24
|
+
export * from './gaia-x.js';
|
|
24
25
|
export * from './interoperable-claims.js';
|
|
25
26
|
export * from './indexing.js';
|
|
26
27
|
export * from './identity-bootstrap.js';
|
|
@@ -46,6 +47,7 @@ export * from './permission-templates.js';
|
|
|
46
47
|
export * from './resource-document.js';
|
|
47
48
|
export * from './relationship-access.js';
|
|
48
49
|
export * from './response.js';
|
|
50
|
+
export * from './subject-identifier-ledger.js';
|
|
49
51
|
export * from './urlPath.js';
|
|
50
52
|
export * from './verifiable-credential.js';
|
|
51
53
|
export * from './wallet.js';
|
|
@@ -12,7 +12,7 @@ export declare const InvoiceClaim: {
|
|
|
12
12
|
readonly Date: "Invoice.date";
|
|
13
13
|
/** Invoice lifecycle status. Example: `issued`. */
|
|
14
14
|
readonly Status: "Invoice.status";
|
|
15
|
-
/** Subject or tenant context reference. Example: `did:web:host.example.com:health-care
|
|
15
|
+
/** Subject or tenant context reference. Example: `did:web:host.example.com:health-care:organization:taxid:VATES-B00112233:individual:multibase:zExampleIndividualId`. */
|
|
16
16
|
readonly Subject: "Invoice.subject";
|
|
17
17
|
/** Billed recipient reference. Example: `did:web:portal.example.org:billing`. */
|
|
18
18
|
readonly Recipient: "Invoice.recipient";
|
|
@@ -13,7 +13,7 @@ export const InvoiceClaim = {
|
|
|
13
13
|
Date: 'Invoice.date',
|
|
14
14
|
/** Invoice lifecycle status. Example: `issued`. */
|
|
15
15
|
Status: 'Invoice.status',
|
|
16
|
-
/** Subject or tenant context reference. Example: `did:web:host.example.com:health-care
|
|
16
|
+
/** Subject or tenant context reference. Example: `did:web:host.example.com:health-care:organization:taxid:VATES-B00112233:individual:multibase:zExampleIndividualId`. */
|
|
17
17
|
Subject: 'Invoice.subject',
|
|
18
18
|
/** Billed recipient reference. Example: `did:web:portal.example.org:billing`. */
|
|
19
19
|
Recipient: 'Invoice.recipient',
|
|
@@ -156,7 +156,7 @@ export const InvoiceClaimSpecs = [
|
|
|
156
156
|
{
|
|
157
157
|
key: InvoiceClaim.Subject,
|
|
158
158
|
meaning: 'Subject or tenant context reference.',
|
|
159
|
-
example: 'did:web:host.example.com:health-care
|
|
159
|
+
example: 'did:web:host.example.com:health-care:organization:taxid:VATES-B00112233:individual:multibase:zExampleIndividualId',
|
|
160
160
|
},
|
|
161
161
|
{ key: InvoiceClaim.Recipient, meaning: 'Billed recipient reference.', example: 'did:web:portal.example.org:billing' },
|
|
162
162
|
{ key: InvoiceClaim.Issuer, meaning: 'Invoice issuer reference.', example: 'did:web:api.acme.org' },
|
|
@@ -72,7 +72,7 @@ export declare const ObservationClaim: {
|
|
|
72
72
|
readonly Language: "Observation.language";
|
|
73
73
|
/** Observation method token. Example: `http://snomed.info/sct|252465000`. */
|
|
74
74
|
readonly Method: "Observation.method";
|
|
75
|
-
/** Optional compatibility alias of `Observation.subject`. Example: `did:web:host.example.com:health-care
|
|
75
|
+
/** Optional compatibility alias of `Observation.subject`. Example: `did:web:host.example.com:health-care:organization:taxid:VATES-B00112233:individual:multibase:zExampleIndividualId`. */
|
|
76
76
|
readonly Patient: "Observation.patient";
|
|
77
77
|
/** Performer reference list. Example: `Practitioner/prac-1`. */
|
|
78
78
|
readonly Performer: "Observation.performer";
|
|
@@ -80,7 +80,7 @@ export declare const ObservationClaim: {
|
|
|
80
80
|
readonly Specimen: "Observation.specimen";
|
|
81
81
|
/** Observation status. Presence marks one visible/searchable main observation. Example: `final`. */
|
|
82
82
|
readonly Status: "Observation.status";
|
|
83
|
-
/** Canonical subject reference. Example: `did:web:host.example.com:health-care
|
|
83
|
+
/** Canonical subject reference. Example: `did:web:host.example.com:health-care:organization:taxid:VATES-B00112233:individual:multibase:zExampleIndividualId`. */
|
|
84
84
|
readonly Subject: "Observation.subject";
|
|
85
85
|
/** Value as coded concept token. Example: `http://terminology.hl7.org/CodeSystem/data-absent-reason|not-performed`. */
|
|
86
86
|
readonly ValueConcept: "Observation.value-concept";
|
|
@@ -74,7 +74,7 @@ export const ObservationClaim = {
|
|
|
74
74
|
Language: 'Observation.language',
|
|
75
75
|
/** Observation method token. Example: `http://snomed.info/sct|252465000`. */
|
|
76
76
|
Method: 'Observation.method',
|
|
77
|
-
/** Optional compatibility alias of `Observation.subject`. Example: `did:web:host.example.com:health-care
|
|
77
|
+
/** Optional compatibility alias of `Observation.subject`. Example: `did:web:host.example.com:health-care:organization:taxid:VATES-B00112233:individual:multibase:zExampleIndividualId`. */
|
|
78
78
|
Patient: 'Observation.patient',
|
|
79
79
|
/** Performer reference list. Example: `Practitioner/prac-1`. */
|
|
80
80
|
Performer: 'Observation.performer',
|
|
@@ -82,7 +82,7 @@ export const ObservationClaim = {
|
|
|
82
82
|
Specimen: 'Observation.specimen',
|
|
83
83
|
/** Observation status. Presence marks one visible/searchable main observation. Example: `final`. */
|
|
84
84
|
Status: 'Observation.status',
|
|
85
|
-
/** Canonical subject reference. Example: `did:web:host.example.com:health-care
|
|
85
|
+
/** Canonical subject reference. Example: `did:web:host.example.com:health-care:organization:taxid:VATES-B00112233:individual:multibase:zExampleIndividualId`. */
|
|
86
86
|
Subject: 'Observation.subject',
|
|
87
87
|
/** Value as coded concept token. Example: `http://terminology.hl7.org/CodeSystem/data-absent-reason|not-performed`. */
|
|
88
88
|
ValueConcept: 'Observation.value-concept',
|
package/dist/models/jwe.d.ts
CHANGED
|
@@ -16,6 +16,12 @@ export interface ProtectedHeadersJWE {
|
|
|
16
16
|
kid?: string;
|
|
17
17
|
skid?: string;
|
|
18
18
|
zip?: string;
|
|
19
|
+
/** Versioned private profile while the JOSE ML-KEM binding remains an IETF draft. */
|
|
20
|
+
gdc_pq_profile?: 'confidential-pqc-v1';
|
|
21
|
+
/** Domain-separated purpose for storage envelopes. */
|
|
22
|
+
gdc_key_purpose?: 'document-at-rest';
|
|
23
|
+
/** Non-reversible binding to the profile/tenant storage owner. */
|
|
24
|
+
gdc_owner_binding?: string;
|
|
19
25
|
}
|
|
20
26
|
/**
|
|
21
27
|
* Unprotected headers that are not integrity protected.
|
|
@@ -33,6 +39,25 @@ export interface RecipientDataJWE {
|
|
|
33
39
|
kid: string;
|
|
34
40
|
};
|
|
35
41
|
}
|
|
42
|
+
/**
|
|
43
|
+
* Opaque recipient payload carried by JWE `encrypted_key` for
|
|
44
|
+
* `confidential-pqc-v1`.
|
|
45
|
+
*
|
|
46
|
+
* The content is encrypted once with a random AES-256-GCM CEK. ML-KEM derives
|
|
47
|
+
* a recipient KEK, and that KEK protects the CEK with AES-256-GCM. Keeping the
|
|
48
|
+
* CEK distinct from the KEM shared secret makes a future General JWE
|
|
49
|
+
* multi-recipient profile possible without re-encrypting the document.
|
|
50
|
+
*/
|
|
51
|
+
export interface MlKemWrappedCekV1 {
|
|
52
|
+
v: 'gdc-mlkem-cek-wrap-v1';
|
|
53
|
+
kem: 'ML-KEM-768';
|
|
54
|
+
kdf: 'HKDF-SHA-256';
|
|
55
|
+
wrap: 'A256GCM';
|
|
56
|
+
kemCiphertext: string;
|
|
57
|
+
iv: string;
|
|
58
|
+
ciphertext: string;
|
|
59
|
+
tag: string;
|
|
60
|
+
}
|
|
36
61
|
/**
|
|
37
62
|
* Represents the protected (integrity-protected) header of a JWE.
|
|
38
63
|
* These parameters are combined with the AAD (Additional Authenticated Data)
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** Public provider pointer stored for one opaque subject-identifier asset. */
|
|
2
|
+
export type SubjectIdentifierProviderPointer = Readonly<{
|
|
3
|
+
identifier: Readonly<{
|
|
4
|
+
value: string;
|
|
5
|
+
}>;
|
|
6
|
+
/** Bare DNS domain: no URL scheme, path, DID or tenant identifier. */
|
|
7
|
+
url: string;
|
|
8
|
+
}>;
|
|
9
|
+
/** Ledger payload. It deliberately contains no subject DID or raw identifier. */
|
|
10
|
+
export type SubjectIdentifierLedgerPayload = Readonly<{
|
|
11
|
+
provider: SubjectIdentifierProviderPointer;
|
|
12
|
+
}>;
|
|
13
|
+
/** One individual/animal bundle entry expanded into one write per `sameAs` alias. */
|
|
14
|
+
export type SubjectIdentifierLedgerBundleEntry = Readonly<{
|
|
15
|
+
sameAs: string | readonly string[];
|
|
16
|
+
}>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -50,6 +50,15 @@ export declare class BundleEditor {
|
|
|
50
50
|
setBundleType(type: BundleType): this;
|
|
51
51
|
/** Returns the declared target bundle shape. */
|
|
52
52
|
getBundleType(): BundleType;
|
|
53
|
+
/**
|
|
54
|
+
* Replaces staged entries with one previously materialized JSON-API-like
|
|
55
|
+
* Bundle snapshot so a later UI session can reopen, edit or append entries.
|
|
56
|
+
*
|
|
57
|
+
* This is an in-memory authoring operation only. It does not imply that the
|
|
58
|
+
* supplied Bundle came from authoritative GW readback and it performs no
|
|
59
|
+
* Communication wrapping, submission or polling.
|
|
60
|
+
*/
|
|
61
|
+
setBundle(bundle: BundleJsonApi<BundleEntry>): this;
|
|
53
62
|
setCompositionIdentifier(identifier?: string | null): this;
|
|
54
63
|
/** Returns the normalized `Composition.identifier` staged for the future document root. */
|
|
55
64
|
getCompositionIdentifier(): string | undefined;
|