From 9f62824d8afec8ebae7a95cfb9d203f84261e3d0 Mon Sep 17 00:00:00 2001 From: Malte Sussdorff Date: Sat, 18 Jul 2026 14:42:07 +0200 Subject: [PATCH 1/8] fix(typeschema): preserve sliced choice semantics (codegen-cmv) --- ...-choice-condition.structuredefinition.json | 48 +++++ ...-choice-condition.structuredefinition.json | 72 +++++++ .../typescript/profile-validation.ts | 9 +- src/typeschema/core/field-builder.ts | 32 ++- src/typeschema/types.ts | 1 + src/typeschema/utils.ts | 55 ++++- .../__snapshots__/typescript.test.ts.snap | 8 + .../multi-package/local-package.test.ts | 46 ++++ test/unit/typeschema/utils.test.ts | 201 ++++++++++++++++++ 9 files changed, 453 insertions(+), 19 deletions(-) create mode 100644 examples/typescript-custom-packages/structure-definitions/example-closed-choice-condition.structuredefinition.json create mode 100644 examples/typescript-custom-packages/structure-definitions/example-open-choice-condition.structuredefinition.json diff --git a/examples/typescript-custom-packages/structure-definitions/example-closed-choice-condition.structuredefinition.json b/examples/typescript-custom-packages/structure-definitions/example-closed-choice-condition.structuredefinition.json new file mode 100644 index 00000000..e52f256d --- /dev/null +++ b/examples/typescript-custom-packages/structure-definitions/example-closed-choice-condition.structuredefinition.json @@ -0,0 +1,48 @@ +{ + "resourceType": "StructureDefinition", + "id": "example-closed-choice-condition", + "url": "http://example.org/fhir/StructureDefinition/ExampleClosedChoiceCondition", + "version": "0.0.1", + "name": "ExampleClosedChoiceCondition", + "title": "Example Closed Choice Condition", + "status": "draft", + "date": "2024-01-01", + "publisher": "Atomic Example Studio", + "description": "A Condition profile that uses closed type slicing on onset[x].", + "fhirVersion": "4.0.1", + "kind": "resource", + "abstract": false, + "type": "Condition", + "baseDefinition": "http://hl7.org/fhir/StructureDefinition/Condition", + "derivation": "constraint", + "differential": { + "element": [ + { + "id": "Condition.onset[x]", + "path": "Condition.onset[x]", + "slicing": { + "discriminator": [ + { + "type": "type", + "path": "$this" + } + ], + "rules": "closed", + "ordered": false + } + }, + { + "id": "Condition.onset[x]:onsetAge", + "path": "Condition.onset[x]", + "sliceName": "onsetAge", + "min": 0, + "max": "1", + "type": [ + { + "code": "Age" + } + ] + } + ] + } +} diff --git a/examples/typescript-custom-packages/structure-definitions/example-open-choice-condition.structuredefinition.json b/examples/typescript-custom-packages/structure-definitions/example-open-choice-condition.structuredefinition.json new file mode 100644 index 00000000..7d8b1931 --- /dev/null +++ b/examples/typescript-custom-packages/structure-definitions/example-open-choice-condition.structuredefinition.json @@ -0,0 +1,72 @@ +{ + "resourceType": "StructureDefinition", + "id": "example-open-choice-condition", + "url": "http://example.org/fhir/StructureDefinition/ExampleOpenChoiceCondition", + "version": "0.0.1", + "name": "ExampleOpenChoiceCondition", + "title": "Example Open Choice Condition", + "status": "draft", + "date": "2024-01-01", + "publisher": "Atomic Example Studio", + "description": "A Condition profile that uses open type slicing on onset[x].", + "fhirVersion": "4.0.1", + "kind": "resource", + "abstract": false, + "type": "Condition", + "baseDefinition": "http://hl7.org/fhir/StructureDefinition/Condition", + "derivation": "constraint", + "differential": { + "element": [ + { + "id": "Condition.onset[x]", + "path": "Condition.onset[x]", + "slicing": { + "discriminator": [ + { + "type": "type", + "path": "$this" + } + ], + "rules": "open", + "ordered": false + } + }, + { + "id": "Condition.onset[x]:onsetDateTime", + "path": "Condition.onset[x]", + "sliceName": "onsetDateTime", + "min": 0, + "max": "1", + "type": [ + { + "code": "dateTime" + } + ] + }, + { + "id": "Condition.onset[x]:onsetPeriod", + "path": "Condition.onset[x]", + "sliceName": "onsetPeriod", + "min": 0, + "max": "1", + "type": [ + { + "code": "Period" + } + ] + }, + { + "id": "Condition.onset[x]:onsetAge", + "path": "Condition.onset[x]", + "sliceName": "onsetAge", + "min": 0, + "max": "1", + "type": [ + { + "code": "Age" + } + ] + } + ] + } +} diff --git a/src/api/writer-generator/typescript/profile-validation.ts b/src/api/writer-generator/typescript/profile-validation.ts index 2eb3f1bb..506df9ba 100644 --- a/src/api/writer-generator/typescript/profile-validation.ts +++ b/src/api/writer-generator/typescript/profile-validation.ts @@ -96,14 +96,11 @@ export const generateValidateMethod = ( const errors: string[] = []; const warnings: string[] = []; for (const [name, field] of Object.entries(fields)) { - if (isChoiceInstanceField(field)) { - const decl = fields[field.choiceOf]; - if (decl && isChoiceDeclarationField(decl) && decl.prohibited?.includes(name)) - errors.push(`...validateExcluded(res, profileName, ${JSON.stringify(name)})`); - continue; - } + if (isChoiceInstanceField(field)) continue; if (isChoiceDeclarationField(field)) { + for (const prohibitedName of field.prohibited ?? []) + errors.push(`...validateExcluded(res, profileName, ${JSON.stringify(prohibitedName)})`); if (field.required) errors.push(`...validateChoiceRequired(res, profileName, ${JSON.stringify(field.choices)})`); continue; diff --git a/src/typeschema/core/field-builder.ts b/src/typeschema/core/field-builder.ts index 984e178c..a603537f 100644 --- a/src/typeschema/core/field-builder.ts +++ b/src/typeschema/core/field-builder.ts @@ -269,7 +269,29 @@ const computeMatchFromSchema = ( return result; }; -const buildSlicing = (fieldName: string, element: FHIRSchemaElement): FieldSlicing | undefined => { +const choiceBaseName = (name: string): string => (name.endsWith("[x]") ? name.slice(0, -3) : name); + +const resolveDifferentialSlicingRules = ( + register: Register, + fhirSchema: RichFHIRSchema, + path: string[], + element: FHIRSchemaElement, +): string | undefined => { + if (!element.slicing || fhirSchema.derivation !== "constraint") return undefined; + const structureDefinition = register.resolveSd(fhirSchema.package_meta, fhirSchema.url); + const differentialElements = structureDefinition?.differential?.element ?? []; + return differentialElements.find((differentialElement) => { + if (!differentialElement.slicing?.rules) return false; + const differentialPath = differentialElement.path.split(".").slice(1).map(choiceBaseName); + return differentialPath.length === path.length && differentialPath.every((part, index) => part === path[index]); + })?.slicing?.rules; +}; + +const buildSlicing = ( + fieldName: string, + element: FHIRSchemaElement, + differentialRules?: string, +): FieldSlicing | undefined => { const slicing = element.slicing; if (!slicing) return undefined; @@ -292,7 +314,7 @@ const buildSlicing = (fieldName: string, element: FHIRSchemaElement): FieldSlici return { discriminator: slicing.discriminator ?? [], - rules: slicing.rules, + rules: differentialRules ?? slicing.rules, ordered: slicing.ordered, slices: Object.keys(slices).length > 0 ? slices : undefined, }; @@ -414,7 +436,11 @@ export const mkField = ( array: element.array || false, min: element.min, max: element.max, - slicing: buildSlicing(path[path.length - 1] ?? "", element), + slicing: buildSlicing( + path[path.length - 1] ?? "", + element, + resolveDifferentialSlicingRules(register, fhirSchema, path, element), + ), choices: element.choices, choiceOf: element.choiceOf, diff --git a/src/typeschema/types.ts b/src/typeschema/types.ts index ab712150..f38ed2f5 100644 --- a/src/typeschema/types.ts +++ b/src/typeschema/types.ts @@ -393,6 +393,7 @@ export interface ChoiceFieldDeclaration { array?: boolean; min?: number; max?: number; + slicing?: FieldSlicing; } export interface ChoiceFieldInstance { diff --git a/src/typeschema/utils.ts b/src/typeschema/utils.ts index 35784fd1..3ff7d87a 100644 --- a/src/typeschema/utils.ts +++ b/src/typeschema/utils.ts @@ -8,6 +8,7 @@ import { type BindingIdentifier, type BindingTypeSchema, type CanonicalUrl, + type ChoiceFieldDeclaration, type ChoiceFieldInstance, type ComplexTypeIdentifier, type ComplexTypeTypeSchema, @@ -503,15 +504,49 @@ export const mkTypeSchemaIndex = ( const narrowMergedChoiceDeclarations = ( mergedFields: Record, constraintSchemas: TypeSchema[], + baseFields: Record, ): Record => { const result = { ...mergedFields }; + + const choiceUniverse = (declName: string, declField: ChoiceFieldDeclaration): string[] => { + const baseDeclaration = baseFields[declName]; + const baseChoices = isChoiceDeclarationField(baseDeclaration) ? baseDeclaration.choices : []; + const presentChoices = Object.entries(result) + .filter( + ([_, field]) => + isChoiceInstanceField(field) && (field as ChoiceFieldInstance).choiceOf === declName, + ) + .map(([name]) => name); + return [...new Set([...baseChoices, ...declField.choices, ...presentChoices])]; + }; + for (const [declName, declField] of Object.entries(result)) { if (!isChoiceDeclarationField(declField) || declField.excluded) continue; + const effectiveSlicingRules = constraintSchemas + .map((schema) => (schema as SpecializationTypeSchema).fields?.[declName]) + .find((field) => isChoiceDeclarationField(field) && field.slicing?.rules !== undefined)?.slicing?.rules; + if (effectiveSlicingRules === "open") { + const explicitlyExcluded = new Set( + Object.entries(result) + .filter( + ([_, field]) => + isChoiceInstanceField(field) && field.choiceOf === declName && field.excluded === true, + ) + .map(([name]) => name), + ); + result[declName] = { + ...declField, + choices: choiceUniverse(declName, declField).filter((name) => !explicitlyExcluded.has(name)), + }; + continue; + } + for (const cSchema of constraintSchemas) { const sFields = (cSchema as SpecializationTypeSchema).fields; if (!sFields) continue; - if (sFields[declName] && isChoiceDeclarationField(sFields[declName])) continue; + const schemaDeclaration = sFields[declName]; + if (schemaDeclaration && isChoiceDeclarationField(schemaDeclaration)) break; const instancesInSchema = Object.entries(sFields) .filter(([_, f]) => isChoiceInstanceField(f) && (f as ChoiceFieldInstance).choiceOf === declName) @@ -528,14 +563,10 @@ export const mkTypeSchemaIndex = ( for (const [declName, declField] of Object.entries(result)) { if (!isChoiceDeclarationField(declField)) continue; const permitted = new Set(declField.excluded ? [] : declField.choices); - const prohibited = Object.entries(result) - .filter( - (e): e is [string, ChoiceFieldInstance] => - isChoiceInstanceField(e[1]) && e[1].choiceOf === declName, - ) - .filter(([name]) => !permitted.has(name)) - .map(([name]) => name); - if (prohibited.length > 0) result[declName] = { ...declField, prohibited }; + const prohibited = choiceUniverse(declName, declField).filter((name) => !permitted.has(name)); + const { prohibited: _, ...declarationWithoutProhibited } = declField; + result[declName] = + prohibited.length > 0 ? { ...declarationWithoutProhibited, prohibited } : declarationWithoutProhibited; } return result; @@ -570,7 +601,11 @@ export const mkTypeSchemaIndex = ( } } - const narrowedFields = narrowMergedChoiceDeclarations(mergedFields, constraintSchemas); + const narrowedFields = narrowMergedChoiceDeclarations( + mergedFields, + constraintSchemas, + (nonConstraintSchema as SpecializationTypeSchema).fields ?? {}, + ); const dependencies = Object.values( Object.fromEntries( diff --git a/test/api/write-generator/__snapshots__/typescript.test.ts.snap b/test/api/write-generator/__snapshots__/typescript.test.ts.snap index be239c4b..9db5b444 100644 --- a/test/api/write-generator/__snapshots__/typescript.test.ts.snap +++ b/test/api/write-generator/__snapshots__/typescript.test.ts.snap @@ -712,6 +712,8 @@ export class observation_bodyweightProfile { ...validateFixedValue(res, profileName, "code", {"coding":[{"code":"29463-7","system":"http://loinc.org"}]}), ...validateRequired(res, profileName, "subject"), ...validateReference(res, profileName, "subject", ["Patient"]), + ...validateExcluded(res, profileName, "effectiveTiming"), + ...validateExcluded(res, profileName, "effectiveInstant"), ...validateChoiceRequired(res, profileName, ["effectiveDateTime","effectivePeriod"]), ...validateReference(res, profileName, "hasMember", ["MolecularSequence","QuestionnaireResponse","Observation"]), ...validateReference(res, profileName, "derivedFrom", ["DocumentReference","ImagingStudy","Media","MolecularSequence","QuestionnaireResponse","Observation"]), @@ -1023,6 +1025,8 @@ export class observation_bpProfile { ...validateFixedValue(res, profileName, "code", {"coding":[{"code":"85354-9","system":"http://loinc.org"}]}), ...validateRequired(res, profileName, "subject"), ...validateReference(res, profileName, "subject", ["Patient"]), + ...validateExcluded(res, profileName, "effectiveTiming"), + ...validateExcluded(res, profileName, "effectiveInstant"), ...validateChoiceRequired(res, profileName, ["effectiveDateTime","effectivePeriod"]), ...validateReference(res, profileName, "hasMember", ["MolecularSequence","QuestionnaireResponse","Observation"]), ...validateReference(res, profileName, "derivedFrom", ["DocumentReference","ImagingStudy","Media","MolecularSequence","QuestionnaireResponse","Observation"]), @@ -1719,6 +1723,8 @@ export class USCoreBloodPressureProfile { ...validateFixedValue(res, profileName, "code", {"coding":[{"system":"http://loinc.org","code":"85354-9"}]}), ...validateRequired(res, profileName, "subject"), ...validateReference(res, profileName, "subject", ["Patient"]), + ...validateExcluded(res, profileName, "effectiveTiming"), + ...validateExcluded(res, profileName, "effectiveInstant"), ...validateChoiceRequired(res, profileName, ["effectiveDateTime","effectivePeriod"]), ...validateReference(res, profileName, "hasMember", ["MolecularSequence","QuestionnaireResponse","Observation"]), ...validateReference(res, profileName, "derivedFrom", ["DocumentReference","ImagingStudy","Media","MolecularSequence","QuestionnaireResponse","Observation"]), @@ -2073,6 +2079,8 @@ export class USCoreBodyWeightProfile { ...validateFixedValue(res, profileName, "code", {"coding":[{"system":"http://loinc.org","code":"29463-7"}]}), ...validateRequired(res, profileName, "subject"), ...validateReference(res, profileName, "subject", ["Patient"]), + ...validateExcluded(res, profileName, "effectiveTiming"), + ...validateExcluded(res, profileName, "effectiveInstant"), ...validateChoiceRequired(res, profileName, ["effectiveDateTime","effectivePeriod"]), ...validateReference(res, profileName, "hasMember", ["MolecularSequence","QuestionnaireResponse","Observation"]), ...validateReference(res, profileName, "derivedFrom", ["DocumentReference","ImagingStudy","Media","MolecularSequence","QuestionnaireResponse","Observation"]), diff --git a/test/api/write-generator/multi-package/local-package.test.ts b/test/api/write-generator/multi-package/local-package.test.ts index 66ef88ef..de39a8ea 100644 --- a/test/api/write-generator/multi-package/local-package.test.ts +++ b/test/api/write-generator/multi-package/local-package.test.ts @@ -96,6 +96,52 @@ describe("Local Package Folder - Multi-Package Generation", async () => { }); }); + describe("TypeScript Generation with open type-sliced choice", async () => { + const result = await new APIBuilder({ logger: mkSilentLogger() }) + .localStructureDefinitions(localPackageConfig) + .typeSchema({ + treeShake: { + "example.folder.structures": { + "http://example.org/fhir/StructureDefinition/ExampleOpenChoiceCondition": {}, + "http://example.org/fhir/StructureDefinition/ExampleClosedChoiceCondition": {}, + }, + "hl7.fhir.r4.core": { + "http://hl7.org/fhir/StructureDefinition/Condition": {}, + }, + }, + }) + .typescript({ inMemoryOnly: true, generateProfile: true, withDebugComment: false }) + .generate(); + + it("should keep every open-sliced choice variant permitted", () => { + expect(result.success).toBeTrue(); + + const profileFile = + result.filesGenerated.typescript![ + "generated/types/example-folder-structures/profiles/Condition_ExampleOpenChoiceCondition.ts" + ]; + expect(profileFile).toBeDefined(); + expect(profileFile).not.toContain('validateExcluded(res, profileName, "onsetDateTime")'); + expect(profileFile).not.toContain('validateExcluded(res, profileName, "onsetPeriod")'); + expect(profileFile).not.toContain('validateExcluded(res, profileName, "onsetRange")'); + expect(profileFile).not.toContain('validateExcluded(res, profileName, "onsetString")'); + expect(profileFile).not.toContain('validateExcluded(res, profileName, "onsetAge")'); + }); + + it("should exclude every base variant not allowed by closed slicing", () => { + const profileFile = + result.filesGenerated.typescript![ + "generated/types/example-folder-structures/profiles/Condition_ExampleClosedChoiceCondition.ts" + ]; + expect(profileFile).toBeDefined(); + expect(profileFile).toContain('validateExcluded(res, profileName, "onsetDateTime")'); + expect(profileFile).toContain('validateExcluded(res, profileName, "onsetPeriod")'); + expect(profileFile).toContain('validateExcluded(res, profileName, "onsetRange")'); + expect(profileFile).toContain('validateExcluded(res, profileName, "onsetString")'); + expect(profileFile).not.toContain('validateExcluded(res, profileName, "onsetAge")'); + }); + }); + describe("Python Generation", async () => { const result = await new APIBuilder({ logger: mkSilentLogger() }) .localStructureDefinitions(localPackageConfig) diff --git a/test/unit/typeschema/utils.test.ts b/test/unit/typeschema/utils.test.ts index 20f024ee..5bbb75b2 100644 --- a/test/unit/typeschema/utils.test.ts +++ b/test/unit/typeschema/utils.test.ts @@ -544,6 +544,207 @@ describe("TypeSchema Index", () => { expect((result.fields?.fieldA as RegularField).type).toEqual(numberType); }); + it("keeps explicitly excluded instances prohibited in an open-sliced choice", () => { + const baseSchema: SpecializationTypeSchema = { + identifier: { + name: "Base" as Name, + package: "test", + kind: "resource", + version: "1.0.0", + url: "http://example.org/StructureDefinition/Base" as CanonicalUrl, + }, + }; + const constraintSchema: ProfileTypeSchema = { + identifier: { + name: "Constraint" as Name, + package: "test", + kind: "profile", + version: "1.0.0", + url: "http://example.org/StructureDefinition/Constraint" as CanonicalUrl, + }, + base: baseSchema.identifier, + fields: { + onset: { + choices: ["onsetAge"], + slicing: { rules: "open" }, + }, + onsetDateTime: { choiceOf: "onset", type: stringType }, + onsetPeriod: { choiceOf: "onset", type: stringType, excluded: true }, + onsetAge: { choiceOf: "onset", type: stringType }, + }, + }; + + const index = mkTypeSchemaIndex([baseSchema, constraintSchema], {}); + const result = index.flatProfile(constraintSchema); + + expect(result.fields?.onset).toMatchObject({ + choices: ["onsetAge", "onsetDateTime"], + prohibited: ["onsetPeriod"], + }); + }); + + it("keeps undeclared instances prohibited in a closed-sliced choice", () => { + const baseSchema: SpecializationTypeSchema = { + identifier: { + name: "Base" as Name, + package: "test", + kind: "resource", + version: "1.0.0", + url: "http://example.org/StructureDefinition/Base" as CanonicalUrl, + }, + fields: { + onset: { + choices: ["onsetDateTime", "onsetPeriod", "onsetRange", "onsetAge"], + }, + onsetDateTime: { choiceOf: "onset", type: stringType }, + onsetPeriod: { choiceOf: "onset", type: stringType }, + onsetRange: { choiceOf: "onset", type: stringType }, + onsetAge: { choiceOf: "onset", type: stringType }, + }, + }; + const constraintSchema: ProfileTypeSchema = { + identifier: { + name: "Constraint" as Name, + package: "test", + kind: "profile", + version: "1.0.0", + url: "http://example.org/StructureDefinition/Constraint" as CanonicalUrl, + }, + base: baseSchema.identifier, + fields: { + onset: { + choices: ["onsetAge"], + slicing: { rules: "closed" }, + }, + onsetDateTime: { choiceOf: "onset", type: stringType }, + onsetPeriod: { choiceOf: "onset", type: stringType }, + onsetAge: { choiceOf: "onset", type: stringType }, + }, + }; + + const index = mkTypeSchemaIndex([baseSchema, constraintSchema], {}); + const result = index.flatProfile(constraintSchema); + + expect(result.fields?.onset).toMatchObject({ + choices: ["onsetAge"], + prohibited: ["onsetDateTime", "onsetPeriod", "onsetRange"], + }); + }); + + it("inherits open slicing when a leaf profile only restates a typed instance", () => { + const baseSchema: SpecializationTypeSchema = { + identifier: { + name: "Base" as Name, + package: "test", + kind: "resource", + version: "1.0.0", + url: "http://example.org/StructureDefinition/Base" as CanonicalUrl, + }, + fields: { + onset: { choices: ["onsetDateTime", "onsetPeriod", "onsetAge"] }, + onsetDateTime: { choiceOf: "onset", type: stringType }, + onsetPeriod: { choiceOf: "onset", type: stringType }, + onsetAge: { choiceOf: "onset", type: stringType }, + }, + }; + const parentSchema: ProfileTypeSchema = { + identifier: { + name: "Parent" as Name, + package: "test", + kind: "profile", + version: "1.0.0", + url: "http://example.org/StructureDefinition/Parent" as CanonicalUrl, + }, + base: baseSchema.identifier, + fields: { + onset: { choices: ["onsetAge"], slicing: { rules: "open" } }, + onsetDateTime: { choiceOf: "onset", type: stringType }, + onsetPeriod: { choiceOf: "onset", type: stringType }, + onsetAge: { choiceOf: "onset", type: stringType }, + }, + }; + const leafSchema: ProfileTypeSchema = { + identifier: { + name: "Leaf" as Name, + package: "test", + kind: "profile", + version: "1.0.0", + url: "http://example.org/StructureDefinition/Leaf" as CanonicalUrl, + }, + base: parentSchema.identifier, + fields: { + onsetDateTime: { choiceOf: "onset", type: stringType }, + }, + }; + + const index = mkTypeSchemaIndex([baseSchema, parentSchema, leafSchema], {}); + const result = index.flatProfile(leafSchema); + + expect(result.fields?.onset).toMatchObject({ + choices: ["onsetDateTime", "onsetPeriod", "onsetAge"], + }); + expect(result.fields?.onset).not.toHaveProperty("prohibited"); + }); + + it("uses a leaf closed rule instead of an inherited open rule", () => { + const baseSchema: SpecializationTypeSchema = { + identifier: { + name: "Base" as Name, + package: "test", + kind: "resource", + version: "1.0.0", + url: "http://example.org/StructureDefinition/Base" as CanonicalUrl, + }, + fields: { + onset: { + choices: ["onsetDateTime", "onsetPeriod", "onsetRange", "onsetAge"], + }, + onsetDateTime: { choiceOf: "onset", type: stringType }, + onsetPeriod: { choiceOf: "onset", type: stringType }, + onsetRange: { choiceOf: "onset", type: stringType }, + onsetAge: { choiceOf: "onset", type: stringType }, + }, + }; + const parentSchema: ProfileTypeSchema = { + identifier: { + name: "Parent" as Name, + package: "test", + kind: "profile", + version: "1.0.0", + url: "http://example.org/StructureDefinition/Parent" as CanonicalUrl, + }, + base: baseSchema.identifier, + fields: { + onset: { choices: ["onsetAge"], slicing: { rules: "open" } }, + onsetDateTime: { choiceOf: "onset", type: stringType }, + onsetPeriod: { choiceOf: "onset", type: stringType }, + onsetAge: { choiceOf: "onset", type: stringType }, + }, + }; + const leafSchema: ProfileTypeSchema = { + identifier: { + name: "Leaf" as Name, + package: "test", + kind: "profile", + version: "1.0.0", + url: "http://example.org/StructureDefinition/Leaf" as CanonicalUrl, + }, + base: parentSchema.identifier, + fields: { + onset: { choices: ["onsetDateTime"], slicing: { rules: "closed" } }, + onsetDateTime: { choiceOf: "onset", type: stringType }, + }, + }; + + const index = mkTypeSchemaIndex([baseSchema, parentSchema, leafSchema], {}); + const result = index.flatProfile(leafSchema); + + expect(result.fields?.onset).toMatchObject({ + choices: ["onsetDateTime"], + prohibited: ["onsetPeriod", "onsetRange", "onsetAge"], + }); + }); + it("should throw error when no non-constraint schema is found", () => { const constraintSchema = { identifier: { From 635aaf2e042de369709bab0a781fbd9e003fad1d Mon Sep 17 00:00:00 2001 From: Malte Sussdorff Date: Sat, 18 Jul 2026 14:55:44 +0200 Subject: [PATCH 2/8] fix(typeschema): retain inherited choice ceilings (codegen-cmv) --- ...-choice-condition.structuredefinition.json | 2 +- ...-choice-condition.structuredefinition.json | 34 +++++ ...ctive-observation.structuredefinition.json | 48 +++++++ ...ctive-observation.structuredefinition.json | 34 +++++ src/typeschema/utils.ts | 126 +++++++++++------- .../multi-package/local-package.test.ts | 27 ++++ test/unit/typeschema/utils.test.ts | 52 ++++---- 7 files changed, 249 insertions(+), 74 deletions(-) create mode 100644 examples/typescript-custom-packages/structure-definitions/example-inherited-open-choice-condition.structuredefinition.json create mode 100644 examples/typescript-custom-packages/structure-definitions/example-open-effective-observation.structuredefinition.json create mode 100644 examples/typescript-custom-packages/structure-definitions/example-restricted-effective-observation.structuredefinition.json diff --git a/examples/typescript-custom-packages/structure-definitions/example-closed-choice-condition.structuredefinition.json b/examples/typescript-custom-packages/structure-definitions/example-closed-choice-condition.structuredefinition.json index e52f256d..50d22790 100644 --- a/examples/typescript-custom-packages/structure-definitions/example-closed-choice-condition.structuredefinition.json +++ b/examples/typescript-custom-packages/structure-definitions/example-closed-choice-condition.structuredefinition.json @@ -13,7 +13,7 @@ "kind": "resource", "abstract": false, "type": "Condition", - "baseDefinition": "http://hl7.org/fhir/StructureDefinition/Condition", + "baseDefinition": "http://example.org/fhir/StructureDefinition/ExampleOpenChoiceCondition", "derivation": "constraint", "differential": { "element": [ diff --git a/examples/typescript-custom-packages/structure-definitions/example-inherited-open-choice-condition.structuredefinition.json b/examples/typescript-custom-packages/structure-definitions/example-inherited-open-choice-condition.structuredefinition.json new file mode 100644 index 00000000..b53759c4 --- /dev/null +++ b/examples/typescript-custom-packages/structure-definitions/example-inherited-open-choice-condition.structuredefinition.json @@ -0,0 +1,34 @@ +{ + "resourceType": "StructureDefinition", + "id": "example-inherited-open-choice-condition", + "url": "http://example.org/fhir/StructureDefinition/ExampleInheritedOpenChoiceCondition", + "version": "0.0.1", + "name": "ExampleInheritedOpenChoiceCondition", + "title": "Example Inherited Open Choice Condition", + "status": "draft", + "date": "2024-01-01", + "publisher": "Atomic Example Studio", + "description": "A Condition profile that continues inherited open type slicing without redeclaring its rules.", + "fhirVersion": "4.0.1", + "kind": "resource", + "abstract": false, + "type": "Condition", + "baseDefinition": "http://example.org/fhir/StructureDefinition/ExampleOpenChoiceCondition", + "derivation": "constraint", + "differential": { + "element": [ + { + "id": "Condition.onset[x]:onsetPeriod", + "path": "Condition.onset[x]", + "sliceName": "onsetPeriod", + "min": 0, + "max": "1", + "type": [ + { + "code": "Period" + } + ] + } + ] + } +} diff --git a/examples/typescript-custom-packages/structure-definitions/example-open-effective-observation.structuredefinition.json b/examples/typescript-custom-packages/structure-definitions/example-open-effective-observation.structuredefinition.json new file mode 100644 index 00000000..4aaaafde --- /dev/null +++ b/examples/typescript-custom-packages/structure-definitions/example-open-effective-observation.structuredefinition.json @@ -0,0 +1,48 @@ +{ + "resourceType": "StructureDefinition", + "id": "example-open-effective-observation", + "url": "http://example.org/fhir/StructureDefinition/ExampleOpenEffectiveObservation", + "version": "0.0.1", + "name": "ExampleOpenEffectiveObservation", + "title": "Example Open Effective Observation", + "status": "draft", + "date": "2024-01-01", + "publisher": "Atomic Example Studio", + "description": "An Observation profile that openly slices an inherited restricted effective[x].", + "fhirVersion": "4.0.1", + "kind": "resource", + "abstract": false, + "type": "Observation", + "baseDefinition": "http://example.org/fhir/StructureDefinition/ExampleRestrictedEffectiveObservation", + "derivation": "constraint", + "differential": { + "element": [ + { + "id": "Observation.effective[x]", + "path": "Observation.effective[x]", + "slicing": { + "discriminator": [ + { + "type": "type", + "path": "$this" + } + ], + "rules": "open", + "ordered": false + } + }, + { + "id": "Observation.effective[x]:effectivePeriod", + "path": "Observation.effective[x]", + "sliceName": "effectivePeriod", + "min": 0, + "max": "1", + "type": [ + { + "code": "Period" + } + ] + } + ] + } +} diff --git a/examples/typescript-custom-packages/structure-definitions/example-restricted-effective-observation.structuredefinition.json b/examples/typescript-custom-packages/structure-definitions/example-restricted-effective-observation.structuredefinition.json new file mode 100644 index 00000000..57c8f982 --- /dev/null +++ b/examples/typescript-custom-packages/structure-definitions/example-restricted-effective-observation.structuredefinition.json @@ -0,0 +1,34 @@ +{ + "resourceType": "StructureDefinition", + "id": "example-restricted-effective-observation", + "url": "http://example.org/fhir/StructureDefinition/ExampleRestrictedEffectiveObservation", + "version": "0.0.1", + "name": "ExampleRestrictedEffectiveObservation", + "title": "Example Restricted Effective Observation", + "status": "draft", + "date": "2024-01-01", + "publisher": "Atomic Example Studio", + "description": "An Observation profile that restricts effective[x] to dateTime and Period.", + "fhirVersion": "4.0.1", + "kind": "resource", + "abstract": false, + "type": "Observation", + "baseDefinition": "http://hl7.org/fhir/StructureDefinition/Observation", + "derivation": "constraint", + "differential": { + "element": [ + { + "id": "Observation.effective[x]", + "path": "Observation.effective[x]", + "type": [ + { + "code": "dateTime" + }, + { + "code": "Period" + } + ] + } + ] + } +} diff --git a/src/typeschema/utils.ts b/src/typeschema/utils.ts index 3ff7d87a..94b0ab2e 100644 --- a/src/typeschema/utils.ts +++ b/src/typeschema/utils.ts @@ -367,6 +367,68 @@ export type TypeSchemaIndex = { type EntityTree = Record>>; +const isOpenLikeChoiceSlicing = (rules: string | undefined): boolean => rules === "open" || rules === "openAtEnd"; + +const choiceInstances = (fields: Record, declName: string): [string, ChoiceFieldInstance][] => + Object.entries(fields).filter( + (entry): entry is [string, ChoiceFieldInstance] => + isChoiceInstanceField(entry[1]) && entry[1].choiceOf === declName, + ); + +const choiceUniverse = ( + fields: Record, + baseFields: Record, + declName: string, + declField: ChoiceFieldDeclaration, +): string[] => { + const baseDeclaration = baseFields[declName]; + const baseChoices = isChoiceDeclarationField(baseDeclaration) ? baseDeclaration.choices : []; + return [ + ...new Set([...baseChoices, ...declField.choices, ...choiceInstances(fields, declName).map(([name]) => name)]), + ]; +}; + +type ChoiceConstraintState = { + permitted: Set; + effectiveSlicingRules?: string; +}; + +const applyChoiceConstraint = ( + state: ChoiceConstraintState, + fields: Record, + declName: string, +): ChoiceConstraintState => { + let permitted = new Set(state.permitted); + for (const [name, field] of choiceInstances(fields, declName)) { + if (field.excluded) permitted.delete(name); + } + + const declaration = fields[declName]; + if (!isChoiceDeclarationField(declaration)) { + const instances = choiceInstances(fields, declName); + if (instances.length === 0 || isOpenLikeChoiceSlicing(state.effectiveSlicingRules)) + return { ...state, permitted }; + const declaredChoices = new Set(instances.map(([name]) => name)); + return { ...state, permitted: new Set([...permitted].filter((name) => declaredChoices.has(name))) }; + } + + const explicitRules = declaration.slicing?.rules; + const effectiveSlicingRules = explicitRules ?? state.effectiveSlicingRules; + if (declaration.excluded) return { permitted: new Set(), effectiveSlicingRules }; + + const continuesInheritedOpenSlicing = + explicitRules === undefined && + isOpenLikeChoiceSlicing(effectiveSlicingRules) && + declaration.slicing !== undefined; + if (isOpenLikeChoiceSlicing(explicitRules) || continuesInheritedOpenSlicing) { + return { permitted, effectiveSlicingRules }; + } + + const declaredChoices = new Set(declaration.choices); + permitted = new Set([...permitted].filter((name) => declaredChoices.has(name))); + return { permitted, effectiveSlicingRules }; +}; + export const mkTypeSchemaIndex = ( schemas: TypeSchema[], { @@ -498,9 +560,10 @@ export const mkTypeSchemaIndex = ( return findLastSpecialization(resolved).identifier; }; - /** Narrow choice declarations by finding the most derived schema that constrains each choice group. - * When a child profile declares only specific choice instances without re-declaring the declaration, - * restrict the declaration's choices array to only the allowed instances. */ + /** Resolve the permitted choice variants through the profile hierarchy. + * Open slicing retains the inherited ceiling; closed declarations and ordinary + * choice constraints may narrow it, but no child profile may reintroduce a + * variant excluded by an ancestor. */ const narrowMergedChoiceDeclarations = ( mergedFields: Record, constraintSchemas: TypeSchema[], @@ -508,62 +571,29 @@ export const mkTypeSchemaIndex = ( ): Record => { const result = { ...mergedFields }; - const choiceUniverse = (declName: string, declField: ChoiceFieldDeclaration): string[] => { - const baseDeclaration = baseFields[declName]; - const baseChoices = isChoiceDeclarationField(baseDeclaration) ? baseDeclaration.choices : []; - const presentChoices = Object.entries(result) - .filter( - ([_, field]) => - isChoiceInstanceField(field) && (field as ChoiceFieldInstance).choiceOf === declName, - ) - .map(([name]) => name); - return [...new Set([...baseChoices, ...declField.choices, ...presentChoices])]; - }; - for (const [declName, declField] of Object.entries(result)) { if (!isChoiceDeclarationField(declField) || declField.excluded) continue; - const effectiveSlicingRules = constraintSchemas - .map((schema) => (schema as SpecializationTypeSchema).fields?.[declName]) - .find((field) => isChoiceDeclarationField(field) && field.slicing?.rules !== undefined)?.slicing?.rules; - if (effectiveSlicingRules === "open") { - const explicitlyExcluded = new Set( - Object.entries(result) - .filter( - ([_, field]) => - isChoiceInstanceField(field) && field.choiceOf === declName && field.excluded === true, - ) - .map(([name]) => name), - ); - result[declName] = { - ...declField, - choices: choiceUniverse(declName, declField).filter((name) => !explicitlyExcluded.has(name)), - }; - continue; + const universe = choiceUniverse(result, baseFields, declName, declField); + const baseDeclaration = baseFields[declName]; + let state: ChoiceConstraintState = { + permitted: new Set(isChoiceDeclarationField(baseDeclaration) ? baseDeclaration.choices : universe), + }; + for (const schema of constraintSchemas.slice().reverse()) { + const fields = (schema as SpecializationTypeSchema).fields; + if (fields) state = applyChoiceConstraint(state, fields, declName); } - for (const cSchema of constraintSchemas) { - const sFields = (cSchema as SpecializationTypeSchema).fields; - if (!sFields) continue; - const schemaDeclaration = sFields[declName]; - if (schemaDeclaration && isChoiceDeclarationField(schemaDeclaration)) break; - - const instancesInSchema = Object.entries(sFields) - .filter(([_, f]) => isChoiceInstanceField(f) && (f as ChoiceFieldInstance).choiceOf === declName) - .map(([name]) => name); - if (instancesInSchema.length === 0) continue; - - const allowed = new Set(instancesInSchema); - result[declName] = { ...declField, choices: declField.choices.filter((c) => allowed.has(c)) }; - break; - } + result[declName] = { ...declField, choices: universe.filter((name) => state.permitted.has(name)) }; } // Compute prohibited for all choice declarations for (const [declName, declField] of Object.entries(result)) { if (!isChoiceDeclarationField(declField)) continue; const permitted = new Set(declField.excluded ? [] : declField.choices); - const prohibited = choiceUniverse(declName, declField).filter((name) => !permitted.has(name)); + const prohibited = choiceUniverse(result, baseFields, declName, declField).filter( + (name) => !permitted.has(name), + ); const { prohibited: _, ...declarationWithoutProhibited } = declField; result[declName] = prohibited.length > 0 ? { ...declarationWithoutProhibited, prohibited } : declarationWithoutProhibited; diff --git a/test/api/write-generator/multi-package/local-package.test.ts b/test/api/write-generator/multi-package/local-package.test.ts index de39a8ea..270e4dde 100644 --- a/test/api/write-generator/multi-package/local-package.test.ts +++ b/test/api/write-generator/multi-package/local-package.test.ts @@ -104,6 +104,8 @@ describe("Local Package Folder - Multi-Package Generation", async () => { "example.folder.structures": { "http://example.org/fhir/StructureDefinition/ExampleOpenChoiceCondition": {}, "http://example.org/fhir/StructureDefinition/ExampleClosedChoiceCondition": {}, + "http://example.org/fhir/StructureDefinition/ExampleInheritedOpenChoiceCondition": {}, + "http://example.org/fhir/StructureDefinition/ExampleOpenEffectiveObservation": {}, }, "hl7.fhir.r4.core": { "http://hl7.org/fhir/StructureDefinition/Condition": {}, @@ -140,6 +142,31 @@ describe("Local Package Folder - Multi-Package Generation", async () => { expect(profileFile).toContain('validateExcluded(res, profileName, "onsetString")'); expect(profileFile).not.toContain('validateExcluded(res, profileName, "onsetAge")'); }); + + it("should inherit open slicing when a leaf only declares a typed slice", () => { + const profileFile = + result.filesGenerated.typescript![ + "generated/types/example-folder-structures/profiles/Condition_ExampleInheritedOpenChoiceCondition.ts" + ]; + expect(profileFile).toBeDefined(); + expect(profileFile).not.toContain('validateExcluded(res, profileName, "onsetDateTime")'); + expect(profileFile).not.toContain('validateExcluded(res, profileName, "onsetPeriod")'); + expect(profileFile).not.toContain('validateExcluded(res, profileName, "onsetRange")'); + expect(profileFile).not.toContain('validateExcluded(res, profileName, "onsetString")'); + expect(profileFile).not.toContain('validateExcluded(res, profileName, "onsetAge")'); + }); + + it("should not widen an inherited choice restriction through open slicing", () => { + const profileFile = + result.filesGenerated.typescript![ + "generated/types/example-folder-structures/profiles/Observation_ExampleOpenEffectiveObservation.ts" + ]; + expect(profileFile).toBeDefined(); + expect(profileFile).not.toContain('validateExcluded(res, profileName, "effectiveDateTime")'); + expect(profileFile).not.toContain('validateExcluded(res, profileName, "effectivePeriod")'); + expect(profileFile).toContain('validateExcluded(res, profileName, "effectiveTiming")'); + expect(profileFile).toContain('validateExcluded(res, profileName, "effectiveInstant")'); + }); }); describe("Python Generation", async () => { diff --git a/test/unit/typeschema/utils.test.ts b/test/unit/typeschema/utils.test.ts index 5bbb75b2..da1861e5 100644 --- a/test/unit/typeschema/utils.test.ts +++ b/test/unit/typeschema/utils.test.ts @@ -544,7 +544,7 @@ describe("TypeSchema Index", () => { expect((result.fields?.fieldA as RegularField).type).toEqual(numberType); }); - it("keeps explicitly excluded instances prohibited in an open-sliced choice", () => { + it("keeps explicitly excluded instances prohibited in open-like sliced choices", () => { const baseSchema: SpecializationTypeSchema = { identifier: { name: "Base" as Name, @@ -554,33 +554,35 @@ describe("TypeSchema Index", () => { url: "http://example.org/StructureDefinition/Base" as CanonicalUrl, }, }; - const constraintSchema: ProfileTypeSchema = { - identifier: { - name: "Constraint" as Name, - package: "test", - kind: "profile", - version: "1.0.0", - url: "http://example.org/StructureDefinition/Constraint" as CanonicalUrl, - }, - base: baseSchema.identifier, - fields: { - onset: { - choices: ["onsetAge"], - slicing: { rules: "open" }, + for (const rules of ["open", "openAtEnd"]) { + const constraintSchema: ProfileTypeSchema = { + identifier: { + name: `Constraint${rules}` as Name, + package: "test", + kind: "profile", + version: "1.0.0", + url: `http://example.org/StructureDefinition/Constraint${rules}` as CanonicalUrl, }, - onsetDateTime: { choiceOf: "onset", type: stringType }, - onsetPeriod: { choiceOf: "onset", type: stringType, excluded: true }, - onsetAge: { choiceOf: "onset", type: stringType }, - }, - }; + base: baseSchema.identifier, + fields: { + onset: { + choices: ["onsetAge"], + slicing: { rules }, + }, + onsetDateTime: { choiceOf: "onset", type: stringType }, + onsetPeriod: { choiceOf: "onset", type: stringType, excluded: true }, + onsetAge: { choiceOf: "onset", type: stringType }, + }, + }; - const index = mkTypeSchemaIndex([baseSchema, constraintSchema], {}); - const result = index.flatProfile(constraintSchema); + const index = mkTypeSchemaIndex([baseSchema, constraintSchema], {}); + const result = index.flatProfile(constraintSchema); - expect(result.fields?.onset).toMatchObject({ - choices: ["onsetAge", "onsetDateTime"], - prohibited: ["onsetPeriod"], - }); + expect(result.fields?.onset).toMatchObject({ + choices: ["onsetAge", "onsetDateTime"], + prohibited: ["onsetPeriod"], + }); + } }); it("keeps undeclared instances prohibited in a closed-sliced choice", () => { From 3033d4fe5fdf58e511a49c620665bb643629b951 Mon Sep 17 00:00:00 2001 From: Malte Sussdorff Date: Sat, 18 Jul 2026 15:03:19 +0200 Subject: [PATCH 3/8] fix(typeschema): preserve choice constraint provenance (codegen-cmv) --- ...-choice-condition.structuredefinition.json | 31 ++++++++++++++ src/typeschema/core/field-builder.ts | 42 +++++++++++++------ src/typeschema/types.ts | 2 + src/typeschema/utils.ts | 6 ++- .../multi-package/local-package.test.ts | 14 +++++++ 5 files changed, 80 insertions(+), 15 deletions(-) create mode 100644 examples/typescript-custom-packages/structure-definitions/example-root-restricted-choice-condition.structuredefinition.json diff --git a/examples/typescript-custom-packages/structure-definitions/example-root-restricted-choice-condition.structuredefinition.json b/examples/typescript-custom-packages/structure-definitions/example-root-restricted-choice-condition.structuredefinition.json new file mode 100644 index 00000000..dd273dad --- /dev/null +++ b/examples/typescript-custom-packages/structure-definitions/example-root-restricted-choice-condition.structuredefinition.json @@ -0,0 +1,31 @@ +{ + "resourceType": "StructureDefinition", + "id": "example-root-restricted-choice-condition", + "url": "http://example.org/fhir/StructureDefinition/ExampleRootRestrictedChoiceCondition", + "version": "0.0.1", + "name": "ExampleRootRestrictedChoiceCondition", + "title": "Example Root Restricted Choice Condition", + "status": "draft", + "date": "2024-01-01", + "publisher": "Atomic Example Studio", + "description": "A Condition profile that explicitly restricts an inherited open choice at its root.", + "fhirVersion": "4.0.1", + "kind": "resource", + "abstract": false, + "type": "Condition", + "baseDefinition": "http://example.org/fhir/StructureDefinition/ExampleOpenChoiceCondition", + "derivation": "constraint", + "differential": { + "element": [ + { + "id": "Condition.onset[x]", + "path": "Condition.onset[x]", + "type": [ + { + "code": "dateTime" + } + ] + } + ] + } +} diff --git a/src/typeschema/core/field-builder.ts b/src/typeschema/core/field-builder.ts index a603537f..c7b34f67 100644 --- a/src/typeschema/core/field-builder.ts +++ b/src/typeschema/core/field-builder.ts @@ -271,20 +271,31 @@ const computeMatchFromSchema = ( const choiceBaseName = (name: string): string => (name.endsWith("[x]") ? name.slice(0, -3) : name); -const resolveDifferentialSlicingRules = ( +type DifferentialChoiceMetadata = { + choiceTypesExplicit: boolean; + slicingRules?: string; + slicingRulesExplicit: boolean; +}; + +const resolveDifferentialChoiceMetadata = ( register: Register, fhirSchema: RichFHIRSchema, path: string[], - element: FHIRSchemaElement, -): string | undefined => { - if (!element.slicing || fhirSchema.derivation !== "constraint") return undefined; +): DifferentialChoiceMetadata | undefined => { + if (fhirSchema.derivation !== "constraint") return undefined; const structureDefinition = register.resolveSd(fhirSchema.package_meta, fhirSchema.url); + if (!structureDefinition) return undefined; const differentialElements = structureDefinition?.differential?.element ?? []; - return differentialElements.find((differentialElement) => { - if (!differentialElement.slicing?.rules) return false; - const differentialPath = differentialElement.path.split(".").slice(1).map(choiceBaseName); + const differentialElement = differentialElements.find((candidate) => { + if (candidate.sliceName !== undefined) return false; + const differentialPath = candidate.path.split(".").slice(1).map(choiceBaseName); return differentialPath.length === path.length && differentialPath.every((part, index) => part === path[index]); - })?.slicing?.rules; + }); + return { + choiceTypesExplicit: (differentialElement?.type?.length ?? 0) > 0, + slicingRules: differentialElement?.slicing?.rules, + slicingRulesExplicit: differentialElement?.slicing?.rules !== undefined, + }; }; const buildSlicing = ( @@ -373,6 +384,9 @@ export const mkField = ( logger?: CodegenLog, rawElement?: FHIRSchemaElement, ): Field => { + const differentialChoiceMetadata = element.choices + ? resolveDifferentialChoiceMetadata(register, fhirSchema, path) + : undefined; let binding: BindingIdentifier | undefined; let enumResult: EnumDefinition | undefined; if (element.binding) { @@ -436,14 +450,16 @@ export const mkField = ( array: element.array || false, min: element.min, max: element.max, - slicing: buildSlicing( - path[path.length - 1] ?? "", - element, - resolveDifferentialSlicingRules(register, fhirSchema, path, element), - ), + slicing: buildSlicing(path[path.length - 1] ?? "", element, differentialChoiceMetadata?.slicingRules), choices: element.choices, choiceOf: element.choiceOf, + ...(element.choices && differentialChoiceMetadata + ? { + choiceTypesExplicit: differentialChoiceMetadata.choiceTypesExplicit, + slicingRulesExplicit: differentialChoiceMetadata.slicingRulesExplicit, + } + : {}), binding: binding, enum: enumResult, diff --git a/src/typeschema/types.ts b/src/typeschema/types.ts index f38ed2f5..f102593f 100644 --- a/src/typeschema/types.ts +++ b/src/typeschema/types.ts @@ -388,6 +388,8 @@ export interface RegularField { export interface ChoiceFieldDeclaration { choices: string[]; prohibited?: string[]; + choiceTypesExplicit?: boolean; + slicingRulesExplicit?: boolean; required?: boolean; excluded?: boolean; array?: boolean; diff --git a/src/typeschema/utils.ts b/src/typeschema/utils.ts index 94b0ab2e..9bf1529b 100644 --- a/src/typeschema/utils.ts +++ b/src/typeschema/utils.ts @@ -412,15 +412,17 @@ const applyChoiceConstraint = ( return { ...state, permitted: new Set([...permitted].filter((name) => declaredChoices.has(name))) }; } - const explicitRules = declaration.slicing?.rules; + const explicitRules = declaration.slicingRulesExplicit === false ? undefined : declaration.slicing?.rules; const effectiveSlicingRules = explicitRules ?? state.effectiveSlicingRules; if (declaration.excluded) return { permitted: new Set(), effectiveSlicingRules }; const continuesInheritedOpenSlicing = + declaration.choiceTypesExplicit !== true && explicitRules === undefined && isOpenLikeChoiceSlicing(effectiveSlicingRules) && declaration.slicing !== undefined; - if (isOpenLikeChoiceSlicing(explicitRules) || continuesInheritedOpenSlicing) { + const declaresOnlyOpenSlicing = declaration.choiceTypesExplicit !== true && isOpenLikeChoiceSlicing(explicitRules); + if (declaresOnlyOpenSlicing || continuesInheritedOpenSlicing) { return { permitted, effectiveSlicingRules }; } diff --git a/test/api/write-generator/multi-package/local-package.test.ts b/test/api/write-generator/multi-package/local-package.test.ts index 270e4dde..fc19dec0 100644 --- a/test/api/write-generator/multi-package/local-package.test.ts +++ b/test/api/write-generator/multi-package/local-package.test.ts @@ -106,6 +106,7 @@ describe("Local Package Folder - Multi-Package Generation", async () => { "http://example.org/fhir/StructureDefinition/ExampleClosedChoiceCondition": {}, "http://example.org/fhir/StructureDefinition/ExampleInheritedOpenChoiceCondition": {}, "http://example.org/fhir/StructureDefinition/ExampleOpenEffectiveObservation": {}, + "http://example.org/fhir/StructureDefinition/ExampleRootRestrictedChoiceCondition": {}, }, "hl7.fhir.r4.core": { "http://hl7.org/fhir/StructureDefinition/Condition": {}, @@ -167,6 +168,19 @@ describe("Local Package Folder - Multi-Package Generation", async () => { expect(profileFile).toContain('validateExcluded(res, profileName, "effectiveTiming")'); expect(profileFile).toContain('validateExcluded(res, profileName, "effectiveInstant")'); }); + + it("should apply a child root type restriction under inherited open slicing", () => { + const profileFile = + result.filesGenerated.typescript![ + "generated/types/example-folder-structures/profiles/Condition_ExampleRootRestrictedChoiceCondition.ts" + ]; + expect(profileFile).toBeDefined(); + expect(profileFile).not.toContain('validateExcluded(res, profileName, "onsetDateTime")'); + expect(profileFile).toContain('validateExcluded(res, profileName, "onsetPeriod")'); + expect(profileFile).toContain('validateExcluded(res, profileName, "onsetRange")'); + expect(profileFile).toContain('validateExcluded(res, profileName, "onsetString")'); + expect(profileFile).toContain('validateExcluded(res, profileName, "onsetAge")'); + }); }); describe("Python Generation", async () => { From ea72fa8a538918e01bdda22a0083b94d081b73f1 Mon Sep 17 00:00:00 2001 From: Malte Sussdorff Date: Sat, 18 Jul 2026 15:13:54 +0200 Subject: [PATCH 4/8] chore(examples): regenerate sliced choice validators (codegen-cmv) --- .../python-r4-us-core/fhir_types/README.md | 6 +++ .../profiles/Extension_birthPlace.ts | 49 +++++++++++++++++++ .../profiles/Extension_birthTime.ts | 49 +++++++++++++++++++ .../profiles/Extension_own_prefix.ts | 49 +++++++++++++++++++ .../Observation_observation_bodyweight.ts | 2 + .../profiles/Observation_observation_bp.ts | 2 + .../Observation_observation_vitalsigns.ts | 2 + .../Extension_USCoreIndividualSexExtension.ts | 49 +++++++++++++++++++ ...ension_USCoreInterpreterNeededExtension.ts | 49 +++++++++++++++++++ .../Observation_USCoreBloodPressureProfile.ts | 2 + .../Observation_USCoreBodyWeightProfile.ts | 2 + .../Observation_USCoreVitalSignsProfile.ts | 2 + 12 files changed, 263 insertions(+) diff --git a/examples/python-r4-us-core/fhir_types/README.md b/examples/python-r4-us-core/fhir_types/README.md index d7532523..64cf5b55 100644 --- a/examples/python-r4-us-core/fhir_types/README.md +++ b/examples/python-r4-us-core/fhir_types/README.md @@ -18,7 +18,13 @@ ### Skipped Canonicals +- `http://example.org/fhir/StructureDefinition/ExampleClosedChoiceCondition` +- `http://example.org/fhir/StructureDefinition/ExampleInheritedOpenChoiceCondition` - `http://example.org/fhir/StructureDefinition/ExampleNotebook` +- `http://example.org/fhir/StructureDefinition/ExampleOpenChoiceCondition` +- `http://example.org/fhir/StructureDefinition/ExampleOpenEffectiveObservation` +- `http://example.org/fhir/StructureDefinition/ExampleRestrictedEffectiveObservation` +- `http://example.org/fhir/StructureDefinition/ExampleRootRestrictedChoiceCondition` - `http://example.org/fhir/StructureDefinition/ExampleTypedBundle` - `http://example.org/fhir/StructureDefinition/PatientMetaRequired` diff --git a/examples/typescript-r4-us-core/fhir-types/hl7-fhir-r4-core/profiles/Extension_birthPlace.ts b/examples/typescript-r4-us-core/fhir-types/hl7-fhir-r4-core/profiles/Extension_birthPlace.ts index 665eae66..c6974dbc 100644 --- a/examples/typescript-r4-us-core/fhir-types/hl7-fhir-r4-core/profiles/Extension_birthPlace.ts +++ b/examples/typescript-r4-us-core/fhir-types/hl7-fhir-r4-core/profiles/Extension_birthPlace.ts @@ -91,6 +91,55 @@ export class birthPlaceProfile { errors: [ ...validateRequired(res, profileName, "url"), ...validateFixedValue(res, profileName, "url", birthPlaceProfile.canonicalUrl), + ...validateExcluded(res, profileName, "valueBase64Binary"), + ...validateExcluded(res, profileName, "valueBoolean"), + ...validateExcluded(res, profileName, "valueCanonical"), + ...validateExcluded(res, profileName, "valueCode"), + ...validateExcluded(res, profileName, "valueDate"), + ...validateExcluded(res, profileName, "valueDateTime"), + ...validateExcluded(res, profileName, "valueDecimal"), + ...validateExcluded(res, profileName, "valueId"), + ...validateExcluded(res, profileName, "valueInstant"), + ...validateExcluded(res, profileName, "valueInteger"), + ...validateExcluded(res, profileName, "valueMarkdown"), + ...validateExcluded(res, profileName, "valueOid"), + ...validateExcluded(res, profileName, "valuePositiveInt"), + ...validateExcluded(res, profileName, "valueString"), + ...validateExcluded(res, profileName, "valueTime"), + ...validateExcluded(res, profileName, "valueUnsignedInt"), + ...validateExcluded(res, profileName, "valueUri"), + ...validateExcluded(res, profileName, "valueUrl"), + ...validateExcluded(res, profileName, "valueUuid"), + ...validateExcluded(res, profileName, "valueAge"), + ...validateExcluded(res, profileName, "valueAnnotation"), + ...validateExcluded(res, profileName, "valueAttachment"), + ...validateExcluded(res, profileName, "valueCodeableConcept"), + ...validateExcluded(res, profileName, "valueCoding"), + ...validateExcluded(res, profileName, "valueContactPoint"), + ...validateExcluded(res, profileName, "valueCount"), + ...validateExcluded(res, profileName, "valueDistance"), + ...validateExcluded(res, profileName, "valueDuration"), + ...validateExcluded(res, profileName, "valueHumanName"), + ...validateExcluded(res, profileName, "valueIdentifier"), + ...validateExcluded(res, profileName, "valueMoney"), + ...validateExcluded(res, profileName, "valuePeriod"), + ...validateExcluded(res, profileName, "valueQuantity"), + ...validateExcluded(res, profileName, "valueRange"), + ...validateExcluded(res, profileName, "valueRatio"), + ...validateExcluded(res, profileName, "valueReference"), + ...validateExcluded(res, profileName, "valueSampledData"), + ...validateExcluded(res, profileName, "valueSignature"), + ...validateExcluded(res, profileName, "valueTiming"), + ...validateExcluded(res, profileName, "valueContactDetail"), + ...validateExcluded(res, profileName, "valueContributor"), + ...validateExcluded(res, profileName, "valueDataRequirement"), + ...validateExcluded(res, profileName, "valueExpression"), + ...validateExcluded(res, profileName, "valueParameterDefinition"), + ...validateExcluded(res, profileName, "valueRelatedArtifact"), + ...validateExcluded(res, profileName, "valueTriggerDefinition"), + ...validateExcluded(res, profileName, "valueUsageContext"), + ...validateExcluded(res, profileName, "valueDosage"), + ...validateExcluded(res, profileName, "valueMeta"), ...validateChoiceRequired(res, profileName, ["valueAddress"]), ], warnings: [], diff --git a/examples/typescript-r4-us-core/fhir-types/hl7-fhir-r4-core/profiles/Extension_birthTime.ts b/examples/typescript-r4-us-core/fhir-types/hl7-fhir-r4-core/profiles/Extension_birthTime.ts index 66177168..762fdd21 100644 --- a/examples/typescript-r4-us-core/fhir-types/hl7-fhir-r4-core/profiles/Extension_birthTime.ts +++ b/examples/typescript-r4-us-core/fhir-types/hl7-fhir-r4-core/profiles/Extension_birthTime.ts @@ -90,6 +90,55 @@ export class birthTimeProfile { errors: [ ...validateRequired(res, profileName, "url"), ...validateFixedValue(res, profileName, "url", birthTimeProfile.canonicalUrl), + ...validateExcluded(res, profileName, "valueBase64Binary"), + ...validateExcluded(res, profileName, "valueBoolean"), + ...validateExcluded(res, profileName, "valueCanonical"), + ...validateExcluded(res, profileName, "valueCode"), + ...validateExcluded(res, profileName, "valueDate"), + ...validateExcluded(res, profileName, "valueDecimal"), + ...validateExcluded(res, profileName, "valueId"), + ...validateExcluded(res, profileName, "valueInstant"), + ...validateExcluded(res, profileName, "valueInteger"), + ...validateExcluded(res, profileName, "valueMarkdown"), + ...validateExcluded(res, profileName, "valueOid"), + ...validateExcluded(res, profileName, "valuePositiveInt"), + ...validateExcluded(res, profileName, "valueString"), + ...validateExcluded(res, profileName, "valueTime"), + ...validateExcluded(res, profileName, "valueUnsignedInt"), + ...validateExcluded(res, profileName, "valueUri"), + ...validateExcluded(res, profileName, "valueUrl"), + ...validateExcluded(res, profileName, "valueUuid"), + ...validateExcluded(res, profileName, "valueAddress"), + ...validateExcluded(res, profileName, "valueAge"), + ...validateExcluded(res, profileName, "valueAnnotation"), + ...validateExcluded(res, profileName, "valueAttachment"), + ...validateExcluded(res, profileName, "valueCodeableConcept"), + ...validateExcluded(res, profileName, "valueCoding"), + ...validateExcluded(res, profileName, "valueContactPoint"), + ...validateExcluded(res, profileName, "valueCount"), + ...validateExcluded(res, profileName, "valueDistance"), + ...validateExcluded(res, profileName, "valueDuration"), + ...validateExcluded(res, profileName, "valueHumanName"), + ...validateExcluded(res, profileName, "valueIdentifier"), + ...validateExcluded(res, profileName, "valueMoney"), + ...validateExcluded(res, profileName, "valuePeriod"), + ...validateExcluded(res, profileName, "valueQuantity"), + ...validateExcluded(res, profileName, "valueRange"), + ...validateExcluded(res, profileName, "valueRatio"), + ...validateExcluded(res, profileName, "valueReference"), + ...validateExcluded(res, profileName, "valueSampledData"), + ...validateExcluded(res, profileName, "valueSignature"), + ...validateExcluded(res, profileName, "valueTiming"), + ...validateExcluded(res, profileName, "valueContactDetail"), + ...validateExcluded(res, profileName, "valueContributor"), + ...validateExcluded(res, profileName, "valueDataRequirement"), + ...validateExcluded(res, profileName, "valueExpression"), + ...validateExcluded(res, profileName, "valueParameterDefinition"), + ...validateExcluded(res, profileName, "valueRelatedArtifact"), + ...validateExcluded(res, profileName, "valueTriggerDefinition"), + ...validateExcluded(res, profileName, "valueUsageContext"), + ...validateExcluded(res, profileName, "valueDosage"), + ...validateExcluded(res, profileName, "valueMeta"), ...validateChoiceRequired(res, profileName, ["valueDateTime"]), ], warnings: [], diff --git a/examples/typescript-r4-us-core/fhir-types/hl7-fhir-r4-core/profiles/Extension_own_prefix.ts b/examples/typescript-r4-us-core/fhir-types/hl7-fhir-r4-core/profiles/Extension_own_prefix.ts index 41d42769..ec4fd4aa 100644 --- a/examples/typescript-r4-us-core/fhir-types/hl7-fhir-r4-core/profiles/Extension_own_prefix.ts +++ b/examples/typescript-r4-us-core/fhir-types/hl7-fhir-r4-core/profiles/Extension_own_prefix.ts @@ -90,6 +90,55 @@ export class own_prefixProfile { errors: [ ...validateRequired(res, profileName, "url"), ...validateFixedValue(res, profileName, "url", own_prefixProfile.canonicalUrl), + ...validateExcluded(res, profileName, "valueBase64Binary"), + ...validateExcluded(res, profileName, "valueBoolean"), + ...validateExcluded(res, profileName, "valueCanonical"), + ...validateExcluded(res, profileName, "valueCode"), + ...validateExcluded(res, profileName, "valueDate"), + ...validateExcluded(res, profileName, "valueDateTime"), + ...validateExcluded(res, profileName, "valueDecimal"), + ...validateExcluded(res, profileName, "valueId"), + ...validateExcluded(res, profileName, "valueInstant"), + ...validateExcluded(res, profileName, "valueInteger"), + ...validateExcluded(res, profileName, "valueMarkdown"), + ...validateExcluded(res, profileName, "valueOid"), + ...validateExcluded(res, profileName, "valuePositiveInt"), + ...validateExcluded(res, profileName, "valueTime"), + ...validateExcluded(res, profileName, "valueUnsignedInt"), + ...validateExcluded(res, profileName, "valueUri"), + ...validateExcluded(res, profileName, "valueUrl"), + ...validateExcluded(res, profileName, "valueUuid"), + ...validateExcluded(res, profileName, "valueAddress"), + ...validateExcluded(res, profileName, "valueAge"), + ...validateExcluded(res, profileName, "valueAnnotation"), + ...validateExcluded(res, profileName, "valueAttachment"), + ...validateExcluded(res, profileName, "valueCodeableConcept"), + ...validateExcluded(res, profileName, "valueCoding"), + ...validateExcluded(res, profileName, "valueContactPoint"), + ...validateExcluded(res, profileName, "valueCount"), + ...validateExcluded(res, profileName, "valueDistance"), + ...validateExcluded(res, profileName, "valueDuration"), + ...validateExcluded(res, profileName, "valueHumanName"), + ...validateExcluded(res, profileName, "valueIdentifier"), + ...validateExcluded(res, profileName, "valueMoney"), + ...validateExcluded(res, profileName, "valuePeriod"), + ...validateExcluded(res, profileName, "valueQuantity"), + ...validateExcluded(res, profileName, "valueRange"), + ...validateExcluded(res, profileName, "valueRatio"), + ...validateExcluded(res, profileName, "valueReference"), + ...validateExcluded(res, profileName, "valueSampledData"), + ...validateExcluded(res, profileName, "valueSignature"), + ...validateExcluded(res, profileName, "valueTiming"), + ...validateExcluded(res, profileName, "valueContactDetail"), + ...validateExcluded(res, profileName, "valueContributor"), + ...validateExcluded(res, profileName, "valueDataRequirement"), + ...validateExcluded(res, profileName, "valueExpression"), + ...validateExcluded(res, profileName, "valueParameterDefinition"), + ...validateExcluded(res, profileName, "valueRelatedArtifact"), + ...validateExcluded(res, profileName, "valueTriggerDefinition"), + ...validateExcluded(res, profileName, "valueUsageContext"), + ...validateExcluded(res, profileName, "valueDosage"), + ...validateExcluded(res, profileName, "valueMeta"), ...validateChoiceRequired(res, profileName, ["valueString"]), ], warnings: [], diff --git a/examples/typescript-r4-us-core/fhir-types/hl7-fhir-r4-core/profiles/Observation_observation_bodyweight.ts b/examples/typescript-r4-us-core/fhir-types/hl7-fhir-r4-core/profiles/Observation_observation_bodyweight.ts index 1715c895..47f6cadb 100644 --- a/examples/typescript-r4-us-core/fhir-types/hl7-fhir-r4-core/profiles/Observation_observation_bodyweight.ts +++ b/examples/typescript-r4-us-core/fhir-types/hl7-fhir-r4-core/profiles/Observation_observation_bodyweight.ts @@ -209,6 +209,8 @@ export class observation_bodyweightProfile { ...validateFixedValue(res, profileName, "code", {"coding":[{"code":"29463-7","system":"http://loinc.org"}]}), ...validateRequired(res, profileName, "subject"), ...validateReference(res, profileName, "subject", ["Patient"]), + ...validateExcluded(res, profileName, "effectiveTiming"), + ...validateExcluded(res, profileName, "effectiveInstant"), ...validateChoiceRequired(res, profileName, ["effectiveDateTime","effectivePeriod"]), ...validateReference(res, profileName, "hasMember", ["MolecularSequence","QuestionnaireResponse","Observation"]), ...validateReference(res, profileName, "derivedFrom", ["DocumentReference","ImagingStudy","Media","MolecularSequence","QuestionnaireResponse","Observation"]), diff --git a/examples/typescript-r4-us-core/fhir-types/hl7-fhir-r4-core/profiles/Observation_observation_bp.ts b/examples/typescript-r4-us-core/fhir-types/hl7-fhir-r4-core/profiles/Observation_observation_bp.ts index dc66a72c..0bbeb8d8 100644 --- a/examples/typescript-r4-us-core/fhir-types/hl7-fhir-r4-core/profiles/Observation_observation_bp.ts +++ b/examples/typescript-r4-us-core/fhir-types/hl7-fhir-r4-core/profiles/Observation_observation_bp.ts @@ -290,6 +290,8 @@ export class observation_bpProfile { ...validateFixedValue(res, profileName, "code", {"coding":[{"code":"85354-9","system":"http://loinc.org"}]}), ...validateRequired(res, profileName, "subject"), ...validateReference(res, profileName, "subject", ["Patient"]), + ...validateExcluded(res, profileName, "effectiveTiming"), + ...validateExcluded(res, profileName, "effectiveInstant"), ...validateChoiceRequired(res, profileName, ["effectiveDateTime","effectivePeriod"]), ...validateReference(res, profileName, "hasMember", ["MolecularSequence","QuestionnaireResponse","Observation"]), ...validateReference(res, profileName, "derivedFrom", ["DocumentReference","ImagingStudy","Media","MolecularSequence","QuestionnaireResponse","Observation"]), diff --git a/examples/typescript-r4-us-core/fhir-types/hl7-fhir-r4-core/profiles/Observation_observation_vitalsigns.ts b/examples/typescript-r4-us-core/fhir-types/hl7-fhir-r4-core/profiles/Observation_observation_vitalsigns.ts index 66f29771..19d572f4 100644 --- a/examples/typescript-r4-us-core/fhir-types/hl7-fhir-r4-core/profiles/Observation_observation_vitalsigns.ts +++ b/examples/typescript-r4-us-core/fhir-types/hl7-fhir-r4-core/profiles/Observation_observation_vitalsigns.ts @@ -202,6 +202,8 @@ export class observation_vitalsignsProfile { ...validateRequired(res, profileName, "code"), ...validateRequired(res, profileName, "subject"), ...validateReference(res, profileName, "subject", ["Patient"]), + ...validateExcluded(res, profileName, "effectiveTiming"), + ...validateExcluded(res, profileName, "effectiveInstant"), ...validateChoiceRequired(res, profileName, ["effectiveDateTime","effectivePeriod"]), ...validateReference(res, profileName, "hasMember", ["MolecularSequence","QuestionnaireResponse","Observation"]), ...validateReference(res, profileName, "derivedFrom", ["DocumentReference","ImagingStudy","Media","MolecularSequence","QuestionnaireResponse","Observation"]), diff --git a/examples/typescript-r4-us-core/fhir-types/hl7-fhir-us-core/profiles/Extension_USCoreIndividualSexExtension.ts b/examples/typescript-r4-us-core/fhir-types/hl7-fhir-us-core/profiles/Extension_USCoreIndividualSexExtension.ts index bc040e76..b04e1728 100644 --- a/examples/typescript-r4-us-core/fhir-types/hl7-fhir-us-core/profiles/Extension_USCoreIndividualSexExtension.ts +++ b/examples/typescript-r4-us-core/fhir-types/hl7-fhir-us-core/profiles/Extension_USCoreIndividualSexExtension.ts @@ -91,6 +91,55 @@ export class USCoreIndividualSexExtensionProfile { errors: [ ...validateRequired(res, profileName, "url"), ...validateFixedValue(res, profileName, "url", USCoreIndividualSexExtensionProfile.canonicalUrl), + ...validateExcluded(res, profileName, "valueBase64Binary"), + ...validateExcluded(res, profileName, "valueBoolean"), + ...validateExcluded(res, profileName, "valueCanonical"), + ...validateExcluded(res, profileName, "valueCode"), + ...validateExcluded(res, profileName, "valueDate"), + ...validateExcluded(res, profileName, "valueDateTime"), + ...validateExcluded(res, profileName, "valueDecimal"), + ...validateExcluded(res, profileName, "valueId"), + ...validateExcluded(res, profileName, "valueInstant"), + ...validateExcluded(res, profileName, "valueInteger"), + ...validateExcluded(res, profileName, "valueMarkdown"), + ...validateExcluded(res, profileName, "valueOid"), + ...validateExcluded(res, profileName, "valuePositiveInt"), + ...validateExcluded(res, profileName, "valueString"), + ...validateExcluded(res, profileName, "valueTime"), + ...validateExcluded(res, profileName, "valueUnsignedInt"), + ...validateExcluded(res, profileName, "valueUri"), + ...validateExcluded(res, profileName, "valueUrl"), + ...validateExcluded(res, profileName, "valueUuid"), + ...validateExcluded(res, profileName, "valueAddress"), + ...validateExcluded(res, profileName, "valueAge"), + ...validateExcluded(res, profileName, "valueAnnotation"), + ...validateExcluded(res, profileName, "valueAttachment"), + ...validateExcluded(res, profileName, "valueCodeableConcept"), + ...validateExcluded(res, profileName, "valueContactPoint"), + ...validateExcluded(res, profileName, "valueCount"), + ...validateExcluded(res, profileName, "valueDistance"), + ...validateExcluded(res, profileName, "valueDuration"), + ...validateExcluded(res, profileName, "valueHumanName"), + ...validateExcluded(res, profileName, "valueIdentifier"), + ...validateExcluded(res, profileName, "valueMoney"), + ...validateExcluded(res, profileName, "valuePeriod"), + ...validateExcluded(res, profileName, "valueQuantity"), + ...validateExcluded(res, profileName, "valueRange"), + ...validateExcluded(res, profileName, "valueRatio"), + ...validateExcluded(res, profileName, "valueReference"), + ...validateExcluded(res, profileName, "valueSampledData"), + ...validateExcluded(res, profileName, "valueSignature"), + ...validateExcluded(res, profileName, "valueTiming"), + ...validateExcluded(res, profileName, "valueContactDetail"), + ...validateExcluded(res, profileName, "valueContributor"), + ...validateExcluded(res, profileName, "valueDataRequirement"), + ...validateExcluded(res, profileName, "valueExpression"), + ...validateExcluded(res, profileName, "valueParameterDefinition"), + ...validateExcluded(res, profileName, "valueRelatedArtifact"), + ...validateExcluded(res, profileName, "valueTriggerDefinition"), + ...validateExcluded(res, profileName, "valueUsageContext"), + ...validateExcluded(res, profileName, "valueDosage"), + ...validateExcluded(res, profileName, "valueMeta"), ...validateChoiceRequired(res, profileName, ["valueCoding"]), ], warnings: [], diff --git a/examples/typescript-r4-us-core/fhir-types/hl7-fhir-us-core/profiles/Extension_USCoreInterpreterNeededExtension.ts b/examples/typescript-r4-us-core/fhir-types/hl7-fhir-us-core/profiles/Extension_USCoreInterpreterNeededExtension.ts index c6f1c9b7..7a6cc229 100644 --- a/examples/typescript-r4-us-core/fhir-types/hl7-fhir-us-core/profiles/Extension_USCoreInterpreterNeededExtension.ts +++ b/examples/typescript-r4-us-core/fhir-types/hl7-fhir-us-core/profiles/Extension_USCoreInterpreterNeededExtension.ts @@ -91,6 +91,55 @@ export class USCoreInterpreterNeededExtensionProfile { errors: [ ...validateRequired(res, profileName, "url"), ...validateFixedValue(res, profileName, "url", USCoreInterpreterNeededExtensionProfile.canonicalUrl), + ...validateExcluded(res, profileName, "valueBase64Binary"), + ...validateExcluded(res, profileName, "valueBoolean"), + ...validateExcluded(res, profileName, "valueCanonical"), + ...validateExcluded(res, profileName, "valueCode"), + ...validateExcluded(res, profileName, "valueDate"), + ...validateExcluded(res, profileName, "valueDateTime"), + ...validateExcluded(res, profileName, "valueDecimal"), + ...validateExcluded(res, profileName, "valueId"), + ...validateExcluded(res, profileName, "valueInstant"), + ...validateExcluded(res, profileName, "valueInteger"), + ...validateExcluded(res, profileName, "valueMarkdown"), + ...validateExcluded(res, profileName, "valueOid"), + ...validateExcluded(res, profileName, "valuePositiveInt"), + ...validateExcluded(res, profileName, "valueString"), + ...validateExcluded(res, profileName, "valueTime"), + ...validateExcluded(res, profileName, "valueUnsignedInt"), + ...validateExcluded(res, profileName, "valueUri"), + ...validateExcluded(res, profileName, "valueUrl"), + ...validateExcluded(res, profileName, "valueUuid"), + ...validateExcluded(res, profileName, "valueAddress"), + ...validateExcluded(res, profileName, "valueAge"), + ...validateExcluded(res, profileName, "valueAnnotation"), + ...validateExcluded(res, profileName, "valueAttachment"), + ...validateExcluded(res, profileName, "valueCodeableConcept"), + ...validateExcluded(res, profileName, "valueContactPoint"), + ...validateExcluded(res, profileName, "valueCount"), + ...validateExcluded(res, profileName, "valueDistance"), + ...validateExcluded(res, profileName, "valueDuration"), + ...validateExcluded(res, profileName, "valueHumanName"), + ...validateExcluded(res, profileName, "valueIdentifier"), + ...validateExcluded(res, profileName, "valueMoney"), + ...validateExcluded(res, profileName, "valuePeriod"), + ...validateExcluded(res, profileName, "valueQuantity"), + ...validateExcluded(res, profileName, "valueRange"), + ...validateExcluded(res, profileName, "valueRatio"), + ...validateExcluded(res, profileName, "valueReference"), + ...validateExcluded(res, profileName, "valueSampledData"), + ...validateExcluded(res, profileName, "valueSignature"), + ...validateExcluded(res, profileName, "valueTiming"), + ...validateExcluded(res, profileName, "valueContactDetail"), + ...validateExcluded(res, profileName, "valueContributor"), + ...validateExcluded(res, profileName, "valueDataRequirement"), + ...validateExcluded(res, profileName, "valueExpression"), + ...validateExcluded(res, profileName, "valueParameterDefinition"), + ...validateExcluded(res, profileName, "valueRelatedArtifact"), + ...validateExcluded(res, profileName, "valueTriggerDefinition"), + ...validateExcluded(res, profileName, "valueUsageContext"), + ...validateExcluded(res, profileName, "valueDosage"), + ...validateExcluded(res, profileName, "valueMeta"), ...validateChoiceRequired(res, profileName, ["valueCoding"]), ], warnings: [], 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 d46ab83f..7f608f6e 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 @@ -408,6 +408,8 @@ export class USCoreBloodPressureProfile { ...validateFixedValue(res, profileName, "code", {"coding":[{"system":"http://loinc.org","code":"85354-9"}]}), ...validateRequired(res, profileName, "subject"), ...validateReference(res, profileName, "subject", ["Patient"]), + ...validateExcluded(res, profileName, "effectiveTiming"), + ...validateExcluded(res, profileName, "effectiveInstant"), ...validateChoiceRequired(res, profileName, ["effectiveDateTime","effectivePeriod"]), ...validateReference(res, profileName, "hasMember", ["MolecularSequence","QuestionnaireResponse","Observation"]), ...validateReference(res, profileName, "derivedFrom", ["DocumentReference","ImagingStudy","Media","MolecularSequence","QuestionnaireResponse","Observation"]), 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 6b51714b..4075f070 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 @@ -327,6 +327,8 @@ export class USCoreBodyWeightProfile { ...validateFixedValue(res, profileName, "code", {"coding":[{"system":"http://loinc.org","code":"29463-7"}]}), ...validateRequired(res, profileName, "subject"), ...validateReference(res, profileName, "subject", ["Patient"]), + ...validateExcluded(res, profileName, "effectiveTiming"), + ...validateExcluded(res, profileName, "effectiveInstant"), ...validateChoiceRequired(res, profileName, ["effectiveDateTime","effectivePeriod"]), ...validateReference(res, profileName, "hasMember", ["MolecularSequence","QuestionnaireResponse","Observation"]), ...validateReference(res, profileName, "derivedFrom", ["DocumentReference","ImagingStudy","Media","MolecularSequence","QuestionnaireResponse","Observation"]), 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 b9b41eec..1e117de7 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 @@ -330,6 +330,8 @@ export class USCoreVitalSignsProfile { ...validateRequired(res, profileName, "code"), ...validateRequired(res, profileName, "subject"), ...validateReference(res, profileName, "subject", ["Patient"]), + ...validateExcluded(res, profileName, "effectiveTiming"), + ...validateExcluded(res, profileName, "effectiveInstant"), ...validateChoiceRequired(res, profileName, ["effectiveDateTime","effectivePeriod"]), ...validateReference(res, profileName, "hasMember", ["MolecularSequence","QuestionnaireResponse","Observation"]), ...validateReference(res, profileName, "derivedFrom", ["DocumentReference","ImagingStudy","Media","MolecularSequence","QuestionnaireResponse","Observation"]), From 4d1a8d9639ae8d41fa06497633e850ffad58481a Mon Sep 17 00:00:00 2001 From: Malte Sussdorff Date: Sat, 18 Jul 2026 16:04:22 +0200 Subject: [PATCH 5/8] fix(typeschema): stabilize collision ordering (codegen-cmv) --- .../python-r4-us-core/fhir_types/README.md | 174 ++++++++--------- .../fhir-types/README.md | 176 +++++++++--------- src/typeschema/collision-order.ts | 31 +++ src/typeschema/index.ts | 9 +- src/typeschema/ir/report.ts | 14 +- test/unit/typeschema/collision-order.test.ts | 36 ++++ 6 files changed, 261 insertions(+), 179 deletions(-) create mode 100644 src/typeschema/collision-order.ts create mode 100644 test/unit/typeschema/collision-order.test.ts diff --git a/examples/python-r4-us-core/fhir_types/README.md b/examples/python-r4-us-core/fhir_types/README.md index 64cf5b55..5ef82f9c 100644 --- a/examples/python-r4-us-core/fhir_types/README.md +++ b/examples/python-r4-us-core/fhir_types/README.md @@ -3632,8 +3632,8 @@ and check `/collisions//1.json, 2.json, ...` files. - Version 3: Consent (hl7.fhir.r4.examples#4.0.1) - `urn:fhir:binding:ConsentContentClass` (4 versions) - Version 1 (auto): Consent (hl7.fhir.r4.core#4.0.1), Consent (hl7.fhir.r4.core#4.0.1), Consent (hl7.fhir.r4.core#4.0.1), Consent (hl7.fhir.r4.core#4.0.1), Consent (hl7.fhir.r4.core#4.0.1), Consent (hl7.fhir.r4.core#4.0.1), Consent (hl7.fhir.r4.core#4.0.1), Consent (hl7.fhir.r4.core#4.0.1), Consent (hl7.fhir.r4.core#4.0.1), Consent (hl7.fhir.r4.core#4.0.1), Consent (hl7.fhir.r4.core#4.0.1), Contract (hl7.fhir.r4.core#4.0.1), Contract (hl7.fhir.r4.core#4.0.1), Contract (hl7.fhir.r4.core#4.0.1), Contract (hl7.fhir.r4.core#4.0.1), Contract (hl7.fhir.r4.core#4.0.1), Contract (hl7.fhir.r4.core#4.0.1), Contract (hl7.fhir.r4.core#4.0.1), Contract (hl7.fhir.r4.core#4.0.1), Contract (hl7.fhir.r4.core#4.0.1), Contract (hl7.fhir.r4.core#4.0.1), Contract (hl7.fhir.r4.core#4.0.1) - - Version 2: Contract (hl7.fhir.r5.core#5.0.0), Contract (hl7.fhir.r5.core#5.0.0), Contract (hl7.fhir.r5.core#5.0.0) - - Version 3: Consent (hl7.fhir.r5.core#5.0.0), Consent (hl7.fhir.r5.core#5.0.0), Consent (hl7.fhir.r5.core#5.0.0) + - Version 2: Consent (hl7.fhir.r5.core#5.0.0), Consent (hl7.fhir.r5.core#5.0.0), Consent (hl7.fhir.r5.core#5.0.0) + - Version 3: Contract (hl7.fhir.r5.core#5.0.0), Contract (hl7.fhir.r5.core#5.0.0), Contract (hl7.fhir.r5.core#5.0.0) - Version 4: Consent (hl7.fhir.r4.examples#4.0.1), Contract (hl7.fhir.r4.examples#4.0.1) - `urn:fhir:binding:ConsentContentCode` (3 versions) - Version 1 (auto): Consent (hl7.fhir.r4.core#4.0.1), Consent (hl7.fhir.r4.core#4.0.1), Consent (hl7.fhir.r4.core#4.0.1), Consent (hl7.fhir.r4.core#4.0.1), Consent (hl7.fhir.r4.core#4.0.1), Consent (hl7.fhir.r4.core#4.0.1), Consent (hl7.fhir.r4.core#4.0.1), Consent (hl7.fhir.r4.core#4.0.1), Consent (hl7.fhir.r4.core#4.0.1), Consent (hl7.fhir.r4.core#4.0.1), Consent (hl7.fhir.r4.core#4.0.1) @@ -4171,8 +4171,8 @@ and check `/collisions//1.json, 2.json, ...` files. - Version 3: FamilyMemberHistory (hl7.fhir.r4.examples#4.0.1) - `urn:fhir:binding:FHIRAllTypes` (3 versions) - Version 1 (auto): DataRequirement (hl7.fhir.r4.core#4.0.1), DataRequirement (hl7.fhir.r4.core#4.0.1), DataRequirement (hl7.fhir.r4.core#4.0.1), DataRequirement (hl7.fhir.r4.core#4.0.1), DataRequirement (hl7.fhir.r4.core#4.0.1), DataRequirement (hl7.fhir.r4.core#4.0.1), DataRequirement (hl7.fhir.r4.core#4.0.1), DataRequirement (hl7.fhir.r4.core#4.0.1), DataRequirement (hl7.fhir.r4.core#4.0.1), DataRequirement (hl7.fhir.r4.core#4.0.1), DataRequirement (hl7.fhir.r4.core#4.0.1), OperationDefinition (hl7.fhir.r4.core#4.0.1), OperationDefinition (hl7.fhir.r4.core#4.0.1), OperationDefinition (hl7.fhir.r4.core#4.0.1), OperationDefinition (hl7.fhir.r4.core#4.0.1), OperationDefinition (hl7.fhir.r4.core#4.0.1), OperationDefinition (hl7.fhir.r4.core#4.0.1), OperationDefinition (hl7.fhir.r4.core#4.0.1), OperationDefinition (hl7.fhir.r4.core#4.0.1), OperationDefinition (hl7.fhir.r4.core#4.0.1), OperationDefinition (hl7.fhir.r4.core#4.0.1), OperationDefinition (hl7.fhir.r4.core#4.0.1), ParameterDefinition (hl7.fhir.r4.core#4.0.1), ParameterDefinition (hl7.fhir.r4.core#4.0.1), ParameterDefinition (hl7.fhir.r4.core#4.0.1), ParameterDefinition (hl7.fhir.r4.core#4.0.1), ParameterDefinition (hl7.fhir.r4.core#4.0.1), ParameterDefinition (hl7.fhir.r4.core#4.0.1), ParameterDefinition (hl7.fhir.r4.core#4.0.1), ParameterDefinition (hl7.fhir.r4.core#4.0.1), ParameterDefinition (hl7.fhir.r4.core#4.0.1), ParameterDefinition (hl7.fhir.r4.core#4.0.1), ParameterDefinition (hl7.fhir.r4.core#4.0.1) - - Version 2: OperationDefinition (hl7.fhir.r5.core#5.0.0), OperationDefinition (hl7.fhir.r5.core#5.0.0), OperationDefinition (hl7.fhir.r5.core#5.0.0) - - Version 3: DataRequirement (hl7.fhir.r4.examples#4.0.1), OperationDefinition (hl7.fhir.r4.examples#4.0.1), ParameterDefinition (hl7.fhir.r4.examples#4.0.1) + - Version 2: DataRequirement (hl7.fhir.r4.examples#4.0.1), OperationDefinition (hl7.fhir.r4.examples#4.0.1), ParameterDefinition (hl7.fhir.r4.examples#4.0.1) + - Version 3: OperationDefinition (hl7.fhir.r5.core#5.0.0), OperationDefinition (hl7.fhir.r5.core#5.0.0), OperationDefinition (hl7.fhir.r5.core#5.0.0) - `urn:fhir:binding:FHIRDefinedType` (2 versions) - Version 1 (auto): TestScript (hl7.fhir.r4.core#4.0.1), TestScript (hl7.fhir.r4.core#4.0.1), TestScript (hl7.fhir.r4.core#4.0.1), TestScript (hl7.fhir.r4.core#4.0.1), TestScript (hl7.fhir.r4.core#4.0.1), TestScript (hl7.fhir.r4.core#4.0.1), TestScript (hl7.fhir.r4.core#4.0.1), TestScript (hl7.fhir.r4.core#4.0.1), TestScript (hl7.fhir.r4.core#4.0.1), TestScript (hl7.fhir.r4.core#4.0.1), TestScript (hl7.fhir.r4.core#4.0.1) - Version 2: TestScript (hl7.fhir.r4.examples#4.0.1) @@ -4724,8 +4724,8 @@ and check `/collisions//1.json, 2.json, ...` files. - `urn:fhir:binding:NoteType` (4 versions) - Version 1 (auto): ClaimResponse (hl7.fhir.r4.core#4.0.1), ClaimResponse (hl7.fhir.r4.core#4.0.1), ClaimResponse (hl7.fhir.r4.core#4.0.1), ClaimResponse (hl7.fhir.r4.core#4.0.1), ClaimResponse (hl7.fhir.r4.core#4.0.1), ClaimResponse (hl7.fhir.r4.core#4.0.1), ClaimResponse (hl7.fhir.r4.core#4.0.1), ClaimResponse (hl7.fhir.r4.core#4.0.1), ClaimResponse (hl7.fhir.r4.core#4.0.1), ClaimResponse (hl7.fhir.r4.core#4.0.1), ClaimResponse (hl7.fhir.r4.core#4.0.1), ExplanationOfBenefit (hl7.fhir.r4.core#4.0.1), ExplanationOfBenefit (hl7.fhir.r4.core#4.0.1), ExplanationOfBenefit (hl7.fhir.r4.core#4.0.1), ExplanationOfBenefit (hl7.fhir.r4.core#4.0.1), ExplanationOfBenefit (hl7.fhir.r4.core#4.0.1), ExplanationOfBenefit (hl7.fhir.r4.core#4.0.1), ExplanationOfBenefit (hl7.fhir.r4.core#4.0.1), ExplanationOfBenefit (hl7.fhir.r4.core#4.0.1), ExplanationOfBenefit (hl7.fhir.r4.core#4.0.1), ExplanationOfBenefit (hl7.fhir.r4.core#4.0.1), ExplanationOfBenefit (hl7.fhir.r4.core#4.0.1), PaymentReconciliation (hl7.fhir.r4.core#4.0.1), PaymentReconciliation (hl7.fhir.r4.core#4.0.1), PaymentReconciliation (hl7.fhir.r4.core#4.0.1), PaymentReconciliation (hl7.fhir.r4.core#4.0.1), PaymentReconciliation (hl7.fhir.r4.core#4.0.1), PaymentReconciliation (hl7.fhir.r4.core#4.0.1), PaymentReconciliation (hl7.fhir.r4.core#4.0.1), PaymentReconciliation (hl7.fhir.r4.core#4.0.1), PaymentReconciliation (hl7.fhir.r4.core#4.0.1), PaymentReconciliation (hl7.fhir.r4.core#4.0.1), PaymentReconciliation (hl7.fhir.r4.core#4.0.1) - Version 2: ClaimResponse (hl7.fhir.r5.core#5.0.0), ClaimResponse (hl7.fhir.r5.core#5.0.0), ClaimResponse (hl7.fhir.r5.core#5.0.0), ExplanationOfBenefit (hl7.fhir.r5.core#5.0.0), ExplanationOfBenefit (hl7.fhir.r5.core#5.0.0), ExplanationOfBenefit (hl7.fhir.r5.core#5.0.0) - - Version 3: PaymentReconciliation (hl7.fhir.r5.core#5.0.0), PaymentReconciliation (hl7.fhir.r5.core#5.0.0), PaymentReconciliation (hl7.fhir.r5.core#5.0.0) - - Version 4: ClaimResponse (hl7.fhir.r4.examples#4.0.1), ExplanationOfBenefit (hl7.fhir.r4.examples#4.0.1), PaymentReconciliation (hl7.fhir.r4.examples#4.0.1) + - Version 3: ClaimResponse (hl7.fhir.r4.examples#4.0.1), ExplanationOfBenefit (hl7.fhir.r4.examples#4.0.1), PaymentReconciliation (hl7.fhir.r4.examples#4.0.1) + - Version 4: PaymentReconciliation (hl7.fhir.r5.core#5.0.0), PaymentReconciliation (hl7.fhir.r5.core#5.0.0), PaymentReconciliation (hl7.fhir.r5.core#5.0.0) - `urn:fhir:binding:NutrientModifier` (3 versions) - Version 1 (auto): NutritionOrder (hl7.fhir.r4.core#4.0.1), NutritionOrder (hl7.fhir.r4.core#4.0.1), NutritionOrder (hl7.fhir.r4.core#4.0.1), NutritionOrder (hl7.fhir.r4.core#4.0.1), NutritionOrder (hl7.fhir.r4.core#4.0.1), NutritionOrder (hl7.fhir.r4.core#4.0.1), NutritionOrder (hl7.fhir.r4.core#4.0.1), NutritionOrder (hl7.fhir.r4.core#4.0.1), NutritionOrder (hl7.fhir.r4.core#4.0.1), NutritionOrder (hl7.fhir.r4.core#4.0.1), NutritionOrder (hl7.fhir.r4.core#4.0.1) - Version 2: NutritionOrder (hl7.fhir.r5.core#5.0.0), NutritionOrder (hl7.fhir.r5.core#5.0.0), NutritionOrder (hl7.fhir.r5.core#5.0.0) @@ -5546,8 +5546,8 @@ and check `/collisions//1.json, 2.json, ...` files. - Version 3: Timing (hl7.fhir.r4.examples#4.0.1) - `urn:fhir:binding:UsageContextType` (4 versions) - Version 1 (auto): UsageContext (hl7.fhir.r4.core#4.0.1), UsageContext (hl7.fhir.r4.core#4.0.1), UsageContext (hl7.fhir.r4.core#4.0.1), UsageContext (hl7.fhir.r4.core#4.0.1), UsageContext (hl7.fhir.r4.core#4.0.1), UsageContext (hl7.fhir.r4.core#4.0.1), UsageContext (hl7.fhir.r4.core#4.0.1), UsageContext (hl7.fhir.r4.core#4.0.1), UsageContext (hl7.fhir.r4.core#4.0.1), UsageContext (hl7.fhir.r4.core#4.0.1), UsageContext (hl7.fhir.r4.core#4.0.1), sdc-usagecontext (hl7.fhir.uv.sdc#3.0.0), sdc-usagecontext (hl7.fhir.uv.sdc#3.0.0) - - Version 2: UsageContext (hl7.fhir.r5.core#5.0.0), UsageContext (hl7.fhir.r5.core#5.0.0), UsageContext (hl7.fhir.r5.core#5.0.0) - - Version 3: EvidenceVariable (hl7.fhir.r5.core#5.0.0), EvidenceVariable (hl7.fhir.r5.core#5.0.0), EvidenceVariable (hl7.fhir.r5.core#5.0.0) + - Version 2: EvidenceVariable (hl7.fhir.r5.core#5.0.0), EvidenceVariable (hl7.fhir.r5.core#5.0.0), EvidenceVariable (hl7.fhir.r5.core#5.0.0) + - Version 3: UsageContext (hl7.fhir.r5.core#5.0.0), UsageContext (hl7.fhir.r5.core#5.0.0), UsageContext (hl7.fhir.r5.core#5.0.0) - Version 4: UsageContext (hl7.fhir.r4.examples#4.0.1) - `urn:fhir:binding:Use` (3 versions) - Version 1 (auto): Claim (hl7.fhir.r4.core#4.0.1), Claim (hl7.fhir.r4.core#4.0.1), Claim (hl7.fhir.r4.core#4.0.1), Claim (hl7.fhir.r4.core#4.0.1), Claim (hl7.fhir.r4.core#4.0.1), Claim (hl7.fhir.r4.core#4.0.1), Claim (hl7.fhir.r4.core#4.0.1), Claim (hl7.fhir.r4.core#4.0.1), Claim (hl7.fhir.r4.core#4.0.1), Claim (hl7.fhir.r4.core#4.0.1), Claim (hl7.fhir.r4.core#4.0.1), ClaimResponse (hl7.fhir.r4.core#4.0.1), ClaimResponse (hl7.fhir.r4.core#4.0.1), ClaimResponse (hl7.fhir.r4.core#4.0.1), ClaimResponse (hl7.fhir.r4.core#4.0.1), ClaimResponse (hl7.fhir.r4.core#4.0.1), ClaimResponse (hl7.fhir.r4.core#4.0.1), ClaimResponse (hl7.fhir.r4.core#4.0.1), ClaimResponse (hl7.fhir.r4.core#4.0.1), ClaimResponse (hl7.fhir.r4.core#4.0.1), ClaimResponse (hl7.fhir.r4.core#4.0.1), ClaimResponse (hl7.fhir.r4.core#4.0.1), ExplanationOfBenefit (hl7.fhir.r4.core#4.0.1), ExplanationOfBenefit (hl7.fhir.r4.core#4.0.1), ExplanationOfBenefit (hl7.fhir.r4.core#4.0.1), ExplanationOfBenefit (hl7.fhir.r4.core#4.0.1), ExplanationOfBenefit (hl7.fhir.r4.core#4.0.1), ExplanationOfBenefit (hl7.fhir.r4.core#4.0.1), ExplanationOfBenefit (hl7.fhir.r4.core#4.0.1), ExplanationOfBenefit (hl7.fhir.r4.core#4.0.1), ExplanationOfBenefit (hl7.fhir.r4.core#4.0.1), ExplanationOfBenefit (hl7.fhir.r4.core#4.0.1), ExplanationOfBenefit (hl7.fhir.r4.core#4.0.1) @@ -5700,7 +5700,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:AdjunctDiagnosis": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/lipidprofile", + canonical: "http://hl7.org/fhir/StructureDefinition/DiagnosticReport", }, "urn:fhir:binding:AdministrativeGender": { package: "hl7.fhir.r4.core#4.0.1", @@ -5864,7 +5864,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:BenefitCategory": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/CoverageEligibilityRequest", + canonical: "http://hl7.org/fhir/StructureDefinition/Claim", }, "urn:fhir:binding:BenefitCostApplicability": { package: "hl7.fhir.r4.core#4.0.1", @@ -5888,7 +5888,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:BindingStrength": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/OperationDefinition", + canonical: "http://hl7.org/fhir/StructureDefinition/ElementDefinition", }, "urn:fhir:binding:BiologicallyDerivedProductCategory": { package: "hl7.fhir.r4.core#4.0.1", @@ -5908,11 +5908,11 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:BodyLengthUnits": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/headcircum", + canonical: "http://hl7.org/fhir/StructureDefinition/bodyheight", }, "urn:fhir:binding:BodySite": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/Observation", + canonical: "http://hl7.org/fhir/StructureDefinition/ActivityDefinition", }, "urn:fhir:binding:BodyStructureCode": { package: "hl7.fhir.r4.core#4.0.1", @@ -5932,7 +5932,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:BundleType": { package: "hl7.fhir.r5.core#5.0.0", - canonical: "http://hl7.org/fhir/StructureDefinition/transaction-bundle", + canonical: "http://hl7.org/fhir/StructureDefinition/Bundle", }, "urn:fhir:binding:can-push-updates": { package: "hl7.fhir.r4.core#4.0.1", @@ -5967,8 +5967,8 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis canonical: "http://hl7.org/fhir/StructureDefinition/CarePlan", }, "urn:fhir:binding:CarePlanCategory": { - package: "hl7.fhir.us.core#8.0.1", - canonical: "http://hl7.org/fhir/us/core/StructureDefinition/us-core-careplan", + package: "hl7.fhir.r4.core#4.0.1", + canonical: "http://hl7.org/fhir/StructureDefinition/CarePlan", }, "urn:fhir:binding:CarePlanIntent": { package: "hl7.fhir.r4.core#4.0.1", @@ -6144,7 +6144,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:ConceptDesignationUse": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/ValueSet", + canonical: "http://hl7.org/fhir/StructureDefinition/CodeSystem", }, "urn:fhir:binding:ConceptMapEquivalence": { package: "hl7.fhir.r4.core#4.0.1", @@ -6163,8 +6163,8 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis canonical: "http://hl7.org/fhir/StructureDefinition/CapabilityStatement", }, "urn:fhir:binding:ConditionCategory": { - package: "hl7.fhir.us.core#8.0.1", - canonical: "http://hl7.org/fhir/us/core/StructureDefinition/us-core-condition-encounter-diagnosis", + package: "hl7.fhir.r4.core#4.0.1", + canonical: "http://hl7.org/fhir/StructureDefinition/Condition", }, "urn:fhir:binding:ConditionClinicalStatus": { package: "hl7.fhir.r4.core#4.0.1", @@ -6212,7 +6212,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:ConsentContentClass": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/Contract", + canonical: "http://hl7.org/fhir/StructureDefinition/Consent", }, "urn:fhir:binding:ConsentContentCode": { package: "hl7.fhir.r4.core#4.0.1", @@ -6411,8 +6411,8 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis canonical: "http://hl7.org/fhir/StructureDefinition/Coverage", }, "urn:fhir:binding:CoverageStatus": { - package: "hl7.fhir.us.core#8.0.1", - canonical: "http://hl7.org/fhir/us/core/StructureDefinition/us-core-coverage", + package: "hl7.fhir.r4.core#4.0.1", + canonical: "http://hl7.org/fhir/StructureDefinition/Coverage", }, "urn:fhir:binding:CoverageType": { package: "hl7.fhir.r4.core#4.0.1", @@ -6428,11 +6428,11 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:DaysOfWeek": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/PractitionerRole", + canonical: "http://hl7.org/fhir/StructureDefinition/HealthcareService", }, "urn:fhir:binding:DefinitionTopic": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/EventDefinition", + canonical: "http://hl7.org/fhir/StructureDefinition/ActivityDefinition", }, "urn:fhir:binding:DetectedIssueCategory": { package: "hl7.fhir.r4.core#4.0.1", @@ -6484,7 +6484,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:DeviceNameType": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/DeviceDefinition", + canonical: "http://hl7.org/fhir/StructureDefinition/Device", }, "urn:fhir:binding:DeviceRequestParticipantRole": { package: "hl7.fhir.r4.core#4.0.1", @@ -6516,7 +6516,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:DiagnosisRole": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/EpisodeOfCare", + canonical: "http://hl7.org/fhir/StructureDefinition/Encounter", }, "urn:fhir:binding:DiagnosisType": { package: "hl7.fhir.r4.core#4.0.1", @@ -6524,15 +6524,15 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:DiagnosticReportCodes": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/lipidprofile", + canonical: "http://hl7.org/fhir/StructureDefinition/DiagnosticReport", }, "urn:fhir:binding:DiagnosticReportStatus": { package: "hl7.fhir.r4.core#4.0.1", canonical: "http://hl7.org/fhir/StructureDefinition/DiagnosticReport", }, "urn:fhir:binding:DiagnosticServiceSection": { - package: "hl7.fhir.us.core#8.0.1", - canonical: "http://hl7.org/fhir/us/core/StructureDefinition/us-core-diagnosticreport-lab", + package: "hl7.fhir.r4.core#4.0.1", + canonical: "http://hl7.org/fhir/StructureDefinition/DiagnosticReport", }, "urn:fhir:binding:DICOMMediaType": { package: "hl7.fhir.r4.core#4.0.1", @@ -6547,8 +6547,8 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis canonical: "http://hl7.org/fhir/StructureDefinition/ElementDefinition", }, "urn:fhir:binding:DocumentC80Class": { - package: "hl7.fhir.us.core#8.0.1", - canonical: "http://hl7.org/fhir/us/core/StructureDefinition/us-core-adi-documentreference", + package: "hl7.fhir.r4.core#4.0.1", + canonical: "http://hl7.org/fhir/StructureDefinition/DocumentReference", }, "urn:fhir:binding:DocumentC80FacilityType": { package: "hl7.fhir.r4.core#4.0.1", @@ -6584,7 +6584,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:DocumentReferenceStatus": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/DocumentReference", + canonical: "http://hl7.org/fhir/StructureDefinition/DocumentManifest", }, "urn:fhir:binding:DocumentRelationshipType": { package: "hl7.fhir.r4.core#4.0.1", @@ -6627,24 +6627,24 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis canonical: "http://hl7.org/fhir/StructureDefinition/Questionnaire", }, "urn:fhir:binding:EncounterClass": { - package: "hl7.fhir.us.core#8.0.1", - canonical: "http://hl7.org/fhir/us/core/StructureDefinition/us-core-encounter", + package: "hl7.fhir.r4.core#4.0.1", + canonical: "http://hl7.org/fhir/StructureDefinition/Encounter", }, "urn:fhir:binding:EncounterLocationStatus": { package: "hl7.fhir.r4.core#4.0.1", canonical: "http://hl7.org/fhir/StructureDefinition/Encounter", }, "urn:fhir:binding:EncounterReason": { - package: "hl7.fhir.us.core#8.0.1", - canonical: "http://hl7.org/fhir/us/core/StructureDefinition/us-core-encounter", + package: "hl7.fhir.r4.core#4.0.1", + canonical: "http://hl7.org/fhir/StructureDefinition/Encounter", }, "urn:fhir:binding:EncounterServiceType": { package: "hl7.fhir.r4.core#4.0.1", canonical: "http://hl7.org/fhir/StructureDefinition/Encounter", }, "urn:fhir:binding:EncounterStatus": { - package: "hl7.fhir.us.core#8.0.1", - canonical: "http://hl7.org/fhir/us/core/StructureDefinition/us-core-encounter", + package: "hl7.fhir.r4.core#4.0.1", + canonical: "http://hl7.org/fhir/StructureDefinition/Encounter", }, "urn:fhir:binding:EncounterType": { package: "hl7.fhir.r4.core#4.0.1", @@ -6756,7 +6756,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:FamilialRelationship": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/familymemberhistory-genetic", + canonical: "http://hl7.org/fhir/StructureDefinition/FamilyMemberHistory", }, "urn:fhir:binding:FamilyHistoryAbsentReason": { package: "hl7.fhir.r4.core#4.0.1", @@ -6804,7 +6804,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:FHIRTypes": { package: "hl7.fhir.r5.core#5.0.0", - canonical: "http://hl7.org/fhir/StructureDefinition/OperationDefinition", + canonical: "http://hl7.org/fhir/StructureDefinition/GraphDefinition", }, "urn:fhir:binding:FHIRVersion": { package: "hl7.fhir.r4.core#4.0.1", @@ -6812,7 +6812,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:FilterOperator": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/ValueSet", + canonical: "http://hl7.org/fhir/StructureDefinition/CodeSystem", }, "urn:fhir:binding:FlagCategory": { package: "hl7.fhir.r4.core#4.0.1", @@ -7032,11 +7032,11 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:Jurisdiction": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/EventDefinition", + canonical: "http://hl7.org/fhir/StructureDefinition/ActivityDefinition", }, "urn:fhir:binding:Language": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/ValueSet", + canonical: "http://hl7.org/fhir/StructureDefinition/Attachment", }, "urn:fhir:binding:Laterality": { package: "hl7.fhir.r4.core#4.0.1", @@ -7048,7 +7048,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:LibraryType": { package: "hl7.fhir.r5.core#5.0.0", - canonical: "http://hl7.org/fhir/StructureDefinition/modelinfolibrary", + canonical: "http://hl7.org/fhir/StructureDefinition/Library", }, "urn:fhir:binding:LinkageType": { package: "hl7.fhir.r4.core#4.0.1", @@ -7087,8 +7087,8 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis canonical: "http://hl7.org/fhir/StructureDefinition/Location", }, "urn:fhir:binding:LocationStatus": { - package: "hl7.fhir.us.core#8.0.1", - canonical: "http://hl7.org/fhir/us/core/StructureDefinition/us-core-location", + package: "hl7.fhir.r4.core#4.0.1", + canonical: "http://hl7.org/fhir/StructureDefinition/Location", }, "urn:fhir:binding:LocationType": { package: "hl7.fhir.r4.core#4.0.1", @@ -7199,8 +7199,8 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis canonical: "http://hl7.org/fhir/StructureDefinition/MedicationDispense", }, "urn:fhir:binding:MedicationDispenseStatus": { - package: "hl7.fhir.us.core#8.0.1", - canonical: "http://hl7.org/fhir/us/core/StructureDefinition/us-core-medicationdispense", + package: "hl7.fhir.r4.core#4.0.1", + canonical: "http://hl7.org/fhir/StructureDefinition/MedicationDispense", }, "urn:fhir:binding:MedicationDispenseType": { package: "hl7.fhir.r4.core#4.0.1", @@ -7208,15 +7208,15 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:MedicationForm": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/MedicationKnowledge", + canonical: "http://hl7.org/fhir/StructureDefinition/Medication", }, "urn:fhir:binding:MedicationFormalRepresentation": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/MedicationKnowledge", + canonical: "http://hl7.org/fhir/StructureDefinition/Medication", }, "urn:fhir:binding:MedicationIntendedSubstitutionReason": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/MedicationRequest", + canonical: "http://hl7.org/fhir/StructureDefinition/MedicationDispense", }, "urn:fhir:binding:MedicationIntendedSubstitutionType": { package: "hl7.fhir.r4.core#4.0.1", @@ -7235,8 +7235,8 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis canonical: "http://hl7.org/fhir/StructureDefinition/MedicationStatement", }, "urn:fhir:binding:MedicationRequestCategory": { - package: "hl7.fhir.us.core#8.0.1", - canonical: "http://hl7.org/fhir/us/core/StructureDefinition/us-core-medicationrequest", + package: "hl7.fhir.r4.core#4.0.1", + canonical: "http://hl7.org/fhir/StructureDefinition/MedicationRequest", }, "urn:fhir:binding:MedicationRequestCourseOfTherapy": { package: "hl7.fhir.r4.core#4.0.1", @@ -7312,7 +7312,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:MimeType": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/Binary", + canonical: "http://hl7.org/fhir/StructureDefinition/Attachment", }, "urn:fhir:binding:MissingReason": { package: "hl7.fhir.r4.core#4.0.1", @@ -7320,7 +7320,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:Modifiers": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/CoverageEligibilityRequest", + canonical: "http://hl7.org/fhir/StructureDefinition/Claim", }, "urn:fhir:binding:NameUse": { package: "hl7.fhir.r4.core#4.0.1", @@ -7359,12 +7359,12 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis canonical: "http://hl7.org/fhir/StructureDefinition/NutritionOrder", }, "urn:fhir:binding:ObservationCategory": { - package: "hl7.fhir.us.core#8.0.1", - canonical: "http://hl7.org/fhir/us/core/StructureDefinition/us-core-average-blood-pressure", + package: "hl7.fhir.r4.core#4.0.1", + canonical: "http://hl7.org/fhir/StructureDefinition/Observation", }, "urn:fhir:binding:ObservationCode": { - package: "hl7.fhir.us.core#8.0.1", - canonical: "http://hl7.org/fhir/us/core/StructureDefinition/us-core-average-blood-pressure", + package: "hl7.fhir.r4.core#4.0.1", + canonical: "http://hl7.org/fhir/StructureDefinition/Observation", }, "urn:fhir:binding:ObservationDataType": { package: "hl7.fhir.r4.core#4.0.1", @@ -7395,16 +7395,16 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis canonical: "http://hl7.org/fhir/StructureDefinition/Observation", }, "urn:fhir:binding:ObservationStatus": { - package: "hl7.fhir.us.core#8.0.1", - canonical: "http://hl7.org/fhir/us/core/StructureDefinition/us-core-average-blood-pressure", + package: "hl7.fhir.r4.core#4.0.1", + canonical: "http://hl7.org/fhir/StructureDefinition/Observation", }, "urn:fhir:binding:ObservationUnit": { package: "hl7.fhir.r4.core#4.0.1", canonical: "http://hl7.org/fhir/StructureDefinition/ObservationDefinition", }, "urn:fhir:binding:ObservationValueAbsentReason": { - package: "hl7.fhir.us.core#8.0.1", - canonical: "http://hl7.org/fhir/us/core/StructureDefinition/us-core-average-blood-pressure", + package: "hl7.fhir.r4.core#4.0.1", + canonical: "http://hl7.org/fhir/StructureDefinition/Observation", }, "urn:fhir:binding:OperationalStatus": { package: "hl7.fhir.r4.core#4.0.1", @@ -7459,8 +7459,8 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis canonical: "http://hl7.org/fhir/StructureDefinition/AppointmentResponse", }, "urn:fhir:binding:ParticipantType": { - package: "hl7.fhir.us.core#8.0.1", - canonical: "http://hl7.org/fhir/us/core/StructureDefinition/us-core-encounter", + package: "hl7.fhir.r4.core#4.0.1", + canonical: "http://hl7.org/fhir/StructureDefinition/Appointment", }, "urn:fhir:binding:ParticipationStatus": { package: "hl7.fhir.r4.core#4.0.1", @@ -7468,7 +7468,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:PatientDiet": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/NutritionOrder", + canonical: "http://hl7.org/fhir/StructureDefinition/Encounter", }, "urn:fhir:binding:PatientRelationshipType": { package: "hl7.fhir.r4.core#4.0.1", @@ -7504,7 +7504,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:PhysicalType": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/Location", + canonical: "http://hl7.org/fhir/StructureDefinition/Encounter", }, "urn:fhir:binding:PlanDefinitionType": { package: "hl7.fhir.r4.core#4.0.1", @@ -7580,7 +7580,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:ProcessPriority": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/CoverageEligibilityRequest", + canonical: "http://hl7.org/fhir/StructureDefinition/Claim", }, "urn:fhir:binding:Program": { package: "hl7.fhir.r4.core#4.0.1", @@ -7636,7 +7636,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:PublicationStatus": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/EventDefinition", + canonical: "http://hl7.org/fhir/StructureDefinition/ActivityDefinition", }, "urn:fhir:binding:PurposeOfUse": { package: "hl7.fhir.r4.core#4.0.1", @@ -7668,7 +7668,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:QuantityComparator": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/SimpleQuantity", + canonical: "http://hl7.org/fhir/StructureDefinition/Quantity", }, "urn:fhir:binding:QuestionnaireConcept": { package: "hl7.fhir.r4.core#4.0.1", @@ -7683,8 +7683,8 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis canonical: "http://hl7.org/fhir/StructureDefinition/Questionnaire", }, "urn:fhir:binding:QuestionnaireResponseStatus": { - package: "hl7.fhir.us.core#8.0.1", - canonical: "http://hl7.org/fhir/us/core/StructureDefinition/us-core-questionnaireresponse", + package: "hl7.fhir.r4.core#4.0.1", + canonical: "http://hl7.org/fhir/StructureDefinition/QuestionnaireResponse", }, "urn:fhir:binding:ReAdmissionType": { package: "hl7.fhir.r4.core#4.0.1", @@ -7724,7 +7724,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:RemittanceOutcome": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/EnrollmentResponse", + canonical: "http://hl7.org/fhir/StructureDefinition/ClaimResponse", }, "urn:fhir:binding:repositoryType": { package: "hl7.fhir.r4.core#4.0.1", @@ -7736,7 +7736,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:RequestPriority": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/PlanDefinition", + canonical: "http://hl7.org/fhir/StructureDefinition/ActivityDefinition", }, "urn:fhir:binding:RequestStatus": { package: "hl7.fhir.r4.core#4.0.1", @@ -7808,7 +7808,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:RouteOfAdministration": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/Dosage", + canonical: "http://hl7.org/fhir/StructureDefinition/AllergyIntolerance", }, "urn:fhir:binding:Safety": { package: "hl7.fhir.r4.core#4.0.1", @@ -7868,23 +7868,23 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:ServiceProduct": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/CoverageEligibilityRequest", + canonical: "http://hl7.org/fhir/StructureDefinition/Claim", }, "urn:fhir:binding:ServiceProvisionConditions": { package: "hl7.fhir.r4.core#4.0.1", canonical: "http://hl7.org/fhir/StructureDefinition/HealthcareService", }, "urn:fhir:binding:ServiceRequestCategory": { - package: "hl7.fhir.us.core#8.0.1", - canonical: "http://hl7.org/fhir/us/core/StructureDefinition/us-core-servicerequest", + package: "hl7.fhir.r4.core#4.0.1", + canonical: "http://hl7.org/fhir/StructureDefinition/ServiceRequest", }, "urn:fhir:binding:ServiceRequestCode": { package: "hl7.fhir.r4.core#4.0.1", canonical: "http://hl7.org/fhir/StructureDefinition/ServiceRequest", }, "urn:fhir:binding:ServiceRequestIntent": { - package: "hl7.fhir.us.core#8.0.1", - canonical: "http://hl7.org/fhir/us/core/StructureDefinition/us-core-servicerequest", + package: "hl7.fhir.r4.core#4.0.1", + canonical: "http://hl7.org/fhir/StructureDefinition/ServiceRequest", }, "urn:fhir:binding:ServiceRequestLocation": { package: "hl7.fhir.r4.core#4.0.1", @@ -7903,12 +7903,12 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis canonical: "http://hl7.org/fhir/StructureDefinition/ServiceRequest", }, "urn:fhir:binding:ServiceRequestStatus": { - package: "hl7.fhir.us.core#8.0.1", - canonical: "http://hl7.org/fhir/us/core/StructureDefinition/us-core-servicerequest", + package: "hl7.fhir.r4.core#4.0.1", + canonical: "http://hl7.org/fhir/StructureDefinition/ServiceRequest", }, "urn:fhir:binding:Sex": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/familymemberhistory-genetic", + canonical: "http://hl7.org/fhir/StructureDefinition/FamilyMemberHistory", }, "urn:fhir:binding:SignatureType": { package: "hl7.fhir.r4.core#4.0.1", @@ -7971,8 +7971,8 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis canonical: "http://hl7.org/fhir/StructureDefinition/VerificationResult", }, "urn:fhir:binding:Status": { - package: "hl7.fhir.us.core#8.0.1", - canonical: "http://hl7.org/fhir/us/core/StructureDefinition/us-core-vital-signs", + package: "hl7.fhir.r4.core#4.0.1", + canonical: "http://hl7.org/fhir/StructureDefinition/vitalsigns", }, "urn:fhir:binding:strandType": { package: "hl7.fhir.r4.core#4.0.1", @@ -8040,7 +8040,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:SubstanceCode": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/Substance", + canonical: "http://hl7.org/fhir/StructureDefinition/AllergyIntolerance", }, "urn:fhir:binding:SupplementType": { package: "hl7.fhir.r4.core#4.0.1", @@ -8224,7 +8224,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:VitalSigns": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/vitalsigns", + canonical: "http://hl7.org/fhir/StructureDefinition/bmi", }, "urn:fhir:binding:XPathUsageType": { package: "hl7.fhir.r4.core#4.0.1", diff --git a/examples/typescript-r4-us-core/fhir-types/README.md b/examples/typescript-r4-us-core/fhir-types/README.md index 95db796b..aac0db13 100644 --- a/examples/typescript-r4-us-core/fhir-types/README.md +++ b/examples/typescript-r4-us-core/fhir-types/README.md @@ -3620,8 +3620,8 @@ and check `/collisions//1.json, 2.json, ...` files. - Version 3: Consent (hl7.fhir.r4.examples#4.0.1) - `urn:fhir:binding:ConsentContentClass` (4 versions) - Version 1 (auto): Consent (hl7.fhir.r4.core#4.0.1), Consent (hl7.fhir.r4.core#4.0.1), Consent (hl7.fhir.r4.core#4.0.1), Consent (hl7.fhir.r4.core#4.0.1), Consent (hl7.fhir.r4.core#4.0.1), Consent (hl7.fhir.r4.core#4.0.1), Consent (hl7.fhir.r4.core#4.0.1), Consent (hl7.fhir.r4.core#4.0.1), Consent (hl7.fhir.r4.core#4.0.1), Consent (hl7.fhir.r4.core#4.0.1), Contract (hl7.fhir.r4.core#4.0.1), Contract (hl7.fhir.r4.core#4.0.1), Contract (hl7.fhir.r4.core#4.0.1), Contract (hl7.fhir.r4.core#4.0.1), Contract (hl7.fhir.r4.core#4.0.1), Contract (hl7.fhir.r4.core#4.0.1), Contract (hl7.fhir.r4.core#4.0.1), Contract (hl7.fhir.r4.core#4.0.1), Contract (hl7.fhir.r4.core#4.0.1), Contract (hl7.fhir.r4.core#4.0.1) - - Version 2: Contract (hl7.fhir.r5.core#5.0.0), Contract (hl7.fhir.r5.core#5.0.0), Contract (hl7.fhir.r5.core#5.0.0) - - Version 3: Consent (hl7.fhir.r5.core#5.0.0), Consent (hl7.fhir.r5.core#5.0.0), Consent (hl7.fhir.r5.core#5.0.0) + - Version 2: Consent (hl7.fhir.r5.core#5.0.0), Consent (hl7.fhir.r5.core#5.0.0), Consent (hl7.fhir.r5.core#5.0.0) + - Version 3: Contract (hl7.fhir.r5.core#5.0.0), Contract (hl7.fhir.r5.core#5.0.0), Contract (hl7.fhir.r5.core#5.0.0) - Version 4: Consent (hl7.fhir.r4.examples#4.0.1), Contract (hl7.fhir.r4.examples#4.0.1) - `urn:fhir:binding:ConsentContentCode` (3 versions) - Version 1 (auto): Consent (hl7.fhir.r4.core#4.0.1), Consent (hl7.fhir.r4.core#4.0.1), Consent (hl7.fhir.r4.core#4.0.1), Consent (hl7.fhir.r4.core#4.0.1), Consent (hl7.fhir.r4.core#4.0.1), Consent (hl7.fhir.r4.core#4.0.1), Consent (hl7.fhir.r4.core#4.0.1), Consent (hl7.fhir.r4.core#4.0.1), Consent (hl7.fhir.r4.core#4.0.1), Consent (hl7.fhir.r4.core#4.0.1) @@ -4159,8 +4159,8 @@ and check `/collisions//1.json, 2.json, ...` files. - Version 3: FamilyMemberHistory (hl7.fhir.r4.examples#4.0.1) - `urn:fhir:binding:FHIRAllTypes` (3 versions) - Version 1 (auto): DataRequirement (hl7.fhir.r4.core#4.0.1), DataRequirement (hl7.fhir.r4.core#4.0.1), DataRequirement (hl7.fhir.r4.core#4.0.1), DataRequirement (hl7.fhir.r4.core#4.0.1), DataRequirement (hl7.fhir.r4.core#4.0.1), DataRequirement (hl7.fhir.r4.core#4.0.1), DataRequirement (hl7.fhir.r4.core#4.0.1), DataRequirement (hl7.fhir.r4.core#4.0.1), DataRequirement (hl7.fhir.r4.core#4.0.1), DataRequirement (hl7.fhir.r4.core#4.0.1), OperationDefinition (hl7.fhir.r4.core#4.0.1), OperationDefinition (hl7.fhir.r4.core#4.0.1), OperationDefinition (hl7.fhir.r4.core#4.0.1), OperationDefinition (hl7.fhir.r4.core#4.0.1), OperationDefinition (hl7.fhir.r4.core#4.0.1), OperationDefinition (hl7.fhir.r4.core#4.0.1), OperationDefinition (hl7.fhir.r4.core#4.0.1), OperationDefinition (hl7.fhir.r4.core#4.0.1), OperationDefinition (hl7.fhir.r4.core#4.0.1), OperationDefinition (hl7.fhir.r4.core#4.0.1), ParameterDefinition (hl7.fhir.r4.core#4.0.1), ParameterDefinition (hl7.fhir.r4.core#4.0.1), ParameterDefinition (hl7.fhir.r4.core#4.0.1), ParameterDefinition (hl7.fhir.r4.core#4.0.1), ParameterDefinition (hl7.fhir.r4.core#4.0.1), ParameterDefinition (hl7.fhir.r4.core#4.0.1), ParameterDefinition (hl7.fhir.r4.core#4.0.1), ParameterDefinition (hl7.fhir.r4.core#4.0.1), ParameterDefinition (hl7.fhir.r4.core#4.0.1), ParameterDefinition (hl7.fhir.r4.core#4.0.1) - - Version 2: OperationDefinition (hl7.fhir.r5.core#5.0.0), OperationDefinition (hl7.fhir.r5.core#5.0.0), OperationDefinition (hl7.fhir.r5.core#5.0.0) - - Version 3: DataRequirement (hl7.fhir.r4.examples#4.0.1), OperationDefinition (hl7.fhir.r4.examples#4.0.1), ParameterDefinition (hl7.fhir.r4.examples#4.0.1) + - Version 2: DataRequirement (hl7.fhir.r4.examples#4.0.1), OperationDefinition (hl7.fhir.r4.examples#4.0.1), ParameterDefinition (hl7.fhir.r4.examples#4.0.1) + - Version 3: OperationDefinition (hl7.fhir.r5.core#5.0.0), OperationDefinition (hl7.fhir.r5.core#5.0.0), OperationDefinition (hl7.fhir.r5.core#5.0.0) - `urn:fhir:binding:FHIRDefinedType` (2 versions) - Version 1 (auto): TestScript (hl7.fhir.r4.core#4.0.1), TestScript (hl7.fhir.r4.core#4.0.1), TestScript (hl7.fhir.r4.core#4.0.1), TestScript (hl7.fhir.r4.core#4.0.1), TestScript (hl7.fhir.r4.core#4.0.1), TestScript (hl7.fhir.r4.core#4.0.1), TestScript (hl7.fhir.r4.core#4.0.1), TestScript (hl7.fhir.r4.core#4.0.1), TestScript (hl7.fhir.r4.core#4.0.1), TestScript (hl7.fhir.r4.core#4.0.1) - Version 2: TestScript (hl7.fhir.r4.examples#4.0.1) @@ -4712,8 +4712,8 @@ and check `/collisions//1.json, 2.json, ...` files. - `urn:fhir:binding:NoteType` (4 versions) - Version 1 (auto): ClaimResponse (hl7.fhir.r4.core#4.0.1), ClaimResponse (hl7.fhir.r4.core#4.0.1), ClaimResponse (hl7.fhir.r4.core#4.0.1), ClaimResponse (hl7.fhir.r4.core#4.0.1), ClaimResponse (hl7.fhir.r4.core#4.0.1), ClaimResponse (hl7.fhir.r4.core#4.0.1), ClaimResponse (hl7.fhir.r4.core#4.0.1), ClaimResponse (hl7.fhir.r4.core#4.0.1), ClaimResponse (hl7.fhir.r4.core#4.0.1), ClaimResponse (hl7.fhir.r4.core#4.0.1), ExplanationOfBenefit (hl7.fhir.r4.core#4.0.1), ExplanationOfBenefit (hl7.fhir.r4.core#4.0.1), ExplanationOfBenefit (hl7.fhir.r4.core#4.0.1), ExplanationOfBenefit (hl7.fhir.r4.core#4.0.1), ExplanationOfBenefit (hl7.fhir.r4.core#4.0.1), ExplanationOfBenefit (hl7.fhir.r4.core#4.0.1), ExplanationOfBenefit (hl7.fhir.r4.core#4.0.1), ExplanationOfBenefit (hl7.fhir.r4.core#4.0.1), ExplanationOfBenefit (hl7.fhir.r4.core#4.0.1), ExplanationOfBenefit (hl7.fhir.r4.core#4.0.1), PaymentReconciliation (hl7.fhir.r4.core#4.0.1), PaymentReconciliation (hl7.fhir.r4.core#4.0.1), PaymentReconciliation (hl7.fhir.r4.core#4.0.1), PaymentReconciliation (hl7.fhir.r4.core#4.0.1), PaymentReconciliation (hl7.fhir.r4.core#4.0.1), PaymentReconciliation (hl7.fhir.r4.core#4.0.1), PaymentReconciliation (hl7.fhir.r4.core#4.0.1), PaymentReconciliation (hl7.fhir.r4.core#4.0.1), PaymentReconciliation (hl7.fhir.r4.core#4.0.1), PaymentReconciliation (hl7.fhir.r4.core#4.0.1) - Version 2: ClaimResponse (hl7.fhir.r5.core#5.0.0), ClaimResponse (hl7.fhir.r5.core#5.0.0), ClaimResponse (hl7.fhir.r5.core#5.0.0), ExplanationOfBenefit (hl7.fhir.r5.core#5.0.0), ExplanationOfBenefit (hl7.fhir.r5.core#5.0.0), ExplanationOfBenefit (hl7.fhir.r5.core#5.0.0) - - Version 3: PaymentReconciliation (hl7.fhir.r5.core#5.0.0), PaymentReconciliation (hl7.fhir.r5.core#5.0.0), PaymentReconciliation (hl7.fhir.r5.core#5.0.0) - - Version 4: ClaimResponse (hl7.fhir.r4.examples#4.0.1), ExplanationOfBenefit (hl7.fhir.r4.examples#4.0.1), PaymentReconciliation (hl7.fhir.r4.examples#4.0.1) + - Version 3: ClaimResponse (hl7.fhir.r4.examples#4.0.1), ExplanationOfBenefit (hl7.fhir.r4.examples#4.0.1), PaymentReconciliation (hl7.fhir.r4.examples#4.0.1) + - Version 4: PaymentReconciliation (hl7.fhir.r5.core#5.0.0), PaymentReconciliation (hl7.fhir.r5.core#5.0.0), PaymentReconciliation (hl7.fhir.r5.core#5.0.0) - `urn:fhir:binding:NutrientModifier` (3 versions) - Version 1 (auto): NutritionOrder (hl7.fhir.r4.core#4.0.1), NutritionOrder (hl7.fhir.r4.core#4.0.1), NutritionOrder (hl7.fhir.r4.core#4.0.1), NutritionOrder (hl7.fhir.r4.core#4.0.1), NutritionOrder (hl7.fhir.r4.core#4.0.1), NutritionOrder (hl7.fhir.r4.core#4.0.1), NutritionOrder (hl7.fhir.r4.core#4.0.1), NutritionOrder (hl7.fhir.r4.core#4.0.1), NutritionOrder (hl7.fhir.r4.core#4.0.1), NutritionOrder (hl7.fhir.r4.core#4.0.1) - Version 2: NutritionOrder (hl7.fhir.r5.core#5.0.0), NutritionOrder (hl7.fhir.r5.core#5.0.0), NutritionOrder (hl7.fhir.r5.core#5.0.0) @@ -5534,8 +5534,8 @@ and check `/collisions//1.json, 2.json, ...` files. - Version 3: Timing (hl7.fhir.r4.examples#4.0.1) - `urn:fhir:binding:UsageContextType` (4 versions) - Version 1 (auto): UsageContext (hl7.fhir.r4.core#4.0.1), UsageContext (hl7.fhir.r4.core#4.0.1), UsageContext (hl7.fhir.r4.core#4.0.1), UsageContext (hl7.fhir.r4.core#4.0.1), UsageContext (hl7.fhir.r4.core#4.0.1), UsageContext (hl7.fhir.r4.core#4.0.1), UsageContext (hl7.fhir.r4.core#4.0.1), UsageContext (hl7.fhir.r4.core#4.0.1), UsageContext (hl7.fhir.r4.core#4.0.1), UsageContext (hl7.fhir.r4.core#4.0.1), sdc-usagecontext (hl7.fhir.uv.sdc#3.0.0), sdc-usagecontext (hl7.fhir.uv.sdc#3.0.0) - - Version 2: UsageContext (hl7.fhir.r5.core#5.0.0), UsageContext (hl7.fhir.r5.core#5.0.0), UsageContext (hl7.fhir.r5.core#5.0.0) - - Version 3: EvidenceVariable (hl7.fhir.r5.core#5.0.0), EvidenceVariable (hl7.fhir.r5.core#5.0.0), EvidenceVariable (hl7.fhir.r5.core#5.0.0) + - Version 2: EvidenceVariable (hl7.fhir.r5.core#5.0.0), EvidenceVariable (hl7.fhir.r5.core#5.0.0), EvidenceVariable (hl7.fhir.r5.core#5.0.0) + - Version 3: UsageContext (hl7.fhir.r5.core#5.0.0), UsageContext (hl7.fhir.r5.core#5.0.0), UsageContext (hl7.fhir.r5.core#5.0.0) - Version 4: UsageContext (hl7.fhir.r4.examples#4.0.1) - `urn:fhir:binding:Use` (3 versions) - Version 1 (auto): Claim (hl7.fhir.r4.core#4.0.1), Claim (hl7.fhir.r4.core#4.0.1), Claim (hl7.fhir.r4.core#4.0.1), Claim (hl7.fhir.r4.core#4.0.1), Claim (hl7.fhir.r4.core#4.0.1), Claim (hl7.fhir.r4.core#4.0.1), Claim (hl7.fhir.r4.core#4.0.1), Claim (hl7.fhir.r4.core#4.0.1), Claim (hl7.fhir.r4.core#4.0.1), Claim (hl7.fhir.r4.core#4.0.1), ClaimResponse (hl7.fhir.r4.core#4.0.1), ClaimResponse (hl7.fhir.r4.core#4.0.1), ClaimResponse (hl7.fhir.r4.core#4.0.1), ClaimResponse (hl7.fhir.r4.core#4.0.1), ClaimResponse (hl7.fhir.r4.core#4.0.1), ClaimResponse (hl7.fhir.r4.core#4.0.1), ClaimResponse (hl7.fhir.r4.core#4.0.1), ClaimResponse (hl7.fhir.r4.core#4.0.1), ClaimResponse (hl7.fhir.r4.core#4.0.1), ClaimResponse (hl7.fhir.r4.core#4.0.1), ExplanationOfBenefit (hl7.fhir.r4.core#4.0.1), ExplanationOfBenefit (hl7.fhir.r4.core#4.0.1), ExplanationOfBenefit (hl7.fhir.r4.core#4.0.1), ExplanationOfBenefit (hl7.fhir.r4.core#4.0.1), ExplanationOfBenefit (hl7.fhir.r4.core#4.0.1), ExplanationOfBenefit (hl7.fhir.r4.core#4.0.1), ExplanationOfBenefit (hl7.fhir.r4.core#4.0.1), ExplanationOfBenefit (hl7.fhir.r4.core#4.0.1), ExplanationOfBenefit (hl7.fhir.r4.core#4.0.1), ExplanationOfBenefit (hl7.fhir.r4.core#4.0.1) @@ -5660,7 +5660,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:ActivityParticipantType": { package: "hl7.fhir.r5.core#5.0.0", - canonical: "http://hl7.org/fhir/StructureDefinition/RequestOrchestration", + canonical: "http://hl7.org/fhir/StructureDefinition/ActivityDefinition", }, "urn:fhir:binding:AdditionalInstruction": { package: "hl7.fhir.r4.core#4.0.1", @@ -5688,7 +5688,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:AdjunctDiagnosis": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/lipidprofile", + canonical: "http://hl7.org/fhir/StructureDefinition/DiagnosticReport", }, "urn:fhir:binding:AdministrativeGender": { package: "hl7.fhir.r4.core#4.0.1", @@ -5852,7 +5852,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:BenefitCategory": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/CoverageEligibilityRequest", + canonical: "http://hl7.org/fhir/StructureDefinition/Claim", }, "urn:fhir:binding:BenefitCostApplicability": { package: "hl7.fhir.r4.core#4.0.1", @@ -5876,7 +5876,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:BindingStrength": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/OperationDefinition", + canonical: "http://hl7.org/fhir/StructureDefinition/ElementDefinition", }, "urn:fhir:binding:BiologicallyDerivedProductCategory": { package: "hl7.fhir.r4.core#4.0.1", @@ -5896,11 +5896,11 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:BodyLengthUnits": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/headcircum", + canonical: "http://hl7.org/fhir/StructureDefinition/bodyheight", }, "urn:fhir:binding:BodySite": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/Observation", + canonical: "http://hl7.org/fhir/StructureDefinition/ActivityDefinition", }, "urn:fhir:binding:BodyStructureCode": { package: "hl7.fhir.r4.core#4.0.1", @@ -5920,7 +5920,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:BundleType": { package: "hl7.fhir.r5.core#5.0.0", - canonical: "http://hl7.org/fhir/StructureDefinition/transaction-bundle", + canonical: "http://hl7.org/fhir/StructureDefinition/Bundle", }, "urn:fhir:binding:can-push-updates": { package: "hl7.fhir.r4.core#4.0.1", @@ -5955,8 +5955,8 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis canonical: "http://hl7.org/fhir/StructureDefinition/CarePlan", }, "urn:fhir:binding:CarePlanCategory": { - package: "hl7.fhir.us.core#8.0.1", - canonical: "http://hl7.org/fhir/us/core/StructureDefinition/us-core-careplan", + package: "hl7.fhir.r4.core#4.0.1", + canonical: "http://hl7.org/fhir/StructureDefinition/CarePlan", }, "urn:fhir:binding:CarePlanIntent": { package: "hl7.fhir.r4.core#4.0.1", @@ -6128,7 +6128,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:ConceptDesignationUse": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/ValueSet", + canonical: "http://hl7.org/fhir/StructureDefinition/CodeSystem", }, "urn:fhir:binding:ConceptMapEquivalence": { package: "hl7.fhir.r4.core#4.0.1", @@ -6147,8 +6147,8 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis canonical: "http://hl7.org/fhir/StructureDefinition/CapabilityStatement", }, "urn:fhir:binding:ConditionCategory": { - package: "hl7.fhir.us.core#8.0.1", - canonical: "http://hl7.org/fhir/us/core/StructureDefinition/us-core-condition-encounter-diagnosis", + package: "hl7.fhir.r4.core#4.0.1", + canonical: "http://hl7.org/fhir/StructureDefinition/Condition", }, "urn:fhir:binding:ConditionClinicalStatus": { package: "hl7.fhir.r4.core#4.0.1", @@ -6196,7 +6196,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:ConsentContentClass": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/Contract", + canonical: "http://hl7.org/fhir/StructureDefinition/Consent", }, "urn:fhir:binding:ConsentContentCode": { package: "hl7.fhir.r4.core#4.0.1", @@ -6395,8 +6395,8 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis canonical: "http://hl7.org/fhir/StructureDefinition/Coverage", }, "urn:fhir:binding:CoverageStatus": { - package: "hl7.fhir.us.core#8.0.1", - canonical: "http://hl7.org/fhir/us/core/StructureDefinition/us-core-coverage", + package: "hl7.fhir.r4.core#4.0.1", + canonical: "http://hl7.org/fhir/StructureDefinition/Coverage", }, "urn:fhir:binding:CoverageType": { package: "hl7.fhir.r4.core#4.0.1", @@ -6412,11 +6412,11 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:DaysOfWeek": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/PractitionerRole", + canonical: "http://hl7.org/fhir/StructureDefinition/HealthcareService", }, "urn:fhir:binding:DefinitionTopic": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/EventDefinition", + canonical: "http://hl7.org/fhir/StructureDefinition/ActivityDefinition", }, "urn:fhir:binding:DetectedIssueCategory": { package: "hl7.fhir.r4.core#4.0.1", @@ -6468,7 +6468,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:DeviceNameType": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/DeviceDefinition", + canonical: "http://hl7.org/fhir/StructureDefinition/Device", }, "urn:fhir:binding:DeviceRequestParticipantRole": { package: "hl7.fhir.r4.core#4.0.1", @@ -6500,7 +6500,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:DiagnosisRole": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/EpisodeOfCare", + canonical: "http://hl7.org/fhir/StructureDefinition/Encounter", }, "urn:fhir:binding:DiagnosisType": { package: "hl7.fhir.r4.core#4.0.1", @@ -6508,15 +6508,15 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:DiagnosticReportCodes": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/lipidprofile", + canonical: "http://hl7.org/fhir/StructureDefinition/DiagnosticReport", }, "urn:fhir:binding:DiagnosticReportStatus": { package: "hl7.fhir.r4.core#4.0.1", canonical: "http://hl7.org/fhir/StructureDefinition/DiagnosticReport", }, "urn:fhir:binding:DiagnosticServiceSection": { - package: "hl7.fhir.us.core#8.0.1", - canonical: "http://hl7.org/fhir/us/core/StructureDefinition/us-core-diagnosticreport-lab", + package: "hl7.fhir.r4.core#4.0.1", + canonical: "http://hl7.org/fhir/StructureDefinition/DiagnosticReport", }, "urn:fhir:binding:DICOMMediaType": { package: "hl7.fhir.r4.core#4.0.1", @@ -6531,8 +6531,8 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis canonical: "http://hl7.org/fhir/StructureDefinition/ElementDefinition", }, "urn:fhir:binding:DocumentC80Class": { - package: "hl7.fhir.us.core#8.0.1", - canonical: "http://hl7.org/fhir/us/core/StructureDefinition/us-core-adi-documentreference", + package: "hl7.fhir.r4.core#4.0.1", + canonical: "http://hl7.org/fhir/StructureDefinition/DocumentReference", }, "urn:fhir:binding:DocumentC80FacilityType": { package: "hl7.fhir.r4.core#4.0.1", @@ -6568,7 +6568,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:DocumentReferenceStatus": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/DocumentReference", + canonical: "http://hl7.org/fhir/StructureDefinition/DocumentManifest", }, "urn:fhir:binding:DocumentRelationshipType": { package: "hl7.fhir.r4.core#4.0.1", @@ -6611,24 +6611,24 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis canonical: "http://hl7.org/fhir/StructureDefinition/Questionnaire", }, "urn:fhir:binding:EncounterClass": { - package: "hl7.fhir.us.core#8.0.1", - canonical: "http://hl7.org/fhir/us/core/StructureDefinition/us-core-encounter", + package: "hl7.fhir.r4.core#4.0.1", + canonical: "http://hl7.org/fhir/StructureDefinition/Encounter", }, "urn:fhir:binding:EncounterLocationStatus": { package: "hl7.fhir.r4.core#4.0.1", canonical: "http://hl7.org/fhir/StructureDefinition/Encounter", }, "urn:fhir:binding:EncounterReason": { - package: "hl7.fhir.us.core#8.0.1", - canonical: "http://hl7.org/fhir/us/core/StructureDefinition/us-core-encounter", + package: "hl7.fhir.r4.core#4.0.1", + canonical: "http://hl7.org/fhir/StructureDefinition/Encounter", }, "urn:fhir:binding:EncounterServiceType": { package: "hl7.fhir.r4.core#4.0.1", canonical: "http://hl7.org/fhir/StructureDefinition/Encounter", }, "urn:fhir:binding:EncounterStatus": { - package: "hl7.fhir.us.core#8.0.1", - canonical: "http://hl7.org/fhir/us/core/StructureDefinition/us-core-encounter", + package: "hl7.fhir.r4.core#4.0.1", + canonical: "http://hl7.org/fhir/StructureDefinition/Encounter", }, "urn:fhir:binding:EncounterType": { package: "hl7.fhir.r4.core#4.0.1", @@ -6740,7 +6740,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:FamilialRelationship": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/familymemberhistory-genetic", + canonical: "http://hl7.org/fhir/StructureDefinition/FamilyMemberHistory", }, "urn:fhir:binding:FamilyHistoryAbsentReason": { package: "hl7.fhir.r4.core#4.0.1", @@ -6788,7 +6788,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:FHIRTypes": { package: "hl7.fhir.r5.core#5.0.0", - canonical: "http://hl7.org/fhir/StructureDefinition/OperationDefinition", + canonical: "http://hl7.org/fhir/StructureDefinition/GraphDefinition", }, "urn:fhir:binding:FHIRVersion": { package: "hl7.fhir.r4.core#4.0.1", @@ -6796,7 +6796,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:FilterOperator": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/ValueSet", + canonical: "http://hl7.org/fhir/StructureDefinition/CodeSystem", }, "urn:fhir:binding:FlagCategory": { package: "hl7.fhir.r4.core#4.0.1", @@ -7016,11 +7016,11 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:Jurisdiction": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/EventDefinition", + canonical: "http://hl7.org/fhir/StructureDefinition/ActivityDefinition", }, "urn:fhir:binding:Language": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/ValueSet", + canonical: "http://hl7.org/fhir/StructureDefinition/Attachment", }, "urn:fhir:binding:Laterality": { package: "hl7.fhir.r4.core#4.0.1", @@ -7032,7 +7032,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:LibraryType": { package: "hl7.fhir.r5.core#5.0.0", - canonical: "http://hl7.org/fhir/StructureDefinition/modelinfolibrary", + canonical: "http://hl7.org/fhir/StructureDefinition/Library", }, "urn:fhir:binding:LinkageType": { package: "hl7.fhir.r4.core#4.0.1", @@ -7071,8 +7071,8 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis canonical: "http://hl7.org/fhir/StructureDefinition/Location", }, "urn:fhir:binding:LocationStatus": { - package: "hl7.fhir.us.core#8.0.1", - canonical: "http://hl7.org/fhir/us/core/StructureDefinition/us-core-location", + package: "hl7.fhir.r4.core#4.0.1", + canonical: "http://hl7.org/fhir/StructureDefinition/Location", }, "urn:fhir:binding:LocationType": { package: "hl7.fhir.r4.core#4.0.1", @@ -7183,8 +7183,8 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis canonical: "http://hl7.org/fhir/StructureDefinition/MedicationDispense", }, "urn:fhir:binding:MedicationDispenseStatus": { - package: "hl7.fhir.us.core#8.0.1", - canonical: "http://hl7.org/fhir/us/core/StructureDefinition/us-core-medicationdispense", + package: "hl7.fhir.r4.core#4.0.1", + canonical: "http://hl7.org/fhir/StructureDefinition/MedicationDispense", }, "urn:fhir:binding:MedicationDispenseType": { package: "hl7.fhir.r4.core#4.0.1", @@ -7192,15 +7192,15 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:MedicationForm": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/MedicationKnowledge", + canonical: "http://hl7.org/fhir/StructureDefinition/Medication", }, "urn:fhir:binding:MedicationFormalRepresentation": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/MedicationKnowledge", + canonical: "http://hl7.org/fhir/StructureDefinition/Medication", }, "urn:fhir:binding:MedicationIntendedSubstitutionReason": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/MedicationRequest", + canonical: "http://hl7.org/fhir/StructureDefinition/MedicationDispense", }, "urn:fhir:binding:MedicationIntendedSubstitutionType": { package: "hl7.fhir.r4.core#4.0.1", @@ -7219,8 +7219,8 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis canonical: "http://hl7.org/fhir/StructureDefinition/MedicationStatement", }, "urn:fhir:binding:MedicationRequestCategory": { - package: "hl7.fhir.us.core#8.0.1", - canonical: "http://hl7.org/fhir/us/core/StructureDefinition/us-core-medicationrequest", + package: "hl7.fhir.r4.core#4.0.1", + canonical: "http://hl7.org/fhir/StructureDefinition/MedicationRequest", }, "urn:fhir:binding:MedicationRequestCourseOfTherapy": { package: "hl7.fhir.r4.core#4.0.1", @@ -7296,7 +7296,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:MimeType": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/Binary", + canonical: "http://hl7.org/fhir/StructureDefinition/Attachment", }, "urn:fhir:binding:MissingReason": { package: "hl7.fhir.r4.core#4.0.1", @@ -7304,7 +7304,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:Modifiers": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/CoverageEligibilityRequest", + canonical: "http://hl7.org/fhir/StructureDefinition/Claim", }, "urn:fhir:binding:NameUse": { package: "hl7.fhir.r4.core#4.0.1", @@ -7343,8 +7343,8 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis canonical: "http://hl7.org/fhir/StructureDefinition/NutritionOrder", }, "urn:fhir:binding:ObservationCode": { - package: "hl7.fhir.us.core#8.0.1", - canonical: "http://hl7.org/fhir/us/core/StructureDefinition/us-core-average-blood-pressure", + package: "hl7.fhir.r4.core#4.0.1", + canonical: "http://hl7.org/fhir/StructureDefinition/Observation", }, "urn:fhir:binding:ObservationDataType": { package: "hl7.fhir.r4.core#4.0.1", @@ -7371,16 +7371,16 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis canonical: "http://hl7.org/fhir/StructureDefinition/Observation", }, "urn:fhir:binding:ObservationStatus": { - package: "hl7.fhir.us.core#8.0.1", - canonical: "http://hl7.org/fhir/us/core/StructureDefinition/us-core-average-blood-pressure", + package: "hl7.fhir.r4.core#4.0.1", + canonical: "http://hl7.org/fhir/StructureDefinition/Observation", }, "urn:fhir:binding:ObservationUnit": { package: "hl7.fhir.r4.core#4.0.1", canonical: "http://hl7.org/fhir/StructureDefinition/ObservationDefinition", }, "urn:fhir:binding:ObservationValueAbsentReason": { - package: "hl7.fhir.us.core#8.0.1", - canonical: "http://hl7.org/fhir/us/core/StructureDefinition/us-core-average-blood-pressure", + package: "hl7.fhir.r4.core#4.0.1", + canonical: "http://hl7.org/fhir/StructureDefinition/Observation", }, "urn:fhir:binding:OperationalStatus": { package: "hl7.fhir.r4.core#4.0.1", @@ -7435,8 +7435,8 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis canonical: "http://hl7.org/fhir/StructureDefinition/AppointmentResponse", }, "urn:fhir:binding:ParticipantType": { - package: "hl7.fhir.us.core#8.0.1", - canonical: "http://hl7.org/fhir/us/core/StructureDefinition/us-core-encounter", + package: "hl7.fhir.r4.core#4.0.1", + canonical: "http://hl7.org/fhir/StructureDefinition/Appointment", }, "urn:fhir:binding:ParticipationStatus": { package: "hl7.fhir.r4.core#4.0.1", @@ -7444,7 +7444,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:PatientDiet": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/NutritionOrder", + canonical: "http://hl7.org/fhir/StructureDefinition/Encounter", }, "urn:fhir:binding:PatientRelationshipType": { package: "hl7.fhir.r4.core#4.0.1", @@ -7476,7 +7476,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:PhysicalType": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/Location", + canonical: "http://hl7.org/fhir/StructureDefinition/Encounter", }, "urn:fhir:binding:PlanDefinitionType": { package: "hl7.fhir.r4.core#4.0.1", @@ -7552,7 +7552,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:ProcessPriority": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/CoverageEligibilityRequest", + canonical: "http://hl7.org/fhir/StructureDefinition/Claim", }, "urn:fhir:binding:Program": { package: "hl7.fhir.r4.core#4.0.1", @@ -7608,7 +7608,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:PublicationStatus": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/EventDefinition", + canonical: "http://hl7.org/fhir/StructureDefinition/ActivityDefinition", }, "urn:fhir:binding:PurposeOfUse": { package: "hl7.fhir.r4.core#4.0.1", @@ -7640,7 +7640,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:QuantityComparator": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/SimpleQuantity", + canonical: "http://hl7.org/fhir/StructureDefinition/Quantity", }, "urn:fhir:binding:QuestionnaireConcept": { package: "hl7.fhir.r4.core#4.0.1", @@ -7655,8 +7655,8 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis canonical: "http://hl7.org/fhir/StructureDefinition/Questionnaire", }, "urn:fhir:binding:QuestionnaireResponseStatus": { - package: "hl7.fhir.us.core#8.0.1", - canonical: "http://hl7.org/fhir/us/core/StructureDefinition/us-core-questionnaireresponse", + package: "hl7.fhir.r4.core#4.0.1", + canonical: "http://hl7.org/fhir/StructureDefinition/QuestionnaireResponse", }, "urn:fhir:binding:ReAdmissionType": { package: "hl7.fhir.r4.core#4.0.1", @@ -7696,7 +7696,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:RemittanceOutcome": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/EnrollmentResponse", + canonical: "http://hl7.org/fhir/StructureDefinition/ClaimResponse", }, "urn:fhir:binding:repositoryType": { package: "hl7.fhir.r4.core#4.0.1", @@ -7708,7 +7708,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:RequestPriority": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/PlanDefinition", + canonical: "http://hl7.org/fhir/StructureDefinition/ActivityDefinition", }, "urn:fhir:binding:RequestStatus": { package: "hl7.fhir.r4.core#4.0.1", @@ -7780,7 +7780,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:RouteOfAdministration": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/Dosage", + canonical: "http://hl7.org/fhir/StructureDefinition/AllergyIntolerance", }, "urn:fhir:binding:Safety": { package: "hl7.fhir.r4.core#4.0.1", @@ -7788,7 +7788,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:SearchComparator": { package: "hl7.fhir.r5.core#5.0.0", - canonical: "http://hl7.org/fhir/StructureDefinition/SubscriptionTopic", + canonical: "http://hl7.org/fhir/StructureDefinition/SearchParameter", }, "urn:fhir:binding:SearchEntryMode": { package: "hl7.fhir.r4.core#4.0.1", @@ -7796,7 +7796,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:SearchModifierCode": { package: "hl7.fhir.r5.core#5.0.0", - canonical: "http://hl7.org/fhir/StructureDefinition/SubscriptionTopic", + canonical: "http://hl7.org/fhir/StructureDefinition/SearchParameter", }, "urn:fhir:binding:SearchParamType": { package: "hl7.fhir.r4.core#4.0.1", @@ -7840,23 +7840,23 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:ServiceProduct": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/CoverageEligibilityRequest", + canonical: "http://hl7.org/fhir/StructureDefinition/Claim", }, "urn:fhir:binding:ServiceProvisionConditions": { package: "hl7.fhir.r4.core#4.0.1", canonical: "http://hl7.org/fhir/StructureDefinition/HealthcareService", }, "urn:fhir:binding:ServiceRequestCategory": { - package: "hl7.fhir.us.core#8.0.1", - canonical: "http://hl7.org/fhir/us/core/StructureDefinition/us-core-servicerequest", + package: "hl7.fhir.r4.core#4.0.1", + canonical: "http://hl7.org/fhir/StructureDefinition/ServiceRequest", }, "urn:fhir:binding:ServiceRequestCode": { package: "hl7.fhir.r4.core#4.0.1", canonical: "http://hl7.org/fhir/StructureDefinition/ServiceRequest", }, "urn:fhir:binding:ServiceRequestIntent": { - package: "hl7.fhir.us.core#8.0.1", - canonical: "http://hl7.org/fhir/us/core/StructureDefinition/us-core-servicerequest", + package: "hl7.fhir.r4.core#4.0.1", + canonical: "http://hl7.org/fhir/StructureDefinition/ServiceRequest", }, "urn:fhir:binding:ServiceRequestLocation": { package: "hl7.fhir.r4.core#4.0.1", @@ -7875,12 +7875,12 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis canonical: "http://hl7.org/fhir/StructureDefinition/ServiceRequest", }, "urn:fhir:binding:ServiceRequestStatus": { - package: "hl7.fhir.us.core#8.0.1", - canonical: "http://hl7.org/fhir/us/core/StructureDefinition/us-core-servicerequest", + package: "hl7.fhir.r4.core#4.0.1", + canonical: "http://hl7.org/fhir/StructureDefinition/ServiceRequest", }, "urn:fhir:binding:Sex": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/familymemberhistory-genetic", + canonical: "http://hl7.org/fhir/StructureDefinition/FamilyMemberHistory", }, "urn:fhir:binding:SignatureType": { package: "hl7.fhir.r4.core#4.0.1", @@ -7943,8 +7943,8 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis canonical: "http://hl7.org/fhir/StructureDefinition/VerificationResult", }, "urn:fhir:binding:Status": { - package: "hl7.fhir.us.core#8.0.1", - canonical: "http://hl7.org/fhir/us/core/StructureDefinition/us-core-vital-signs", + package: "hl7.fhir.r4.core#4.0.1", + canonical: "http://hl7.org/fhir/StructureDefinition/vitalsigns", }, "urn:fhir:binding:strandType": { package: "hl7.fhir.r4.core#4.0.1", @@ -8012,7 +8012,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:SubstanceCode": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/Substance", + canonical: "http://hl7.org/fhir/StructureDefinition/AllergyIntolerance", }, "urn:fhir:binding:SupplementType": { package: "hl7.fhir.r4.core#4.0.1", @@ -8196,7 +8196,7 @@ Add to `.typeSchema({ resolveCollisions: { ... } })` to resolve remaining collis }, "urn:fhir:binding:VitalSigns": { package: "hl7.fhir.r4.core#4.0.1", - canonical: "http://hl7.org/fhir/StructureDefinition/vitalsigns", + canonical: "http://hl7.org/fhir/StructureDefinition/bmi", }, "urn:fhir:binding:XPathUsageType": { package: "hl7.fhir.r4.core#4.0.1", diff --git a/src/typeschema/collision-order.ts b/src/typeschema/collision-order.ts new file mode 100644 index 00000000..64ef3429 --- /dev/null +++ b/src/typeschema/collision-order.ts @@ -0,0 +1,31 @@ +type CollisionSource = { + sourceCanonical: string; + sourcePackage: string; +}; + +type CollisionVariant = { + schemaHash: string; + sources: readonly CollisionSource[]; +}; + +const compareStrings = (left: string, right: string): number => { + if (left < right) return -1; + if (left > right) return 1; + return 0; +}; + +export const compareCollisionSources = (left: CollisionSource, right: CollisionSource): number => + compareStrings(left.sourcePackage, right.sourcePackage) || + compareStrings(left.sourceCanonical, right.sourceCanonical); + +const collisionSourcesKey = (sources: readonly CollisionSource[]): string => + JSON.stringify( + [...sources] + .sort(compareCollisionSources) + .map(({ sourcePackage, sourceCanonical }) => [sourcePackage, sourceCanonical]), + ); + +export const compareCollisionVariants = (left: CollisionVariant, right: CollisionVariant): number => + right.sources.length - left.sources.length || + compareStrings(collisionSourcesKey(left.sources), collisionSourcesKey(right.sources)) || + compareStrings(left.schemaHash, right.schemaHash); diff --git a/src/typeschema/index.ts b/src/typeschema/index.ts index fa02d170..3b35ceb0 100644 --- a/src/typeschema/index.ts +++ b/src/typeschema/index.ts @@ -11,6 +11,7 @@ */ import type { CodegenLog } from "@root/utils/log"; +import { compareCollisionSources, compareCollisionVariants } from "./collision-order"; import { transformFhirSchema, transformValueSet } from "./core/transformer"; import type { ResolveCollisionsConf, TypeSchemaCollisions } from "./ir/types"; import type { Register } from "./register"; @@ -54,7 +55,13 @@ const deduplicateSchemas = ( const collisions: TypeSchemaCollisions = {}; for (const versions of Object.values(groups)) { - const sorted = Object.values(versions).sort((a, b) => b.sources.length - a.sources.length); + const sorted = Object.entries(versions) + .map(([schemaHash, version]) => ({ + ...version, + schemaHash, + sources: [...version.sources].sort(compareCollisionSources), + })) + .sort(compareCollisionVariants); const best = sorted[0]; if (!best) continue; diff --git a/src/typeschema/ir/report.ts b/src/typeschema/ir/report.ts index b47fdde2..77be1305 100644 --- a/src/typeschema/ir/report.ts +++ b/src/typeschema/ir/report.ts @@ -1,5 +1,6 @@ import type { CanonicalUrl, PkgName } from "@root/typeschema/types"; -import { extractNameFromCanonical } from "@root/typeschema/types"; +import { extractNameFromCanonical, hashSchema } from "@root/typeschema/types"; +import { compareCollisionSources, compareCollisionVariants } from "../collision-order"; import type { CollisionResolution, IrReport, @@ -68,12 +69,19 @@ type VersionGroup = { entries: CollisionEntry[]; mark: VersionMark }; const groupCollisionVersions = (entries: CollisionEntry[], resolution?: CollisionResolution): VersionGroup[] => { const uniqueSchemas = new Map(); for (const entry of entries) { - const key = JSON.stringify(entry.typeSchema); + const key = hashSchema(entry.typeSchema); if (!uniqueSchemas.has(key)) uniqueSchemas.set(key, []); uniqueSchemas.get(key)?.push(entry); } - const sorted = [...uniqueSchemas.values()].sort((a, b) => b.length - a.length); + const sorted = [...uniqueSchemas.entries()] + .map(([schemaHash, group]) => ({ + entries: [...group].sort(compareCollisionSources), + schemaHash, + sources: group, + })) + .sort(compareCollisionVariants) + .map((group) => group.entries); const markVersion = (group: CollisionEntry[], i: number): VersionMark => { if (resolution) return group.some( diff --git a/test/unit/typeschema/collision-order.test.ts b/test/unit/typeschema/collision-order.test.ts new file mode 100644 index 00000000..7dd6651b --- /dev/null +++ b/test/unit/typeschema/collision-order.test.ts @@ -0,0 +1,36 @@ +import { describe, expect, it } from "bun:test"; +import { compareCollisionVariants } from "@root/typeschema/collision-order"; + +describe("collision ordering", () => { + const variants = [ + { + id: "more-sources", + schemaHash: "c", + sources: [ + { sourcePackage: "pkg#1", sourceCanonical: "http://example.org/z" }, + { sourcePackage: "pkg#1", sourceCanonical: "http://example.org/y" }, + ], + }, + { + id: "source-tie-break", + schemaHash: "b", + sources: [{ sourcePackage: "pkg#1", sourceCanonical: "http://example.org/a" }], + }, + { + id: "hash-tie-break", + schemaHash: "a", + sources: [{ sourcePackage: "pkg#1", sourceCanonical: "http://example.org/a" }], + }, + ]; + + it("orders variants independently of discovery order", () => { + const forward = [...variants].sort(compareCollisionVariants).map((variant) => variant.id); + const reversed = [...variants] + .reverse() + .sort(compareCollisionVariants) + .map((variant) => variant.id); + + expect(forward).toEqual(["more-sources", "hash-tie-break", "source-tie-break"]); + expect(reversed).toEqual(forward); + }); +}); From 5bfde577909ade0c9c57c55495e5243f061c8c51 Mon Sep 17 00:00:00 2001 From: Malte Sussdorff Date: Sat, 18 Jul 2026 16:40:20 +0200 Subject: [PATCH 6/8] fix(typeschema): preserve explicit choice type ceilings (codegen-y24) --- src/typeschema/core/field-builder.ts | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/typeschema/core/field-builder.ts b/src/typeschema/core/field-builder.ts index c7b34f67..28198085 100644 --- a/src/typeschema/core/field-builder.ts +++ b/src/typeschema/core/field-builder.ts @@ -271,7 +271,11 @@ const computeMatchFromSchema = ( const choiceBaseName = (name: string): string => (name.endsWith("[x]") ? name.slice(0, -3) : name); +const choiceInstanceName = (baseName: string, typeCode: string): string => + `${baseName}${typeCode.charAt(0).toUpperCase()}${typeCode.slice(1)}`; + type DifferentialChoiceMetadata = { + choices: string[]; choiceTypesExplicit: boolean; slicingRules?: string; slicingRulesExplicit: boolean; @@ -291,8 +295,13 @@ const resolveDifferentialChoiceMetadata = ( const differentialPath = candidate.path.split(".").slice(1).map(choiceBaseName); return differentialPath.length === path.length && differentialPath.every((part, index) => part === path[index]); }); + const baseName = path[path.length - 1] ?? ""; + const choices = (differentialElement?.type ?? []).flatMap((type) => + type.code ? [choiceInstanceName(baseName, type.code)] : [], + ); return { - choiceTypesExplicit: (differentialElement?.type?.length ?? 0) > 0, + choices, + choiceTypesExplicit: choices.length > 0, slicingRules: differentialElement?.slicing?.rules, slicingRulesExplicit: differentialElement?.slicing?.rules !== undefined, }; @@ -452,7 +461,10 @@ export const mkField = ( max: element.max, slicing: buildSlicing(path[path.length - 1] ?? "", element, differentialChoiceMetadata?.slicingRules), - choices: element.choices, + choices: + differentialChoiceMetadata && differentialChoiceMetadata.choices.length > 0 + ? differentialChoiceMetadata.choices + : element.choices, choiceOf: element.choiceOf, ...(element.choices && differentialChoiceMetadata ? { From 2a44b29e7e332261072f63dc1810c1a345126387 Mon Sep 17 00:00:00 2001 From: Malte Sussdorff Date: Sat, 18 Jul 2026 16:40:20 +0200 Subject: [PATCH 7/8] test(typeschema): cover open multi-type ceilings (codegen-y24) --- ...-type-observation.structuredefinition.json | 90 +++++++++++++++++++ ...value-observation.structuredefinition.json | 56 ++++++++++++ .../multi-package/local-package.test.ts | 30 +++++++ 3 files changed, 176 insertions(+) create mode 100644 examples/typescript-custom-packages/structure-definitions/example-open-multi-type-observation.structuredefinition.json create mode 100644 examples/typescript-custom-packages/structure-definitions/example-open-primitive-value-observation.structuredefinition.json diff --git a/examples/typescript-custom-packages/structure-definitions/example-open-multi-type-observation.structuredefinition.json b/examples/typescript-custom-packages/structure-definitions/example-open-multi-type-observation.structuredefinition.json new file mode 100644 index 00000000..e1dd15a9 --- /dev/null +++ b/examples/typescript-custom-packages/structure-definitions/example-open-multi-type-observation.structuredefinition.json @@ -0,0 +1,90 @@ +{ + "resourceType": "StructureDefinition", + "id": "example-open-multi-type-observation", + "url": "http://example.org/fhir/StructureDefinition/ExampleOpenMultiTypeObservation", + "version": "0.0.1", + "name": "ExampleOpenMultiTypeObservation", + "title": "Example Open Multi-Type Observation", + "status": "draft", + "date": "2024-01-01", + "publisher": "Atomic Example Studio", + "description": "An Observation profile with explicit multi-type ceilings and open type slices.", + "fhirVersion": "4.0.1", + "kind": "resource", + "abstract": false, + "type": "Observation", + "baseDefinition": "http://hl7.org/fhir/StructureDefinition/Observation", + "derivation": "constraint", + "differential": { + "element": [ + { + "id": "Observation.effective[x]", + "path": "Observation.effective[x]", + "slicing": { + "discriminator": [ + { + "type": "type", + "path": "$this" + } + ], + "rules": "open", + "ordered": false + }, + "type": [ + { + "code": "dateTime" + }, + { + "code": "Period" + } + ] + }, + { + "id": "Observation.effective[x]:effectivePeriod", + "path": "Observation.effective[x]", + "sliceName": "effectivePeriod", + "min": 0, + "max": "1", + "type": [ + { + "code": "Period" + } + ] + }, + { + "id": "Observation.value[x]", + "path": "Observation.value[x]", + "slicing": { + "discriminator": [ + { + "type": "type", + "path": "$this" + } + ], + "rules": "open", + "ordered": false + }, + "type": [ + { + "code": "Quantity" + }, + { + "code": "CodeableConcept" + } + ] + }, + { + "id": "Observation.value[x]:valueCodeableConcept", + "path": "Observation.value[x]", + "sliceName": "valueCodeableConcept", + "min": 0, + "max": "1", + "type": [ + { + "code": "CodeableConcept" + } + ] + } + ] + } +} diff --git a/examples/typescript-custom-packages/structure-definitions/example-open-primitive-value-observation.structuredefinition.json b/examples/typescript-custom-packages/structure-definitions/example-open-primitive-value-observation.structuredefinition.json new file mode 100644 index 00000000..06a89f66 --- /dev/null +++ b/examples/typescript-custom-packages/structure-definitions/example-open-primitive-value-observation.structuredefinition.json @@ -0,0 +1,56 @@ +{ + "resourceType": "StructureDefinition", + "id": "example-open-primitive-value-observation", + "url": "http://example.org/fhir/StructureDefinition/ExampleOpenPrimitiveValueObservation", + "version": "0.0.1", + "name": "ExampleOpenPrimitiveValueObservation", + "title": "Example Open Primitive Value Observation", + "status": "draft", + "date": "2024-01-01", + "publisher": "Atomic Example Studio", + "description": "An Observation profile with an explicit primitive and complex value choice ceiling.", + "fhirVersion": "4.0.1", + "kind": "resource", + "abstract": false, + "type": "Observation", + "baseDefinition": "http://hl7.org/fhir/StructureDefinition/Observation", + "derivation": "constraint", + "differential": { + "element": [ + { + "id": "Observation.value[x]", + "path": "Observation.value[x]", + "slicing": { + "discriminator": [ + { + "type": "type", + "path": "$this" + } + ], + "rules": "open", + "ordered": false + }, + "type": [ + { + "code": "CodeableConcept" + }, + { + "code": "boolean" + } + ] + }, + { + "id": "Observation.value[x]:valueCodeableConcept", + "path": "Observation.value[x]", + "sliceName": "valueCodeableConcept", + "min": 0, + "max": "1", + "type": [ + { + "code": "CodeableConcept" + } + ] + } + ] + } +} diff --git a/test/api/write-generator/multi-package/local-package.test.ts b/test/api/write-generator/multi-package/local-package.test.ts index fc19dec0..40e68f74 100644 --- a/test/api/write-generator/multi-package/local-package.test.ts +++ b/test/api/write-generator/multi-package/local-package.test.ts @@ -106,6 +106,8 @@ describe("Local Package Folder - Multi-Package Generation", async () => { "http://example.org/fhir/StructureDefinition/ExampleClosedChoiceCondition": {}, "http://example.org/fhir/StructureDefinition/ExampleInheritedOpenChoiceCondition": {}, "http://example.org/fhir/StructureDefinition/ExampleOpenEffectiveObservation": {}, + "http://example.org/fhir/StructureDefinition/ExampleOpenMultiTypeObservation": {}, + "http://example.org/fhir/StructureDefinition/ExampleOpenPrimitiveValueObservation": {}, "http://example.org/fhir/StructureDefinition/ExampleRootRestrictedChoiceCondition": {}, }, "hl7.fhir.r4.core": { @@ -169,6 +171,34 @@ describe("Local Package Folder - Multi-Package Generation", async () => { expect(profileFile).toContain('validateExcluded(res, profileName, "effectiveInstant")'); }); + // Guards codegen-y24: the differential type list is the effective ceiling even when only one slice is materialized. + it("fixes codegen-y24 for explicit open multi-type ceilings", () => { + const profileFile = + result.filesGenerated.typescript![ + "generated/types/example-folder-structures/profiles/Observation_ExampleOpenMultiTypeObservation.ts" + ]; + expect(profileFile).toBeDefined(); + expect(profileFile).not.toContain('validateExcluded(res, profileName, "effectiveDateTime")'); + expect(profileFile).not.toContain('validateExcluded(res, profileName, "effectivePeriod")'); + expect(profileFile).toContain('validateExcluded(res, profileName, "effectiveTiming")'); + expect(profileFile).toContain('validateExcluded(res, profileName, "effectiveInstant")'); + expect(profileFile).not.toContain('validateExcluded(res, profileName, "valueQuantity")'); + expect(profileFile).not.toContain('validateExcluded(res, profileName, "valueCodeableConcept")'); + expect(profileFile).toContain('validateExcluded(res, profileName, "valueBoolean")'); + }); + + // Guards codegen-y24 for a primitive type that has no separate typed slice in the differential. + it("fixes codegen-y24 for explicit open primitive choice types", () => { + const profileFile = + result.filesGenerated.typescript![ + "generated/types/example-folder-structures/profiles/Observation_ExampleOpenPrimitiveValueObservation.ts" + ]; + expect(profileFile).toBeDefined(); + expect(profileFile).not.toContain('validateExcluded(res, profileName, "valueBoolean")'); + expect(profileFile).not.toContain('validateExcluded(res, profileName, "valueCodeableConcept")'); + expect(profileFile).toContain('validateExcluded(res, profileName, "valueQuantity")'); + }); + it("should apply a child root type restriction under inherited open slicing", () => { const profileFile = result.filesGenerated.typescript![ From 2e2d0dda68274cce03adcf90f6f8105ac9644544 Mon Sep 17 00:00:00 2001 From: Malte Sussdorff Date: Sat, 18 Jul 2026 16:57:33 +0200 Subject: [PATCH 8/8] chore(examples): refresh Python profile report (codegen-y24) --- examples/python-r4-us-core/fhir_types/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/python-r4-us-core/fhir_types/README.md b/examples/python-r4-us-core/fhir_types/README.md index 5ef82f9c..4bb8850b 100644 --- a/examples/python-r4-us-core/fhir_types/README.md +++ b/examples/python-r4-us-core/fhir_types/README.md @@ -23,6 +23,8 @@ - `http://example.org/fhir/StructureDefinition/ExampleNotebook` - `http://example.org/fhir/StructureDefinition/ExampleOpenChoiceCondition` - `http://example.org/fhir/StructureDefinition/ExampleOpenEffectiveObservation` +- `http://example.org/fhir/StructureDefinition/ExampleOpenMultiTypeObservation` +- `http://example.org/fhir/StructureDefinition/ExampleOpenPrimitiveValueObservation` - `http://example.org/fhir/StructureDefinition/ExampleRestrictedEffectiveObservation` - `http://example.org/fhir/StructureDefinition/ExampleRootRestrictedChoiceCondition` - `http://example.org/fhir/StructureDefinition/ExampleTypedBundle`