Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 14 additions & 14 deletions examples/csharp/generated/base.cs
Original file line number Diff line number Diff line change
Expand Up @@ -122,12 +122,12 @@ public override string ToString() =>
}

public class DataRequirement : Element {
public Element[]? CodeFilter { get; set; }
public Element[]? DateFilter { get; set; }
public DataRequirementCodeFilter[]? CodeFilter { get; set; }
public DataRequirementDateFilter[]? DateFilter { get; set; }
public long? Limit { get; set; }
public string[]? MustSupport { get; set; }
public string[]? Profile { get; set; }
public Element[]? Sort { get; set; }
public DataRequirementSort[]? Sort { get; set; }
public CodeableConcept? SubjectCodeableConcept { get; set; }
public ResourceReference? SubjectReference { get; set; }
public required string Type { get; set; }
Expand Down Expand Up @@ -181,7 +181,7 @@ public class Dosage : BackboneElement {
public CodeableConcept[]? AdditionalInstruction { get; set; }
public bool? AsNeededBoolean { get; set; }
public CodeableConcept? AsNeededCodeableConcept { get; set; }
public Element[]? DoseAndRate { get; set; }
public DosageDoseAndRate[]? DoseAndRate { get; set; }
public Quantity? MaxDosePerAdministration { get; set; }
public Quantity? MaxDosePerLifetime { get; set; }
public Ratio? MaxDosePerPeriod { get; set; }
Expand Down Expand Up @@ -230,12 +230,12 @@ public override string ToString() =>

public class ElementDefinition : BackboneElement {
public string[]? Alias { get; set; }
public Element? Base { get; set; }
public Element? Binding { get; set; }
public ElementDefinitionBase? Base { get; set; }
public ElementDefinitionBinding? Binding { get; set; }
public Coding[]? Code { get; set; }
public string? Comment { get; set; }
public string[]? Condition { get; set; }
public Element[]? Constraint { get; set; }
public ElementDefinitionConstraint[]? Constraint { get; set; }
public string? ContentReference { get; set; }
public Address? DefaultValueAddress { get; set; }
public Age? DefaultValueAge { get; set; }
Expand Down Expand Up @@ -288,7 +288,7 @@ public class ElementDefinition : BackboneElement {
public UsageContext? DefaultValueUsageContext { get; set; }
public string? DefaultValueUuid { get; set; }
public string? Definition { get; set; }
public Element[]? Example { get; set; }
public ElementDefinitionExample[]? Example { get; set; }
public Address? FixedAddress { get; set; }
public Age? FixedAge { get; set; }
public Annotation? FixedAnnotation { get; set; }
Expand Down Expand Up @@ -343,7 +343,7 @@ public class ElementDefinition : BackboneElement {
public string? IsModifierReason { get; set; }
public bool? IsSummary { get; set; }
public string? Label { get; set; }
public Element[]? Mapping { get; set; }
public ElementDefinitionMapping[]? Mapping { get; set; }
public string? Max { get; set; }
public int? MaxLength { get; set; }
public string? MaxValueDate { get; set; }
Expand Down Expand Up @@ -424,8 +424,8 @@ public class ElementDefinition : BackboneElement {
public string? Short { get; set; }
public bool? SliceIsConstraining { get; set; }
public string? SliceName { get; set; }
public Element? Slicing { get; set; }
public Element[]? Type { get; set; }
public ElementDefinitionSlicing? Slicing { get; set; }
public ElementDefinitionType[]? Type { get; set; }

public class ElementDefinitionBase : Element {
public required string Max { get; set; }
Expand Down Expand Up @@ -532,7 +532,7 @@ public override string ToString() =>

public class ElementDefinitionSlicing : Element {
public string? Description { get; set; }
public Element[]? Discriminator { get; set; }
public ElementDefinitionSlicingDiscriminator[]? Discriminator { get; set; }
public bool? Ordered { get; set; }
public required SlicingRulesEnum Rules { get; set; }

Expand Down Expand Up @@ -861,7 +861,7 @@ public class SubstanceAmount : BackboneElement {
public string? AmountString { get; set; }
public string? AmountText { get; set; }
public CodeableConcept? AmountType { get; set; }
public Element? ReferenceRange { get; set; }
public SubstanceAmountReferenceRange? ReferenceRange { get; set; }

public class SubstanceAmountReferenceRange : Element {
public Quantity? HighLimit { get; set; }
Expand All @@ -881,7 +881,7 @@ public override string ToString() =>
public class Timing : BackboneElement {
public CodeableConcept? Code { get; set; }
public string[]? Event { get; set; }
public Element? Repeat { get; set; }
public TimingRepeat? Repeat { get; set; }

public class TimingRepeat : Element {
public Duration? BoundsDuration { get; set; }
Expand Down
10 changes: 5 additions & 5 deletions examples/python/fhir_types/hl7_fhir_r4_core/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -130,12 +130,12 @@ class DataRequirementSort(Element):

class DataRequirement(Element):
model_config = ConfigDict(validate_by_name=True, serialize_by_alias=True, extra="forbid")
code_filter: PyList[Element] | None = Field(None, alias="codeFilter", serialization_alias="codeFilter")
date_filter: PyList[Element] | None = Field(None, alias="dateFilter", serialization_alias="dateFilter")
code_filter: PyList[DataRequirementCodeFilter] | None = Field(None, alias="codeFilter", serialization_alias="codeFilter")
date_filter: PyList[DataRequirementDateFilter] | None = Field(None, alias="dateFilter", serialization_alias="dateFilter")
limit: PositiveInt | None = Field(None, alias="limit", serialization_alias="limit")
must_support: PyList[str] | None = Field(None, alias="mustSupport", serialization_alias="mustSupport")
profile: PyList[str] | None = Field(None, alias="profile", serialization_alias="profile")
sort: PyList[Element] | None = Field(None, alias="sort", serialization_alias="sort")
sort: PyList[DataRequirementSort] | None = Field(None, alias="sort", serialization_alias="sort")
subject_codeable_concept: CodeableConcept | None = Field(None, alias="subjectCodeableConcept", serialization_alias="subjectCodeableConcept")
subject_reference: Reference | None = Field(None, alias="subjectReference", serialization_alias="subjectReference")
type: str = Field(alias="type", serialization_alias="type")
Expand All @@ -161,7 +161,7 @@ class Dosage(BackboneElement):
additional_instruction: PyList[CodeableConcept] | None = Field(None, alias="additionalInstruction", serialization_alias="additionalInstruction")
as_needed_boolean: bool | None = Field(None, alias="asNeededBoolean", serialization_alias="asNeededBoolean")
as_needed_codeable_concept: CodeableConcept | None = Field(None, alias="asNeededCodeableConcept", serialization_alias="asNeededCodeableConcept")
dose_and_rate: PyList[Element] | None = Field(None, alias="doseAndRate", serialization_alias="doseAndRate")
dose_and_rate: PyList[DosageDoseAndRate] | None = Field(None, alias="doseAndRate", serialization_alias="doseAndRate")
max_dose_per_administration: Quantity | None = Field(None, alias="maxDosePerAdministration", serialization_alias="maxDosePerAdministration")
max_dose_per_lifetime: Quantity | None = Field(None, alias="maxDosePerLifetime", serialization_alias="maxDosePerLifetime")
max_dose_per_period: Ratio | None = Field(None, alias="maxDosePerPeriod", serialization_alias="maxDosePerPeriod")
Expand Down Expand Up @@ -381,7 +381,7 @@ class Timing(BackboneElement):
model_config = ConfigDict(validate_by_name=True, serialize_by_alias=True, extra="forbid")
code: CodeableConcept | None = Field(None, alias="code", serialization_alias="code")
event: PyList[str] | None = Field(None, alias="event", serialization_alias="event")
repeat: Element | None = Field(None, alias="repeat", serialization_alias="repeat")
repeat: TimingRepeat | None = Field(None, alias="repeat", serialization_alias="repeat")


class TriggerDefinition(Element):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,15 +38,15 @@ export interface DataRequirementSort extends Element {

// CanonicalURL: http://hl7.org/fhir/StructureDefinition/DataRequirement (pkg: hl7.fhir.r4.core#4.0.1)
export interface DataRequirement extends Element {
codeFilter?: Element[];
dateFilter?: Element[];
codeFilter?: DataRequirementCodeFilter[];
dateFilter?: DataRequirementDateFilter[];
limit?: number;
_limit?: Element;
mustSupport?: string[];
_mustSupport?: (Element | null)[];
profile?: string[];
_profile?: (Element | null)[];
sort?: Element[];
sort?: DataRequirementSort[];
subjectCodeableConcept?: CodeableConcept;
subjectReference?: Reference<"Group">;
type: string;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ export interface Dosage extends BackboneElement {
asNeededBoolean?: boolean;
_asNeededBoolean?: Element;
asNeededCodeableConcept?: CodeableConcept;
doseAndRate?: Element[];
doseAndRate?: DosageDoseAndRate[];
maxDosePerAdministration?: Quantity;
maxDosePerLifetime?: Quantity;
maxDosePerPeriod?: Ratio;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,5 +41,5 @@ export interface Timing extends BackboneElement {
code?: CodeableConcept<("BID" | "TID" | "QID" | "AM" | "PM" | "QD" | "QOD" | "Q1H" | "Q2H" | "Q3H" | "Q4H" | "Q6H" | "Q8H" | "BED" | "WK" | "MO" | string)>;
event?: string[];
_event?: (Element | null)[];
repeat?: Element;
repeat?: TimingRepeat;
}
1 change: 1 addition & 0 deletions examples/typescript-r4/fhir-types/type-tree.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ hl7.fhir.r4.core:
value-set: {}
nested:
http://hl7.org/fhir/StructureDefinition/Observation#component: {}
http://hl7.org/fhir/StructureDefinition/Observation#referenceRange: {}
binding: {}
profile:
http://hl7.org/fhir/StructureDefinition/patient-birthPlace: {}
Expand Down
7 changes: 5 additions & 2 deletions src/api/writer-generator/typescript/name.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ export const tsModuleName = (id: Identifier): string => {
// - http://hl7.org/fhir/5.0/StructureDefinition/extension-Subscription.topic (subscription_topic)
// - http://hl7.org/fhir/5.0/StructureDefinition/extension-SubscriptionTopic (SubscriptionTopic)
// And they should not clash the names.
return uppercaseFirstLetter(normalizeTsName(id.name));
return uppercaseFirstLetter(tsResourceName(id));
};

export const tsModuleFileName = (id: Identifier): string => {
Expand Down Expand Up @@ -65,7 +65,10 @@ export const tsResourceName = (id: Identifier): string => {
const name = uppercaseFirstLetterOfEach((fragment ?? "").split(".")).join("");
return normalizeTsName([resourceName, name].join(""));
}
return normalizeTsName(id.name);
const name = id.name.includes("/")
? (extractNameFromCanonical(id.name as unknown as CanonicalUrl) ?? id.name)
: id.name;
return normalizeTsName(name);
};

export const tsFieldName = (n: string): string => {
Expand Down
11 changes: 4 additions & 7 deletions src/api/writer-generator/typescript/writer.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { uppercaseFirstLetter } from "@root/api/writer-generator/utils";
import { Writer, type WriterOptions } from "@root/api/writer-generator/writer";
import {
type CanonicalUrl,
Expand Down Expand Up @@ -109,7 +108,7 @@ export class TypeScript extends Writer<TypeScriptOptions> {
if (["complex-type", "resource", "logical"].includes(dep.kind)) {
imports.push({
tsPackage: `${importPrefix}${tsModulePath(dep)}`,
name: uppercaseFirstLetter(dep.name),
name: tsResourceName(dep),
dep: dep,
});
} else if (isNestedIdentifier(dep)) {
Expand Down Expand Up @@ -148,13 +147,11 @@ export class TypeScript extends Writer<TypeScriptOptions> {
}

generateComplexTypeReexports(schema: RegularTypeSchema) {
const complexTypeDeps = schema.dependencies?.filter(isComplexTypeIdentifier).map((dep) => ({
tsPackage: `../${tsModulePath(dep)}`,
name: uppercaseFirstLetter(dep.name),
}));
const complexTypeDeps = schema.dependencies?.filter(isComplexTypeIdentifier);
if (complexTypeDeps && complexTypeDeps.length > 0) {
for (const dep of complexTypeDeps) {
this.lineSM(`export type { ${dep.name} } from "${dep.tsPackage}"`);
this.debugComment(dep);
this.lineSM(`export type { ${tsResourceName(dep)} } from "${`../${tsModulePath(dep)}`}"`);
}
this.line();
}
Expand Down
25 changes: 2 additions & 23 deletions src/typeschema/core/field-builder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ export function buildFieldType(
const refPath = element.elementReference
.slice(1) // drop canonicalUrl
.filter((_, i) => i % 2 === 1); // drop `elements` from path
return mkNestedIdentifier(register, fhirSchema, refPath, logger);
return mkNestedIdentifier(register, fhirSchema, refPath);
} else if (element.type) {
const url = register.ensureSpecializationCanonicalUrl(element.type);
const fieldFs = register.resolveFs(fhirSchema.package_meta, url);
Expand Down Expand Up @@ -206,34 +206,13 @@ export const mkField = (
};
};

export function isNestedElement(element: FHIRSchemaElement): boolean {
const isBackbone = element.type === "BackboneElement";
const isElement =
element.type === "Element" && element.elements !== undefined && Object.keys(element.elements).length > 0;

// TODO: Observation <- vitalsigns <- bodyweight
// In Observation we have value[x] with choices
// In bodyweight we have valueQuantity with additional constaraints on it's elements
// So we need to build nested type from Quantity for here, but don't do that right now.
const elementsWithoutType =
// FIXME: understand and make a decision.
// Problem example: http://hl7.org/cda/stds/core/StructureDefinition/SubstanceAdministration -> consumable
// Don't generate nested type for that field, but defetly expect it.
element.type === undefined &&
element.choiceOf === undefined &&
element.elements !== undefined &&
Object.keys(element.elements).length > 0;
return isBackbone || isElement || elementsWithoutType;
}

export function mkNestedField(
register: Register,
fhirSchema: RichFHIRSchema,
path: string[],
element: FHIRSchemaElement,
logger?: CodegenLogger,
): RegularField {
const nestedIdentifier = mkNestedIdentifier(register, fhirSchema, path, logger);
const nestedIdentifier = mkNestedIdentifier(register, fhirSchema, path);
return {
type: nestedIdentifier,
array: element.array || false,
Expand Down
Loading