diff --git a/examples/on-the-fly/kbv-condition-diagnosis/generate.ts b/examples/on-the-fly/kbv-condition-diagnosis/generate.ts index 25652d78..e82c4115 100644 --- a/examples/on-the-fly/kbv-condition-diagnosis/generate.ts +++ b/examples/on-the-fly/kbv-condition-diagnosis/generate.ts @@ -25,9 +25,6 @@ if (require.main === module) { treeShake: { "kbv.basis": { "https://fhir.kbv.de/StructureDefinition/KBV_PR_Base_Condition_Diagnosis": {}, - // Referenced as a Condition.subject target; included so the - // reference type resolves to the profile's base resource. - "https://fhir.kbv.de/StructureDefinition/KBV_PR_Base_Patient": {}, }, }, }) diff --git a/examples/python-r4-us-core/fhir_types/hl7_fhir_us_core/profiles/observation_uscore_blood_pressure_profile.py b/examples/python-r4-us-core/fhir_types/hl7_fhir_us_core/profiles/observation_uscore_blood_pressure_profile.py index 4f810582..6ee1c5ea 100644 --- a/examples/python-r4-us-core/fhir_types/hl7_fhir_us_core/profiles/observation_uscore_blood_pressure_profile.py +++ b/examples/python-r4-us-core/fhir_types/hl7_fhir_us_core/profiles/observation_uscore_blood_pressure_profile.py @@ -397,7 +397,7 @@ def validate(self) -> dict[str, list[str]]: errors.extend(validate_reference(self._resource, profile_name, "derivedFrom", ["DocumentReference","ImagingStudy","Media","MolecularSequence","QuestionnaireResponse","Observation"])) errors.extend(validate_slice_cardinality(self._resource, profile_name, "component", {"code":{"coding":[{"system":"http://loinc.org","code":"8480-6"}]}}, "systolic", 1, 1)) errors.extend(validate_slice_cardinality(self._resource, profile_name, "component", {"code":{"coding":[{"system":"http://loinc.org","code":"8462-4"}]}}, "diastolic", 1, 1)) - errors.extend(validate_reference(self._resource, profile_name, "performer", ["PractitionerRole","USCoreCareTeam","USCoreOrganizationProfile","Patient","USCorePractitionerProfile","USCoreRelatedPersonProfile"])) + errors.extend(validate_reference(self._resource, profile_name, "performer", ["PractitionerRole","CareTeam","Organization","Patient","Practitioner","RelatedPerson"])) warnings.extend(validate_enum(self._resource, profile_name, "category", ["social-history","vital-signs","imaging","laboratory","procedure","survey","exam","therapy","activity"])) warnings.extend(validate_enum(self._resource, profile_name, "code", ["2708-6","29463-7","3140-1","3150-0","3151-8","39156-5","59408-5","59575-1","59576-9","77606-2","8287-5","8289-1","8302-2","8306-3","8310-5","8462-4","8478-0","8480-6","8867-4","9279-1","9843-4"])) warnings.extend(validate_enum(self._resource, profile_name, "dataAbsentReason", ["unknown","asked-unknown","temp-unknown","not-asked","asked-declined","masked","not-applicable","unsupported","as-text","error","not-a-number","negative-infinity","positive-infinity","not-performed","not-permitted"])) diff --git a/examples/python-r4-us-core/fhir_types/hl7_fhir_us_core/profiles/observation_uscore_body_weight_profile.py b/examples/python-r4-us-core/fhir_types/hl7_fhir_us_core/profiles/observation_uscore_body_weight_profile.py index f67d63dc..00254658 100644 --- a/examples/python-r4-us-core/fhir_types/hl7_fhir_us_core/profiles/observation_uscore_body_weight_profile.py +++ b/examples/python-r4-us-core/fhir_types/hl7_fhir_us_core/profiles/observation_uscore_body_weight_profile.py @@ -225,7 +225,7 @@ def validate(self) -> dict[str, list[str]]: errors.extend(validate_choice_required(self._resource, profile_name, ["effectiveDateTime","effectivePeriod"])) errors.extend(validate_reference(self._resource, profile_name, "hasMember", ["MolecularSequence","QuestionnaireResponse","Observation"])) errors.extend(validate_reference(self._resource, profile_name, "derivedFrom", ["DocumentReference","ImagingStudy","Media","MolecularSequence","QuestionnaireResponse","Observation"])) - errors.extend(validate_reference(self._resource, profile_name, "performer", ["PractitionerRole","USCoreCareTeam","USCoreOrganizationProfile","Patient","USCorePractitionerProfile","USCoreRelatedPersonProfile"])) + errors.extend(validate_reference(self._resource, profile_name, "performer", ["PractitionerRole","CareTeam","Organization","Patient","Practitioner","RelatedPerson"])) errors.extend(validate_excluded(self._resource, profile_name, "valueCodeableConcept")) errors.extend(validate_excluded(self._resource, profile_name, "valueString")) errors.extend(validate_excluded(self._resource, profile_name, "valueBoolean")) diff --git a/examples/python-r4-us-core/fhir_types/hl7_fhir_us_core/profiles/observation_uscore_vital_signs_profile.py b/examples/python-r4-us-core/fhir_types/hl7_fhir_us_core/profiles/observation_uscore_vital_signs_profile.py index 7702ff04..bbbbb9e3 100644 --- a/examples/python-r4-us-core/fhir_types/hl7_fhir_us_core/profiles/observation_uscore_vital_signs_profile.py +++ b/examples/python-r4-us-core/fhir_types/hl7_fhir_us_core/profiles/observation_uscore_vital_signs_profile.py @@ -334,7 +334,7 @@ def validate(self) -> dict[str, list[str]]: errors.extend(validate_choice_required(self._resource, profile_name, ["effectiveDateTime","effectivePeriod"])) errors.extend(validate_reference(self._resource, profile_name, "hasMember", ["MolecularSequence","QuestionnaireResponse","Observation"])) errors.extend(validate_reference(self._resource, profile_name, "derivedFrom", ["DocumentReference","ImagingStudy","Media","MolecularSequence","QuestionnaireResponse","Observation"])) - errors.extend(validate_reference(self._resource, profile_name, "performer", ["PractitionerRole","USCoreCareTeam","USCoreOrganizationProfile","Patient","USCorePractitionerProfile","USCoreRelatedPersonProfile"])) + errors.extend(validate_reference(self._resource, profile_name, "performer", ["PractitionerRole","CareTeam","Organization","Patient","Practitioner","RelatedPerson"])) warnings.extend(validate_enum(self._resource, profile_name, "category", ["social-history","vital-signs","imaging","laboratory","procedure","survey","exam","therapy","activity"])) warnings.extend(validate_enum(self._resource, profile_name, "code", ["2708-6","29463-7","3140-1","3150-0","3151-8","39156-5","59408-5","59575-1","59576-9","77606-2","8287-5","8289-1","8302-2","8306-3","8310-5","8462-4","8478-0","8480-6","8867-4","9279-1","9843-4"])) warnings.extend(validate_enum(self._resource, profile_name, "dataAbsentReason", ["unknown","asked-unknown","temp-unknown","not-asked","asked-declined","masked","not-applicable","unsupported","as-text","error","not-a-number","negative-infinity","positive-infinity","not-performed","not-permitted"])) diff --git a/examples/typescript-r4-us-core/fhir-types/hl7-fhir-us-core/profiles/Observation_USCoreBloodPressureProfile.ts b/examples/typescript-r4-us-core/fhir-types/hl7-fhir-us-core/profiles/Observation_USCoreBloodPressureProfile.ts index cf2750a7..00d1bf70 100644 --- a/examples/typescript-r4-us-core/fhir-types/hl7-fhir-us-core/profiles/Observation_USCoreBloodPressureProfile.ts +++ b/examples/typescript-r4-us-core/fhir-types/hl7-fhir-us-core/profiles/Observation_USCoreBloodPressureProfile.ts @@ -417,7 +417,7 @@ export class USCoreBloodPressureProfile { ...validateSliceFields(res, profileName, "component", {"code":{"coding":[{"system":"http://loinc.org","code":"8480-6"}]}}, "systolic", ["valueQuantity"]), ...validateSliceCardinality(res, profileName, "component", {"code":{"coding":[{"system":"http://loinc.org","code":"8462-4"}]}}, "diastolic", 1, 1), ...validateSliceFields(res, profileName, "component", {"code":{"coding":[{"system":"http://loinc.org","code":"8462-4"}]}}, "diastolic", ["valueQuantity"]), - ...validateReference(res, profileName, "performer", ["PractitionerRole","USCoreCareTeam","USCoreOrganizationProfile","Patient","USCorePractitionerProfile","USCoreRelatedPersonProfile"]), + ...validateReference(res, profileName, "performer", ["PractitionerRole","CareTeam","Organization","Patient","Practitioner","RelatedPerson"]), ], warnings: [ ...validateEnum(res, profileName, "category", ["social-history","vital-signs","imaging","laboratory","procedure","survey","exam","therapy","activity"]), diff --git a/examples/typescript-r4-us-core/fhir-types/hl7-fhir-us-core/profiles/Observation_USCoreBodyWeightProfile.ts b/examples/typescript-r4-us-core/fhir-types/hl7-fhir-us-core/profiles/Observation_USCoreBodyWeightProfile.ts index 9b31b34c..781a0f11 100644 --- a/examples/typescript-r4-us-core/fhir-types/hl7-fhir-us-core/profiles/Observation_USCoreBodyWeightProfile.ts +++ b/examples/typescript-r4-us-core/fhir-types/hl7-fhir-us-core/profiles/Observation_USCoreBodyWeightProfile.ts @@ -332,7 +332,7 @@ export class USCoreBodyWeightProfile { ...validateChoiceProhibited(res, profileName, ["effectiveTiming","effectiveInstant"]), ...validateReference(res, profileName, "hasMember", ["MolecularSequence","QuestionnaireResponse","Observation"]), ...validateReference(res, profileName, "derivedFrom", ["DocumentReference","ImagingStudy","Media","MolecularSequence","QuestionnaireResponse","Observation"]), - ...validateReference(res, profileName, "performer", ["PractitionerRole","USCoreCareTeam","USCoreOrganizationProfile","Patient","USCorePractitionerProfile","USCoreRelatedPersonProfile"]), + ...validateReference(res, profileName, "performer", ["PractitionerRole","CareTeam","Organization","Patient","Practitioner","RelatedPerson"]), ...validateChoiceProhibited(res, profileName, ["valueCodeableConcept","valueString","valueBoolean","valueInteger","valueRange","valueRatio","valueSampledData","valueTime","valueDateTime","valuePeriod"]), ], warnings: [ diff --git a/examples/typescript-r4-us-core/fhir-types/hl7-fhir-us-core/profiles/Observation_USCoreVitalSignsProfile.ts b/examples/typescript-r4-us-core/fhir-types/hl7-fhir-us-core/profiles/Observation_USCoreVitalSignsProfile.ts index 38c052e2..2ce509e3 100644 --- a/examples/typescript-r4-us-core/fhir-types/hl7-fhir-us-core/profiles/Observation_USCoreVitalSignsProfile.ts +++ b/examples/typescript-r4-us-core/fhir-types/hl7-fhir-us-core/profiles/Observation_USCoreVitalSignsProfile.ts @@ -335,7 +335,7 @@ export class USCoreVitalSignsProfile { ...validateChoiceProhibited(res, profileName, ["effectiveTiming","effectiveInstant"]), ...validateReference(res, profileName, "hasMember", ["MolecularSequence","QuestionnaireResponse","Observation"]), ...validateReference(res, profileName, "derivedFrom", ["DocumentReference","ImagingStudy","Media","MolecularSequence","QuestionnaireResponse","Observation"]), - ...validateReference(res, profileName, "performer", ["PractitionerRole","USCoreCareTeam","USCoreOrganizationProfile","Patient","USCorePractitionerProfile","USCoreRelatedPersonProfile"]), + ...validateReference(res, profileName, "performer", ["PractitionerRole","CareTeam","Organization","Patient","Practitioner","RelatedPerson"]), ], warnings: [ ...validateEnum(res, profileName, "category", ["social-history","vital-signs","imaging","laboratory","procedure","survey","exam","therapy","activity"]), diff --git a/src/api/writer-generator/python/profile-validation.ts b/src/api/writer-generator/python/profile-validation.ts index 9c02b1bc..6e4b8004 100644 --- a/src/api/writer-generator/python/profile-validation.ts +++ b/src/api/writer-generator/python/profile-validation.ts @@ -76,9 +76,9 @@ export const collectValidateBody = ( `warnings.extend(validate_must_support(self._resource, profile_name, ${JSON.stringify(pyName)}))`, ); } - if (field.reference && field.reference.length > 0) { + if (field.reference && field.reference.resource.length > 0) { helpers.add("validate_reference"); - const allowed = field.reference.map((ref) => resolveRef(ref).name); + const allowed = field.reference.resource.map((ref) => resolveRef(ref).name); errorLines.push( `errors.extend(validate_reference(self._resource, profile_name, ${JSON.stringify(pyName)}, ${JSON.stringify(allowed)}))`, ); diff --git a/src/api/writer-generator/typescript/profile-validation.ts b/src/api/writer-generator/typescript/profile-validation.ts index 1fd48921..0423af78 100644 --- a/src/api/writer-generator/typescript/profile-validation.ts +++ b/src/api/writer-generator/typescript/profile-validation.ts @@ -42,9 +42,9 @@ export const collectRegularFieldValidation = ( if (field.mustSupport && !field.required) warnings.push(`...validateMustSupport(res, profileName, ${JSON.stringify(name)})`); - if (field.reference && field.reference.length > 0) + if (field.reference && field.reference.resource.length > 0) errors.push( - `...validateReference(res, profileName, ${JSON.stringify(name)}, ${JSON.stringify(field.reference.map((ref) => resolveRef(ref).name))})`, + `...validateReference(res, profileName, ${JSON.stringify(name)}, ${JSON.stringify(field.reference.resource.map((ref) => resolveRef(ref).name))})`, ); if (field.slicing?.slices) { diff --git a/src/api/writer-generator/typescript/utils.ts b/src/api/writer-generator/typescript/utils.ts index 7c5420d5..fc9ab91a 100644 --- a/src/api/writer-generator/typescript/utils.ts +++ b/src/api/writer-generator/typescript/utils.ts @@ -79,8 +79,8 @@ export const resolveFieldTsType = ( if (field.type.name === "CodeableConcept") return `CodeableConcept<${tsEnumType(field.enum)}>`; return tsEnumType(field.enum); } - if (field.reference && field.reference.length > 0) { - const resolved = field.reference.map((ref) => (resolveRef ? resolveRef(ref) : ref)); + if (field.reference && field.reference.resource.length > 0) { + const resolved = field.reference.resource.map((ref) => (resolveRef ? resolveRef(ref) : ref)); const references = resolved .map((ref) => (isFamilyType?.(ref) ? `string /* ${ref.name} */` : `"${ref.name}"`)) .join(" | "); diff --git a/src/typeschema/core/field-builder.ts b/src/typeschema/core/field-builder.ts index 984e178c..18b9d286 100644 --- a/src/typeschema/core/field-builder.ts +++ b/src/typeschema/core/field-builder.ts @@ -7,15 +7,17 @@ import type { FHIRCoding, FHIRSchemaDiscriminator, FHIRSchemaElement } from "@atomic-ehr/fhirschema"; import type { Register } from "@root/typeschema/register"; import type { CodegenLog } from "@root/utils/log"; -import { packageMetaToFhir } from "@typeschema/types"; +import { isProfileIdentifier, packageMetaToFhir } from "@typeschema/types"; import type { BindingIdentifier, EnumDefinition, Field, + FieldReference, FieldSlice, FieldSlicing, Name, PackageMeta, + ProfileIdentifier, RegularField, RichFHIRSchema, TypeIdentifier, @@ -90,18 +92,37 @@ function isExcluded(register: Register, fhirSchema: RichFHIRSchema, path: string return new Set(requires).has(fieldName); } +/** Resolve reference targets into two independent facts: `resource` — the base + * resource types a reference literal may point at (profiles resolve to their + * base specialization, deduped) — and `profiles` — the profile conformance + * expectations, preserved for profile-aware consumers. */ const buildReferences = ( register: Register, fhirSchema: RichFHIRSchema, element: FHIRSchemaElement, -): TypeIdentifier[] | undefined => { +): FieldReference | undefined => { if (!element.refers) return undefined; - return element.refers.map((ref) => { + const resource: TypeIdentifier[] = []; + const profiles: ProfileIdentifier[] = []; + const seen = new Set(); + for (const ref of element.refers) { const curl = register.ensureSpecializationCanonicalUrl(ref as Name); const fs = register.resolveFs(fhirSchema.package_meta, curl); if (!fs) throw new Error(`Failed to resolve fs for ${curl}`); - return mkIdentifier(fs); - }); + const id = mkIdentifier(fs); + let resolved: TypeIdentifier = id; + if (isProfileIdentifier(id)) { + profiles.push(id); + const baseFs = register.resolveFsSpecializations(fs.package_meta, fs.url)[0]; + if (!baseFs) throw new Error(`Failed to resolve base specialization for ${curl}`); + resolved = mkIdentifier(baseFs); + } + if (!seen.has(resolved.url)) { + seen.add(resolved.url); + resource.push(resolved); + } + } + return { resource, profiles: profiles.length > 0 ? profiles : undefined }; }; const extractSliceFieldNames = (schema: FHIRSchemaElement): Pick => { diff --git a/src/typeschema/types.ts b/src/typeschema/types.ts index 81220182..2a163a22 100644 --- a/src/typeschema/types.ts +++ b/src/typeschema/types.ts @@ -370,9 +370,14 @@ export type LogicalTypeSchema = { identifier: LogicalIdentifier } & Specializati export type SpecializationTypeSchema = ResourceTypeSchema | ComplexTypeTypeSchema | LogicalTypeSchema; +export type FieldReference = { + resource: TypeIdentifier[]; + profiles?: ProfileIdentifier[]; +}; + export interface RegularField { type: TypeIdentifier; - reference?: TypeIdentifier[]; + reference?: FieldReference; required?: boolean; excluded?: boolean; array?: boolean; @@ -401,7 +406,7 @@ export interface ChoiceFieldInstance { required?: boolean; excluded?: boolean; array?: boolean; - reference?: TypeIdentifier[]; + reference?: FieldReference; binding?: BindingIdentifier; enum?: EnumDefinition; min?: number; diff --git a/test/api/write-generator/__snapshots__/introspection.test.ts.snap b/test/api/write-generator/__snapshots__/introspection.test.ts.snap index 36407f54..90ec2fa4 100644 --- a/test/api/write-generator/__snapshots__/introspection.test.ts.snap +++ b/test/api/write-generator/__snapshots__/introspection.test.ts.snap @@ -2608,9 +2608,9 @@ exports[`IntrospectionWriter - TypeSchema output Check all introspection data in {"identifier":{"kind":"complex-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Narrative","url":"http://hl7.org/fhir/StructureDefinition/Narrative"},"base":{"kind":"complex-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Element","url":"http://hl7.org/fhir/StructureDefinition/Element"},"fields":{"status":{"type":{"kind":"primitive-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"code","url":"http://hl7.org/fhir/StructureDefinition/code"},"required":true,"excluded":false,"array":false,"binding":{"kind":"binding","package":"shared","version":"1.0.0","name":"NarrativeStatus","url":"urn:fhir:binding:NarrativeStatus"},"enum":{"isOpen":false,"values":["generated","extensions","additional","empty"]}},"div":{"type":{"kind":"primitive-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"xhtml","url":"http://hl7.org/fhir/StructureDefinition/xhtml"},"required":true,"excluded":false,"array":false}},"description":"Base StructureDefinition for Narrative Type: A human-readable summary of the resource conveying the essential clinical and business information for the resource.","dependencies":[{"kind":"primitive-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"code","url":"http://hl7.org/fhir/StructureDefinition/code"},{"kind":"complex-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Element","url":"http://hl7.org/fhir/StructureDefinition/Element"},{"kind":"primitive-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"xhtml","url":"http://hl7.org/fhir/StructureDefinition/xhtml"},{"kind":"binding","package":"shared","version":"1.0.0","name":"NarrativeStatus","url":"urn:fhir:binding:NarrativeStatus"}]} {"identifier":{"kind":"resource","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Resource","url":"http://hl7.org/fhir/StructureDefinition/Resource"},"fields":{"id":{"type":{"kind":"primitive-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"string","url":"http://hl7.org/fhir/StructureDefinition/string"},"required":false,"excluded":false,"array":false},"meta":{"type":{"kind":"complex-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Meta","url":"http://hl7.org/fhir/StructureDefinition/Meta"},"required":false,"excluded":false,"array":false},"implicitRules":{"type":{"kind":"primitive-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"uri","url":"http://hl7.org/fhir/StructureDefinition/uri"},"required":false,"excluded":false,"array":false},"language":{"type":{"kind":"primitive-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"code","url":"http://hl7.org/fhir/StructureDefinition/code"},"required":false,"excluded":false,"array":false,"binding":{"kind":"binding","package":"shared","version":"1.0.0","name":"Language","url":"urn:fhir:binding:Language"},"enum":{"isOpen":true,"values":["ar","bn","cs","da","de","de-AT","de-CH","de-DE","el","en","en-AU","en-CA","en-GB","en-IN","en-NZ","en-SG","en-US","es","es-AR","es-ES","es-UY","fi","fr","fr-BE","fr-CH","fr-FR","fy","fy-NL","hi","hr","it","it-CH","it-IT","ja","ko","nl","nl-BE","nl-NL","no","no-NO","pa","pl","pt","pt-BR","ru","ru-RU","sr","sr-RS","sv","sv-SE","te","zh","zh-CN","zh-HK","zh-SG","zh-TW"]}}},"description":"This is the base resource type for everything.","dependencies":[{"kind":"primitive-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"code","url":"http://hl7.org/fhir/StructureDefinition/code"},{"kind":"complex-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Meta","url":"http://hl7.org/fhir/StructureDefinition/Meta"},{"kind":"primitive-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"string","url":"http://hl7.org/fhir/StructureDefinition/string"},{"kind":"primitive-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"uri","url":"http://hl7.org/fhir/StructureDefinition/uri"},{"kind":"binding","package":"shared","version":"1.0.0","name":"Language","url":"urn:fhir:binding:Language"}],"typeFamily":{"resources":[{"kind":"resource","package":"hl7.fhir.r4.core","version":"4.0.1","name":"DomainResource","url":"http://hl7.org/fhir/StructureDefinition/DomainResource"},{"kind":"resource","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Bundle","url":"http://hl7.org/fhir/StructureDefinition/Bundle"},{"kind":"resource","package":"hl7.fhir.r4.core","version":"4.0.1","name":"OperationOutcome","url":"http://hl7.org/fhir/StructureDefinition/OperationOutcome"}]}} {"identifier":{"kind":"primitive-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"decimal","url":"http://hl7.org/fhir/StructureDefinition/decimal"},"description":"Base StructureDefinition for decimal Type: A rational number with implicit precision","base":{"kind":"complex-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Element","url":"http://hl7.org/fhir/StructureDefinition/Element"},"dependencies":[{"kind":"complex-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Element","url":"http://hl7.org/fhir/StructureDefinition/Element"}]} -{"identifier":{"kind":"complex-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Identifier","url":"http://hl7.org/fhir/StructureDefinition/Identifier"},"base":{"kind":"complex-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Element","url":"http://hl7.org/fhir/StructureDefinition/Element"},"fields":{"use":{"type":{"kind":"primitive-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"code","url":"http://hl7.org/fhir/StructureDefinition/code"},"required":false,"excluded":false,"array":false,"binding":{"kind":"binding","package":"shared","version":"1.0.0","name":"IdentifierUse","url":"urn:fhir:binding:IdentifierUse"},"enum":{"isOpen":false,"values":["usual","official","temp","secondary","old"]}},"type":{"type":{"kind":"complex-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"CodeableConcept","url":"http://hl7.org/fhir/StructureDefinition/CodeableConcept"},"required":false,"excluded":false,"array":false,"binding":{"kind":"binding","package":"shared","version":"1.0.0","name":"IdentifierType","url":"urn:fhir:binding:IdentifierType"},"enum":{"isOpen":true,"values":["DL","PPN","BRN","MR","MCN","EN","TAX","NIIP","PRN","MD","DR","ACSN","UDI","SNO","SB","PLAC","FILL","JHN"]}},"system":{"type":{"kind":"primitive-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"uri","url":"http://hl7.org/fhir/StructureDefinition/uri"},"required":false,"excluded":false,"array":false},"value":{"type":{"kind":"primitive-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"string","url":"http://hl7.org/fhir/StructureDefinition/string"},"required":false,"excluded":false,"array":false},"period":{"type":{"kind":"complex-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Period","url":"http://hl7.org/fhir/StructureDefinition/Period"},"required":false,"excluded":false,"array":false},"assigner":{"type":{"kind":"complex-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Reference","url":"http://hl7.org/fhir/StructureDefinition/Reference"},"required":false,"excluded":false,"reference":[{"kind":"resource","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Organization","url":"http://hl7.org/fhir/StructureDefinition/Organization"}],"array":false}},"description":"Base StructureDefinition for Identifier Type: An identifier - identifies some entity uniquely and unambiguously. Typically this is used for business identifiers.","dependencies":[{"kind":"primitive-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"code","url":"http://hl7.org/fhir/StructureDefinition/code"},{"kind":"complex-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"CodeableConcept","url":"http://hl7.org/fhir/StructureDefinition/CodeableConcept"},{"kind":"complex-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Element","url":"http://hl7.org/fhir/StructureDefinition/Element"},{"kind":"complex-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Period","url":"http://hl7.org/fhir/StructureDefinition/Period"},{"kind":"complex-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Reference","url":"http://hl7.org/fhir/StructureDefinition/Reference"},{"kind":"primitive-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"string","url":"http://hl7.org/fhir/StructureDefinition/string"},{"kind":"primitive-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"uri","url":"http://hl7.org/fhir/StructureDefinition/uri"},{"kind":"binding","package":"shared","version":"1.0.0","name":"IdentifierType","url":"urn:fhir:binding:IdentifierType"},{"kind":"binding","package":"shared","version":"1.0.0","name":"IdentifierUse","url":"urn:fhir:binding:IdentifierUse"}]} +{"identifier":{"kind":"complex-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Identifier","url":"http://hl7.org/fhir/StructureDefinition/Identifier"},"base":{"kind":"complex-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Element","url":"http://hl7.org/fhir/StructureDefinition/Element"},"fields":{"use":{"type":{"kind":"primitive-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"code","url":"http://hl7.org/fhir/StructureDefinition/code"},"required":false,"excluded":false,"array":false,"binding":{"kind":"binding","package":"shared","version":"1.0.0","name":"IdentifierUse","url":"urn:fhir:binding:IdentifierUse"},"enum":{"isOpen":false,"values":["usual","official","temp","secondary","old"]}},"type":{"type":{"kind":"complex-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"CodeableConcept","url":"http://hl7.org/fhir/StructureDefinition/CodeableConcept"},"required":false,"excluded":false,"array":false,"binding":{"kind":"binding","package":"shared","version":"1.0.0","name":"IdentifierType","url":"urn:fhir:binding:IdentifierType"},"enum":{"isOpen":true,"values":["DL","PPN","BRN","MR","MCN","EN","TAX","NIIP","PRN","MD","DR","ACSN","UDI","SNO","SB","PLAC","FILL","JHN"]}},"system":{"type":{"kind":"primitive-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"uri","url":"http://hl7.org/fhir/StructureDefinition/uri"},"required":false,"excluded":false,"array":false},"value":{"type":{"kind":"primitive-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"string","url":"http://hl7.org/fhir/StructureDefinition/string"},"required":false,"excluded":false,"array":false},"period":{"type":{"kind":"complex-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Period","url":"http://hl7.org/fhir/StructureDefinition/Period"},"required":false,"excluded":false,"array":false},"assigner":{"type":{"kind":"complex-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Reference","url":"http://hl7.org/fhir/StructureDefinition/Reference"},"required":false,"excluded":false,"reference":{"resource":[{"kind":"resource","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Organization","url":"http://hl7.org/fhir/StructureDefinition/Organization"}]},"array":false}},"description":"Base StructureDefinition for Identifier Type: An identifier - identifies some entity uniquely and unambiguously. Typically this is used for business identifiers.","dependencies":[{"kind":"primitive-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"code","url":"http://hl7.org/fhir/StructureDefinition/code"},{"kind":"complex-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"CodeableConcept","url":"http://hl7.org/fhir/StructureDefinition/CodeableConcept"},{"kind":"complex-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Element","url":"http://hl7.org/fhir/StructureDefinition/Element"},{"kind":"complex-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Period","url":"http://hl7.org/fhir/StructureDefinition/Period"},{"kind":"complex-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Reference","url":"http://hl7.org/fhir/StructureDefinition/Reference"},{"kind":"primitive-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"string","url":"http://hl7.org/fhir/StructureDefinition/string"},{"kind":"primitive-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"uri","url":"http://hl7.org/fhir/StructureDefinition/uri"},{"kind":"binding","package":"shared","version":"1.0.0","name":"IdentifierType","url":"urn:fhir:binding:IdentifierType"},{"kind":"binding","package":"shared","version":"1.0.0","name":"IdentifierUse","url":"urn:fhir:binding:IdentifierUse"}]} {"identifier":{"kind":"primitive-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"instant","url":"http://hl7.org/fhir/StructureDefinition/instant"},"description":"Base StructureDefinition for instant Type: An instant in time - known at least to the second","base":{"kind":"complex-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Element","url":"http://hl7.org/fhir/StructureDefinition/Element"},"dependencies":[{"kind":"complex-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Element","url":"http://hl7.org/fhir/StructureDefinition/Element"}]} -{"identifier":{"kind":"complex-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Signature","url":"http://hl7.org/fhir/StructureDefinition/Signature"},"base":{"kind":"complex-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Element","url":"http://hl7.org/fhir/StructureDefinition/Element"},"fields":{"type":{"type":{"kind":"complex-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Coding","url":"http://hl7.org/fhir/StructureDefinition/Coding"},"required":true,"excluded":false,"array":true,"min":1,"binding":{"kind":"binding","package":"shared","version":"1.0.0","name":"SignatureType","url":"urn:fhir:binding:SignatureType"},"enum":{"isOpen":true,"values":["1.2.840.10065.1.12.1.1","1.2.840.10065.1.12.1.2","1.2.840.10065.1.12.1.3","1.2.840.10065.1.12.1.4","1.2.840.10065.1.12.1.5","1.2.840.10065.1.12.1.6","1.2.840.10065.1.12.1.7","1.2.840.10065.1.12.1.8","1.2.840.10065.1.12.1.9","1.2.840.10065.1.12.1.10","1.2.840.10065.1.12.1.11","1.2.840.10065.1.12.1.12","1.2.840.10065.1.12.1.13","1.2.840.10065.1.12.1.14","1.2.840.10065.1.12.1.15","1.2.840.10065.1.12.1.16","1.2.840.10065.1.12.1.17","1.2.840.10065.1.12.1.18"]}},"when":{"type":{"kind":"primitive-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"instant","url":"http://hl7.org/fhir/StructureDefinition/instant"},"required":true,"excluded":false,"array":false},"who":{"type":{"kind":"complex-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Reference","url":"http://hl7.org/fhir/StructureDefinition/Reference"},"required":true,"excluded":false,"reference":[{"kind":"resource","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Device","url":"http://hl7.org/fhir/StructureDefinition/Device"},{"kind":"resource","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Organization","url":"http://hl7.org/fhir/StructureDefinition/Organization"},{"kind":"resource","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Patient","url":"http://hl7.org/fhir/StructureDefinition/Patient"},{"kind":"resource","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Practitioner","url":"http://hl7.org/fhir/StructureDefinition/Practitioner"},{"kind":"resource","package":"hl7.fhir.r4.core","version":"4.0.1","name":"PractitionerRole","url":"http://hl7.org/fhir/StructureDefinition/PractitionerRole"},{"kind":"resource","package":"hl7.fhir.r4.core","version":"4.0.1","name":"RelatedPerson","url":"http://hl7.org/fhir/StructureDefinition/RelatedPerson"}],"array":false},"onBehalfOf":{"type":{"kind":"complex-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Reference","url":"http://hl7.org/fhir/StructureDefinition/Reference"},"required":false,"excluded":false,"reference":[{"kind":"resource","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Device","url":"http://hl7.org/fhir/StructureDefinition/Device"},{"kind":"resource","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Organization","url":"http://hl7.org/fhir/StructureDefinition/Organization"},{"kind":"resource","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Patient","url":"http://hl7.org/fhir/StructureDefinition/Patient"},{"kind":"resource","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Practitioner","url":"http://hl7.org/fhir/StructureDefinition/Practitioner"},{"kind":"resource","package":"hl7.fhir.r4.core","version":"4.0.1","name":"PractitionerRole","url":"http://hl7.org/fhir/StructureDefinition/PractitionerRole"},{"kind":"resource","package":"hl7.fhir.r4.core","version":"4.0.1","name":"RelatedPerson","url":"http://hl7.org/fhir/StructureDefinition/RelatedPerson"}],"array":false},"targetFormat":{"type":{"kind":"primitive-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"code","url":"http://hl7.org/fhir/StructureDefinition/code"},"required":false,"excluded":false,"array":false,"binding":{"kind":"binding","package":"shared","version":"1.0.0","name":"MimeType","url":"urn:fhir:binding:MimeType"}},"sigFormat":{"type":{"kind":"primitive-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"code","url":"http://hl7.org/fhir/StructureDefinition/code"},"required":false,"excluded":false,"array":false,"binding":{"kind":"binding","package":"shared","version":"1.0.0","name":"MimeType","url":"urn:fhir:binding:MimeType"}},"data":{"type":{"kind":"primitive-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"base64Binary","url":"http://hl7.org/fhir/StructureDefinition/base64Binary"},"required":false,"excluded":false,"array":false}},"description":"Base StructureDefinition for Signature Type: A signature along with supporting context. The signature may be a digital signature that is cryptographic in nature, or some other signature acceptable to the domain. This other signature may be as simple as a graphical image representing a hand-written signature, or a signature ceremony Different signature approaches have different utilities.","dependencies":[{"kind":"primitive-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"base64Binary","url":"http://hl7.org/fhir/StructureDefinition/base64Binary"},{"kind":"primitive-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"code","url":"http://hl7.org/fhir/StructureDefinition/code"},{"kind":"complex-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Coding","url":"http://hl7.org/fhir/StructureDefinition/Coding"},{"kind":"complex-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Element","url":"http://hl7.org/fhir/StructureDefinition/Element"},{"kind":"primitive-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"instant","url":"http://hl7.org/fhir/StructureDefinition/instant"},{"kind":"complex-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Reference","url":"http://hl7.org/fhir/StructureDefinition/Reference"},{"kind":"binding","package":"shared","version":"1.0.0","name":"MimeType","url":"urn:fhir:binding:MimeType"},{"kind":"binding","package":"shared","version":"1.0.0","name":"SignatureType","url":"urn:fhir:binding:SignatureType"}]} +{"identifier":{"kind":"complex-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Signature","url":"http://hl7.org/fhir/StructureDefinition/Signature"},"base":{"kind":"complex-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Element","url":"http://hl7.org/fhir/StructureDefinition/Element"},"fields":{"type":{"type":{"kind":"complex-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Coding","url":"http://hl7.org/fhir/StructureDefinition/Coding"},"required":true,"excluded":false,"array":true,"min":1,"binding":{"kind":"binding","package":"shared","version":"1.0.0","name":"SignatureType","url":"urn:fhir:binding:SignatureType"},"enum":{"isOpen":true,"values":["1.2.840.10065.1.12.1.1","1.2.840.10065.1.12.1.2","1.2.840.10065.1.12.1.3","1.2.840.10065.1.12.1.4","1.2.840.10065.1.12.1.5","1.2.840.10065.1.12.1.6","1.2.840.10065.1.12.1.7","1.2.840.10065.1.12.1.8","1.2.840.10065.1.12.1.9","1.2.840.10065.1.12.1.10","1.2.840.10065.1.12.1.11","1.2.840.10065.1.12.1.12","1.2.840.10065.1.12.1.13","1.2.840.10065.1.12.1.14","1.2.840.10065.1.12.1.15","1.2.840.10065.1.12.1.16","1.2.840.10065.1.12.1.17","1.2.840.10065.1.12.1.18"]}},"when":{"type":{"kind":"primitive-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"instant","url":"http://hl7.org/fhir/StructureDefinition/instant"},"required":true,"excluded":false,"array":false},"who":{"type":{"kind":"complex-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Reference","url":"http://hl7.org/fhir/StructureDefinition/Reference"},"required":true,"excluded":false,"reference":{"resource":[{"kind":"resource","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Device","url":"http://hl7.org/fhir/StructureDefinition/Device"},{"kind":"resource","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Organization","url":"http://hl7.org/fhir/StructureDefinition/Organization"},{"kind":"resource","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Patient","url":"http://hl7.org/fhir/StructureDefinition/Patient"},{"kind":"resource","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Practitioner","url":"http://hl7.org/fhir/StructureDefinition/Practitioner"},{"kind":"resource","package":"hl7.fhir.r4.core","version":"4.0.1","name":"PractitionerRole","url":"http://hl7.org/fhir/StructureDefinition/PractitionerRole"},{"kind":"resource","package":"hl7.fhir.r4.core","version":"4.0.1","name":"RelatedPerson","url":"http://hl7.org/fhir/StructureDefinition/RelatedPerson"}]},"array":false},"onBehalfOf":{"type":{"kind":"complex-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Reference","url":"http://hl7.org/fhir/StructureDefinition/Reference"},"required":false,"excluded":false,"reference":{"resource":[{"kind":"resource","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Device","url":"http://hl7.org/fhir/StructureDefinition/Device"},{"kind":"resource","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Organization","url":"http://hl7.org/fhir/StructureDefinition/Organization"},{"kind":"resource","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Patient","url":"http://hl7.org/fhir/StructureDefinition/Patient"},{"kind":"resource","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Practitioner","url":"http://hl7.org/fhir/StructureDefinition/Practitioner"},{"kind":"resource","package":"hl7.fhir.r4.core","version":"4.0.1","name":"PractitionerRole","url":"http://hl7.org/fhir/StructureDefinition/PractitionerRole"},{"kind":"resource","package":"hl7.fhir.r4.core","version":"4.0.1","name":"RelatedPerson","url":"http://hl7.org/fhir/StructureDefinition/RelatedPerson"}]},"array":false},"targetFormat":{"type":{"kind":"primitive-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"code","url":"http://hl7.org/fhir/StructureDefinition/code"},"required":false,"excluded":false,"array":false,"binding":{"kind":"binding","package":"shared","version":"1.0.0","name":"MimeType","url":"urn:fhir:binding:MimeType"}},"sigFormat":{"type":{"kind":"primitive-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"code","url":"http://hl7.org/fhir/StructureDefinition/code"},"required":false,"excluded":false,"array":false,"binding":{"kind":"binding","package":"shared","version":"1.0.0","name":"MimeType","url":"urn:fhir:binding:MimeType"}},"data":{"type":{"kind":"primitive-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"base64Binary","url":"http://hl7.org/fhir/StructureDefinition/base64Binary"},"required":false,"excluded":false,"array":false}},"description":"Base StructureDefinition for Signature Type: A signature along with supporting context. The signature may be a digital signature that is cryptographic in nature, or some other signature acceptable to the domain. This other signature may be as simple as a graphical image representing a hand-written signature, or a signature ceremony Different signature approaches have different utilities.","dependencies":[{"kind":"primitive-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"base64Binary","url":"http://hl7.org/fhir/StructureDefinition/base64Binary"},{"kind":"primitive-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"code","url":"http://hl7.org/fhir/StructureDefinition/code"},{"kind":"complex-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Coding","url":"http://hl7.org/fhir/StructureDefinition/Coding"},{"kind":"complex-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Element","url":"http://hl7.org/fhir/StructureDefinition/Element"},{"kind":"primitive-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"instant","url":"http://hl7.org/fhir/StructureDefinition/instant"},{"kind":"complex-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Reference","url":"http://hl7.org/fhir/StructureDefinition/Reference"},{"kind":"binding","package":"shared","version":"1.0.0","name":"MimeType","url":"urn:fhir:binding:MimeType"},{"kind":"binding","package":"shared","version":"1.0.0","name":"SignatureType","url":"urn:fhir:binding:SignatureType"}]} {"identifier":{"kind":"primitive-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"unsignedInt","url":"http://hl7.org/fhir/StructureDefinition/unsignedInt"},"description":"Base StructureDefinition for unsignedInt type: An integer with a value that is not negative (e.g. >= 0)","base":{"kind":"primitive-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"integer","url":"http://hl7.org/fhir/StructureDefinition/integer"},"dependencies":[{"kind":"primitive-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"integer","url":"http://hl7.org/fhir/StructureDefinition/integer"}]} {"identifier":{"kind":"primitive-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"uri","url":"http://hl7.org/fhir/StructureDefinition/uri"},"description":"Base StructureDefinition for uri Type: String of characters used to identify a name or a resource","base":{"kind":"complex-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Element","url":"http://hl7.org/fhir/StructureDefinition/Element"},"dependencies":[{"kind":"complex-type","package":"hl7.fhir.r4.core","version":"4.0.1","name":"Element","url":"http://hl7.org/fhir/StructureDefinition/Element"}]} {"identifier":{"kind":"binding","package":"shared","version":"1.0.0","name":"BundleType","url":"urn:fhir:binding:BundleType"},"valueset":{"kind":"value-set","package":"hl7.fhir.r4.core","version":"4.0.1","name":"BundleType","url":"http://hl7.org/fhir/ValueSet/bundle-type"},"strength":"required","enum":{"isOpen":false,"values":["document","message","transaction","transaction-response","batch","batch-response","history","searchset","collection"]},"dependencies":[{"kind":"value-set","package":"hl7.fhir.r4.core","version":"4.0.1","name":"BundleType","url":"http://hl7.org/fhir/ValueSet/bundle-type"}]} @@ -2911,15 +2911,17 @@ exports[`IntrospectionWriter - flat profile output Check bodyweight flat profile }, "required": true, "excluded": false, - "reference": [ - { - "kind": "resource", - "package": "hl7.fhir.r4.core", - "version": "4.0.1", - "name": "Patient", - "url": "http://hl7.org/fhir/StructureDefinition/Patient" - } - ], + "reference": { + "resource": [ + { + "kind": "resource", + "package": "hl7.fhir.r4.core", + "version": "4.0.1", + "name": "Patient", + "url": "http://hl7.org/fhir/StructureDefinition/Patient" + } + ] + }, "array": false, "mustSupport": true }, @@ -3015,29 +3017,40 @@ exports[`IntrospectionWriter - flat profile output Check bodyweight flat profile }, "required": false, "excluded": false, - "reference": [ - { - "kind": "resource", - "package": "hl7.fhir.r4.core", - "version": "4.0.1", - "name": "MolecularSequence", - "url": "http://hl7.org/fhir/StructureDefinition/MolecularSequence" - }, - { - "kind": "resource", - "package": "hl7.fhir.r4.core", - "version": "4.0.1", - "name": "QuestionnaireResponse", - "url": "http://hl7.org/fhir/StructureDefinition/QuestionnaireResponse" - }, - { - "kind": "profile", - "package": "hl7.fhir.r4.core", - "version": "4.0.1", - "name": "observation-vitalsigns", - "url": "http://hl7.org/fhir/StructureDefinition/vitalsigns" - } - ], + "reference": { + "resource": [ + { + "kind": "resource", + "package": "hl7.fhir.r4.core", + "version": "4.0.1", + "name": "MolecularSequence", + "url": "http://hl7.org/fhir/StructureDefinition/MolecularSequence" + }, + { + "kind": "resource", + "package": "hl7.fhir.r4.core", + "version": "4.0.1", + "name": "QuestionnaireResponse", + "url": "http://hl7.org/fhir/StructureDefinition/QuestionnaireResponse" + }, + { + "kind": "resource", + "package": "hl7.fhir.r4.core", + "version": "4.0.1", + "name": "Observation", + "url": "http://hl7.org/fhir/StructureDefinition/Observation" + } + ], + "profiles": [ + { + "kind": "profile", + "package": "hl7.fhir.r4.core", + "version": "4.0.1", + "name": "observation-vitalsigns", + "url": "http://hl7.org/fhir/StructureDefinition/vitalsigns" + } + ] + }, "array": true }, "derivedFrom": { @@ -3050,50 +3063,61 @@ exports[`IntrospectionWriter - flat profile output Check bodyweight flat profile }, "required": false, "excluded": false, - "reference": [ - { - "kind": "resource", - "package": "hl7.fhir.r4.core", - "version": "4.0.1", - "name": "DocumentReference", - "url": "http://hl7.org/fhir/StructureDefinition/DocumentReference" - }, - { - "kind": "resource", - "package": "hl7.fhir.r4.core", - "version": "4.0.1", - "name": "ImagingStudy", - "url": "http://hl7.org/fhir/StructureDefinition/ImagingStudy" - }, - { - "kind": "resource", - "package": "hl7.fhir.r4.core", - "version": "4.0.1", - "name": "Media", - "url": "http://hl7.org/fhir/StructureDefinition/Media" - }, - { - "kind": "resource", - "package": "hl7.fhir.r4.core", - "version": "4.0.1", - "name": "MolecularSequence", - "url": "http://hl7.org/fhir/StructureDefinition/MolecularSequence" - }, - { - "kind": "resource", - "package": "hl7.fhir.r4.core", - "version": "4.0.1", - "name": "QuestionnaireResponse", - "url": "http://hl7.org/fhir/StructureDefinition/QuestionnaireResponse" - }, - { - "kind": "profile", - "package": "hl7.fhir.r4.core", - "version": "4.0.1", - "name": "observation-vitalsigns", - "url": "http://hl7.org/fhir/StructureDefinition/vitalsigns" - } - ], + "reference": { + "resource": [ + { + "kind": "resource", + "package": "hl7.fhir.r4.core", + "version": "4.0.1", + "name": "DocumentReference", + "url": "http://hl7.org/fhir/StructureDefinition/DocumentReference" + }, + { + "kind": "resource", + "package": "hl7.fhir.r4.core", + "version": "4.0.1", + "name": "ImagingStudy", + "url": "http://hl7.org/fhir/StructureDefinition/ImagingStudy" + }, + { + "kind": "resource", + "package": "hl7.fhir.r4.core", + "version": "4.0.1", + "name": "Media", + "url": "http://hl7.org/fhir/StructureDefinition/Media" + }, + { + "kind": "resource", + "package": "hl7.fhir.r4.core", + "version": "4.0.1", + "name": "MolecularSequence", + "url": "http://hl7.org/fhir/StructureDefinition/MolecularSequence" + }, + { + "kind": "resource", + "package": "hl7.fhir.r4.core", + "version": "4.0.1", + "name": "QuestionnaireResponse", + "url": "http://hl7.org/fhir/StructureDefinition/QuestionnaireResponse" + }, + { + "kind": "resource", + "package": "hl7.fhir.r4.core", + "version": "4.0.1", + "name": "Observation", + "url": "http://hl7.org/fhir/StructureDefinition/Observation" + } + ], + "profiles": [ + { + "kind": "profile", + "package": "hl7.fhir.r4.core", + "version": "4.0.1", + "name": "observation-vitalsigns", + "url": "http://hl7.org/fhir/StructureDefinition/vitalsigns" + } + ] + }, "array": true }, "component": { diff --git a/test/api/write-generator/__snapshots__/python.test.ts.snap b/test/api/write-generator/__snapshots__/python.test.ts.snap index 06665095..895f7062 100644 --- a/test/api/write-generator/__snapshots__/python.test.ts.snap +++ b/test/api/write-generator/__snapshots__/python.test.ts.snap @@ -1471,7 +1471,7 @@ class UscoreBloodPressureProfile: errors.extend(validate_reference(self._resource, profile_name, "derivedFrom", ["DocumentReference","ImagingStudy","Media","MolecularSequence","QuestionnaireResponse","Observation"])) errors.extend(validate_slice_cardinality(self._resource, profile_name, "component", {"code":{"coding":[{"system":"http://loinc.org","code":"8480-6"}]}}, "systolic", 1, 1)) errors.extend(validate_slice_cardinality(self._resource, profile_name, "component", {"code":{"coding":[{"system":"http://loinc.org","code":"8462-4"}]}}, "diastolic", 1, 1)) - errors.extend(validate_reference(self._resource, profile_name, "performer", ["PractitionerRole","USCoreCareTeam","USCoreOrganizationProfile","Patient","USCorePractitionerProfile","USCoreRelatedPersonProfile"])) + errors.extend(validate_reference(self._resource, profile_name, "performer", ["PractitionerRole","CareTeam","Organization","Patient","Practitioner","RelatedPerson"])) warnings.extend(validate_enum(self._resource, profile_name, "category", ["social-history","vital-signs","imaging","laboratory","procedure","survey","exam","therapy","activity"])) warnings.extend(validate_enum(self._resource, profile_name, "code", ["2708-6","29463-7","3140-1","3150-0","3151-8","39156-5","59408-5","59575-1","59576-9","77606-2","8287-5","8289-1","8302-2","8306-3","8310-5","8462-4","8478-0","8480-6","8867-4","9279-1","9843-4"])) warnings.extend(validate_enum(self._resource, profile_name, "dataAbsentReason", ["unknown","asked-unknown","temp-unknown","not-asked","asked-declined","masked","not-applicable","unsupported","as-text","error","not-a-number","negative-infinity","positive-infinity","not-performed","not-permitted"])) @@ -1710,7 +1710,7 @@ class UscoreBodyWeightProfile: errors.extend(validate_choice_required(self._resource, profile_name, ["effectiveDateTime","effectivePeriod"])) errors.extend(validate_reference(self._resource, profile_name, "hasMember", ["MolecularSequence","QuestionnaireResponse","Observation"])) errors.extend(validate_reference(self._resource, profile_name, "derivedFrom", ["DocumentReference","ImagingStudy","Media","MolecularSequence","QuestionnaireResponse","Observation"])) - errors.extend(validate_reference(self._resource, profile_name, "performer", ["PractitionerRole","USCoreCareTeam","USCoreOrganizationProfile","Patient","USCorePractitionerProfile","USCoreRelatedPersonProfile"])) + errors.extend(validate_reference(self._resource, profile_name, "performer", ["PractitionerRole","CareTeam","Organization","Patient","Practitioner","RelatedPerson"])) errors.extend(validate_excluded(self._resource, profile_name, "valueCodeableConcept")) errors.extend(validate_excluded(self._resource, profile_name, "valueString")) errors.extend(validate_excluded(self._resource, profile_name, "valueBoolean")) diff --git a/test/api/write-generator/__snapshots__/typescript.test.ts.snap b/test/api/write-generator/__snapshots__/typescript.test.ts.snap index 8a096614..c6bc1688 100644 --- a/test/api/write-generator/__snapshots__/typescript.test.ts.snap +++ b/test/api/write-generator/__snapshots__/typescript.test.ts.snap @@ -1735,7 +1735,7 @@ export class USCoreBloodPressureProfile { ...validateSliceFields(res, profileName, "component", {"code":{"coding":[{"system":"http://loinc.org","code":"8480-6"}]}}, "systolic", ["valueQuantity"]), ...validateSliceCardinality(res, profileName, "component", {"code":{"coding":[{"system":"http://loinc.org","code":"8462-4"}]}}, "diastolic", 1, 1), ...validateSliceFields(res, profileName, "component", {"code":{"coding":[{"system":"http://loinc.org","code":"8462-4"}]}}, "diastolic", ["valueQuantity"]), - ...validateReference(res, profileName, "performer", ["PractitionerRole","USCoreCareTeam","USCoreOrganizationProfile","Patient","USCorePractitionerProfile","USCoreRelatedPersonProfile"]), + ...validateReference(res, profileName, "performer", ["PractitionerRole","CareTeam","Organization","Patient","Practitioner","RelatedPerson"]), ], warnings: [ ...validateEnum(res, profileName, "category", ["social-history","vital-signs","imaging","laboratory","procedure","survey","exam","therapy","activity"]), @@ -2087,7 +2087,7 @@ export class USCoreBodyWeightProfile { ...validateChoiceProhibited(res, profileName, ["effectiveTiming","effectiveInstant"]), ...validateReference(res, profileName, "hasMember", ["MolecularSequence","QuestionnaireResponse","Observation"]), ...validateReference(res, profileName, "derivedFrom", ["DocumentReference","ImagingStudy","Media","MolecularSequence","QuestionnaireResponse","Observation"]), - ...validateReference(res, profileName, "performer", ["PractitionerRole","USCoreCareTeam","USCoreOrganizationProfile","Patient","USCorePractitionerProfile","USCoreRelatedPersonProfile"]), + ...validateReference(res, profileName, "performer", ["PractitionerRole","CareTeam","Organization","Patient","Practitioner","RelatedPerson"]), ...validateChoiceProhibited(res, profileName, ["valueCodeableConcept","valueString","valueBoolean","valueInteger","valueRange","valueRatio","valueSampledData","valueTime","valueDateTime","valuePeriod"]), ], warnings: [ diff --git a/test/unit/typeschema/__snapshots__/snapshot.test.ts.snap b/test/unit/typeschema/__snapshots__/snapshot.test.ts.snap index c93d0803..dacb08dd 100644 --- a/test/unit/typeschema/__snapshots__/snapshot.test.ts.snap +++ b/test/unit/typeschema/__snapshots__/snapshot.test.ts.snap @@ -1109,15 +1109,17 @@ exports[`FHIR Schema to Type Schema (snapshot) Custom resource TutorNotification }, "required": true, "excluded": false, - "reference": [ - { - "kind": "resource", - "package": "mypackage", - "version": "0.0.0", - "name": "TutorNotificationTemplate", - "url": "http://example.com/aidbox-sms-tutor/TutorNotificationTemplate" - } - ], + "reference": { + "resource": [ + { + "kind": "resource", + "package": "mypackage", + "version": "0.0.0", + "name": "TutorNotificationTemplate", + "url": "http://example.com/aidbox-sms-tutor/TutorNotificationTemplate" + } + ] + }, "array": false }, "message": { @@ -1154,15 +1156,17 @@ exports[`FHIR Schema to Type Schema (snapshot) Custom resource TutorNotification }, "required": true, "excluded": false, - "reference": [ - { - "kind": "resource", - "package": "hl7.fhir.r4.core", - "version": "4.0.1", - "name": "Patient", - "url": "http://hl7.org/fhir/StructureDefinition/Patient" - } - ], + "reference": { + "resource": [ + { + "kind": "resource", + "package": "hl7.fhir.r4.core", + "version": "4.0.1", + "name": "Patient", + "url": "http://hl7.org/fhir/StructureDefinition/Patient" + } + ] + }, "array": false } }, diff --git a/test/unit/typeschema/ir/__snapshots__/tree-shake.test.ts.snap b/test/unit/typeschema/ir/__snapshots__/tree-shake.test.ts.snap index 1dac3820..1240a722 100644 --- a/test/unit/typeschema/ir/__snapshots__/tree-shake.test.ts.snap +++ b/test/unit/typeschema/ir/__snapshots__/tree-shake.test.ts.snap @@ -5253,29 +5253,31 @@ exports[`treeShake specific TypeSchema Original Patient 1`] = ` }, "required": false, "excluded": false, - "reference": [ - { - "kind": "resource", - "package": "hl7.fhir.r4.core", - "version": "4.0.1", - "name": "Organization", - "url": "http://hl7.org/fhir/StructureDefinition/Organization" - }, - { - "kind": "resource", - "package": "hl7.fhir.r4.core", - "version": "4.0.1", - "name": "Practitioner", - "url": "http://hl7.org/fhir/StructureDefinition/Practitioner" - }, - { - "kind": "resource", - "package": "hl7.fhir.r4.core", - "version": "4.0.1", - "name": "PractitionerRole", - "url": "http://hl7.org/fhir/StructureDefinition/PractitionerRole" - } - ], + "reference": { + "resource": [ + { + "kind": "resource", + "package": "hl7.fhir.r4.core", + "version": "4.0.1", + "name": "Organization", + "url": "http://hl7.org/fhir/StructureDefinition/Organization" + }, + { + "kind": "resource", + "package": "hl7.fhir.r4.core", + "version": "4.0.1", + "name": "Practitioner", + "url": "http://hl7.org/fhir/StructureDefinition/Practitioner" + }, + { + "kind": "resource", + "package": "hl7.fhir.r4.core", + "version": "4.0.1", + "name": "PractitionerRole", + "url": "http://hl7.org/fhir/StructureDefinition/PractitionerRole" + } + ] + }, "array": true }, "managingOrganization": { @@ -5288,15 +5290,17 @@ exports[`treeShake specific TypeSchema Original Patient 1`] = ` }, "required": false, "excluded": false, - "reference": [ - { - "kind": "resource", - "package": "hl7.fhir.r4.core", - "version": "4.0.1", - "name": "Organization", - "url": "http://hl7.org/fhir/StructureDefinition/Organization" - } - ], + "reference": { + "resource": [ + { + "kind": "resource", + "package": "hl7.fhir.r4.core", + "version": "4.0.1", + "name": "Organization", + "url": "http://hl7.org/fhir/StructureDefinition/Organization" + } + ] + }, "array": false }, "link": { @@ -5532,15 +5536,17 @@ exports[`treeShake specific TypeSchema Original Patient 1`] = ` }, "required": false, "excluded": false, - "reference": [ - { - "kind": "resource", - "package": "hl7.fhir.r4.core", - "version": "4.0.1", - "name": "Organization", - "url": "http://hl7.org/fhir/StructureDefinition/Organization" - } - ], + "reference": { + "resource": [ + { + "kind": "resource", + "package": "hl7.fhir.r4.core", + "version": "4.0.1", + "name": "Organization", + "url": "http://hl7.org/fhir/StructureDefinition/Organization" + } + ] + }, "array": false }, "period": { @@ -5583,22 +5589,24 @@ exports[`treeShake specific TypeSchema Original Patient 1`] = ` }, "required": true, "excluded": false, - "reference": [ - { - "kind": "resource", - "package": "hl7.fhir.r4.core", - "version": "4.0.1", - "name": "Patient", - "url": "http://hl7.org/fhir/StructureDefinition/Patient" - }, - { - "kind": "resource", - "package": "hl7.fhir.r4.core", - "version": "4.0.1", - "name": "RelatedPerson", - "url": "http://hl7.org/fhir/StructureDefinition/RelatedPerson" - } - ], + "reference": { + "resource": [ + { + "kind": "resource", + "package": "hl7.fhir.r4.core", + "version": "4.0.1", + "name": "Patient", + "url": "http://hl7.org/fhir/StructureDefinition/Patient" + }, + { + "kind": "resource", + "package": "hl7.fhir.r4.core", + "version": "4.0.1", + "name": "RelatedPerson", + "url": "http://hl7.org/fhir/StructureDefinition/RelatedPerson" + } + ] + }, "array": false }, "type": { @@ -6018,29 +6026,31 @@ exports[`treeShake specific TypeSchema ignoreFields regular field 1`] = ` }, "required": false, "excluded": false, - "reference": [ - { - "kind": "resource", - "package": "hl7.fhir.r4.core", - "version": "4.0.1", - "name": "Organization", - "url": "http://hl7.org/fhir/StructureDefinition/Organization" - }, - { - "kind": "resource", - "package": "hl7.fhir.r4.core", - "version": "4.0.1", - "name": "Practitioner", - "url": "http://hl7.org/fhir/StructureDefinition/Practitioner" - }, - { - "kind": "resource", - "package": "hl7.fhir.r4.core", - "version": "4.0.1", - "name": "PractitionerRole", - "url": "http://hl7.org/fhir/StructureDefinition/PractitionerRole" - } - ], + "reference": { + "resource": [ + { + "kind": "resource", + "package": "hl7.fhir.r4.core", + "version": "4.0.1", + "name": "Organization", + "url": "http://hl7.org/fhir/StructureDefinition/Organization" + }, + { + "kind": "resource", + "package": "hl7.fhir.r4.core", + "version": "4.0.1", + "name": "Practitioner", + "url": "http://hl7.org/fhir/StructureDefinition/Practitioner" + }, + { + "kind": "resource", + "package": "hl7.fhir.r4.core", + "version": "4.0.1", + "name": "PractitionerRole", + "url": "http://hl7.org/fhir/StructureDefinition/PractitionerRole" + } + ] + }, "array": true }, "managingOrganization": { @@ -6053,15 +6063,17 @@ exports[`treeShake specific TypeSchema ignoreFields regular field 1`] = ` }, "required": false, "excluded": false, - "reference": [ - { - "kind": "resource", - "package": "hl7.fhir.r4.core", - "version": "4.0.1", - "name": "Organization", - "url": "http://hl7.org/fhir/StructureDefinition/Organization" - } - ], + "reference": { + "resource": [ + { + "kind": "resource", + "package": "hl7.fhir.r4.core", + "version": "4.0.1", + "name": "Organization", + "url": "http://hl7.org/fhir/StructureDefinition/Organization" + } + ] + }, "array": false }, "link": { @@ -6297,15 +6309,17 @@ exports[`treeShake specific TypeSchema ignoreFields regular field 1`] = ` }, "required": false, "excluded": false, - "reference": [ - { - "kind": "resource", - "package": "hl7.fhir.r4.core", - "version": "4.0.1", - "name": "Organization", - "url": "http://hl7.org/fhir/StructureDefinition/Organization" - } - ], + "reference": { + "resource": [ + { + "kind": "resource", + "package": "hl7.fhir.r4.core", + "version": "4.0.1", + "name": "Organization", + "url": "http://hl7.org/fhir/StructureDefinition/Organization" + } + ] + }, "array": false }, "period": { @@ -6348,22 +6362,24 @@ exports[`treeShake specific TypeSchema ignoreFields regular field 1`] = ` }, "required": true, "excluded": false, - "reference": [ - { - "kind": "resource", - "package": "hl7.fhir.r4.core", - "version": "4.0.1", - "name": "Patient", - "url": "http://hl7.org/fhir/StructureDefinition/Patient" - }, - { - "kind": "resource", - "package": "hl7.fhir.r4.core", - "version": "4.0.1", - "name": "RelatedPerson", - "url": "http://hl7.org/fhir/StructureDefinition/RelatedPerson" - } - ], + "reference": { + "resource": [ + { + "kind": "resource", + "package": "hl7.fhir.r4.core", + "version": "4.0.1", + "name": "Patient", + "url": "http://hl7.org/fhir/StructureDefinition/Patient" + }, + { + "kind": "resource", + "package": "hl7.fhir.r4.core", + "version": "4.0.1", + "name": "RelatedPerson", + "url": "http://hl7.org/fhir/StructureDefinition/RelatedPerson" + } + ] + }, "array": false }, "type": { diff --git a/test/unit/typeschema/transformer/reference.test.ts b/test/unit/typeschema/transformer/reference.test.ts new file mode 100644 index 00000000..384fa8de --- /dev/null +++ b/test/unit/typeschema/transformer/reference.test.ts @@ -0,0 +1,102 @@ +import { describe, expect, it } from "bun:test"; +import type { ProfileTypeSchema, RegularField } from "@typeschema/types"; +import { mkErrorLogger, mkR4Register, registerFs, registerFsAndMkTs } from "@typeschema-test/utils"; + +describe("reference target resolution", async () => { + const r4 = await mkR4Register(); + const logger = mkErrorLogger(); + + registerFs(r4, { + url: "http://example.org/StructureDefinition/TestPatient", + name: "TestPatient", + base: "http://hl7.org/fhir/StructureDefinition/Patient", + derivation: "constraint", + kind: "resource", + }); + + it("profile-only targetProfile yields both the base resource and the profile", async () => { + // Base Observation.subject references Patient (among others); the profile + // restates it with ONLY a Patient profile as target. + const ts = ( + await registerFsAndMkTs( + r4, + { + url: "http://example.org/StructureDefinition/TestObservation", + name: "TestObservation", + base: "http://hl7.org/fhir/StructureDefinition/Observation", + derivation: "constraint", + kind: "resource", + elements: { + subject: { + type: "Reference", + refers: ["http://example.org/StructureDefinition/TestPatient"], + }, + }, + }, + logger, + ) + )[0] as ProfileTypeSchema; + + const subject = ts.fields?.subject as RegularField; + expect(subject.reference?.resource.map((ref): string => ref.name)).toEqual(["Patient"]); + expect(subject.reference?.resource[0]?.kind).toBe("resource"); + expect(subject.reference?.profiles?.map((ref): string => ref.name)).toEqual(["TestPatient"]); + expect(subject.reference?.profiles?.[0]?.kind).toBe("profile"); + }); + + it("profile alongside its base resource dedupes the resource list", async () => { + const ts = ( + await registerFsAndMkTs( + r4, + { + url: "http://example.org/StructureDefinition/TestCondition", + name: "TestCondition", + base: "http://hl7.org/fhir/StructureDefinition/Condition", + derivation: "constraint", + kind: "resource", + elements: { + subject: { + type: "Reference", + refers: [ + "http://hl7.org/fhir/StructureDefinition/Group", + "http://hl7.org/fhir/StructureDefinition/Patient", + "http://example.org/StructureDefinition/TestPatient", + ], + }, + }, + }, + logger, + ) + )[0] as ProfileTypeSchema; + + const subject = ts.fields?.subject as RegularField; + expect(subject.reference?.resource.map((ref): string => ref.name)).toEqual(["Group", "Patient"]); + expect(subject.reference?.profiles?.map((ref): string => ref.name)).toEqual(["TestPatient"]); + }); + + it("plain resource targets carry no profiles", async () => { + const ts = ( + await registerFsAndMkTs( + r4, + { + url: "http://example.org/StructureDefinition/TestEncounter", + name: "TestEncounter", + base: "http://hl7.org/fhir/StructureDefinition/Encounter", + derivation: "constraint", + kind: "resource", + elements: { + subject: { + type: "Reference", + refers: ["http://hl7.org/fhir/StructureDefinition/Patient"], + }, + }, + }, + logger, + ) + )[0] as ProfileTypeSchema; + + const subject = ts.fields?.subject as RegularField; + expect(subject.reference?.resource.map((ref): string => ref.name)).toEqual(["Patient"]); + expect(subject.reference?.profiles).toBeUndefined(); + }); +});