Skip to content

Commit 024b8e8

Browse files
committed
fix: generation typescript deps in modules for profiles
1 parent d6f53b9 commit 024b8e8

11 files changed

+444
-42
lines changed

src/aidbox_sdk/converter.clj

+2-1
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,7 @@
191191
:resource-name (url->resource-name (get schema :url))
192192
:base-resource-name (when (get schema :base)
193193
(url->resource-name (get schema :base)))
194+
:fhir-version (get schema :fhir-version)
194195
:package (get schema :package)
195196
:url (get schema :url)
196197
:type (get schema :type)
@@ -262,6 +263,7 @@
262263
;; Convert main function
263264
;;
264265

266+
265267
(defn convert [schemas]
266268
(->> schemas
267269
(map resolve-element-references)
@@ -362,7 +364,6 @@
362364
((fn [schema] (update schema :deps set/union #{"Meta"})))
363365
((fn [schema] (assoc schema :resource-name (url->resource-name (:url constraint)))))))
364366

365-
366367
(defn apply-constraint [base-schema constraint]
367368
(-> base-schema
368369
;; apply required

src/aidbox_sdk/fhir.clj

+3
Original file line numberDiff line numberDiff line change
@@ -159,3 +159,6 @@
159159
(filter #(= url (:url %)) schemas))
160160

161161
(def find-by-url (comp first filter-by-url))
162+
163+
(defn base-package? [schema]
164+
(contains? #{"hl7.fhir.r4.core" "hl7.fhir.r4b.core" "hl7.fhir.r5.core"} (:package schema)))

src/aidbox_sdk/generator/typescript.clj

+19-20
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@
55
->camel-case]]
66
[aidbox-sdk.generator.utils :as u]
77
[clojure.java.io :as io]
8-
[clojure.string :as str])
8+
[clojure.string :as str]
9+
[aidbox-sdk.fhir :as fhir])
910
(:import
1011
[aidbox_sdk.generator CodeGenerator]))
1112

12-
(defn package->directory
13-
"Generates directory name from package name.
13+
(defn package->directory "Generates directory name from package name.
1414
1515
Example:
1616
hl7.fhir.r4.core -> hl7-fhir-r4-core"
@@ -149,24 +149,23 @@
149149
(str/replace path #"(\.ts)|[\.\/]" ""))
150150

151151
(defn generate-deps
152-
"Takes a list of resource names and generates import declarations."
153-
[deps]
154-
(->> deps
155-
(map (fn [{:keys [module members]}]
156-
(if (seq members)
157-
(format "import { %s } from \"%s\";" (str/join ", " members) module)
158-
(format "import * as %s from \"%s\";" (path->name module) module))))
159-
(str/join "\n")))
152+
"Takes an IR schema generates import declarations."
153+
[{:keys [deps package fhir-version] :as ir-schema}]
154+
(let [relative-path (if (fhir/base-package? ir-schema)
155+
"./"
156+
(str "../" (package->directory (:fhir-version ir-schema)) "/"))]
157+
(->> (:deps ir-schema)
158+
(map class-name)
159+
(map (fn [d] {:module (str relative-path d) :members [d]}))
160+
(map (fn [{:keys [module members]}]
161+
(if (seq members) (format "import { %s } from \"%s\";" (str/join ", " members) module) (format "import * as %s from \"%s\";" (path->name module) module))))
162+
(str/join "\n"))))
160163

161164
(defn generate-module
162165
[& {:keys [deps classes]
163166
:or {classes []}}]
164167
(->> (conj []
165-
(->> deps
166-
(map class-name)
167-
(map (fn [d] {:module (str "./" d) :members [d]}))
168-
generate-deps)
169-
168+
deps
170169
classes)
171170
(flatten)
172171
(str/join "\n\n")))
@@ -178,22 +177,22 @@
178177
(map (fn [ir-schema]
179178
{:path (resource-file-path ir-schema)
180179
:content (generate-module
181-
:deps (:deps ir-schema)
180+
:deps (generate-deps ir-schema)
182181
:classes [(generate-class ir-schema (map generate-class (:backbone-elements ir-schema)))])})
183182
ir-schemas)))
184183

185184
(generate-resource-module [_ ir-schema]
186185
{:path (resource-file-path ir-schema)
187186
:content (generate-module
188-
{:deps (:deps ir-schema)
187+
{:deps (generate-deps ir-schema)
189188
:classes [(generate-class ir-schema
190189
(map generate-class (:backbone-elements ir-schema)))]})})
191190

192191
(generate-search-params [_ ir-schemas]
193192
(map (fn [ir-schema]
194193
{:path (search-param-filepath ir-schema)
195194
:content (generate-module
196-
:deps (map #(format "%sSearchParameters" %) (:deps ir-schema))
195+
:deps (generate-deps {:package "hl7.fhir.r4.core" :deps (map #(format "%sSearchParameters" %) (:deps ir-schema))})
197196
:classes [(generate-class
198197
{:name (format "%sSearchParameters" (:name ir-schema))
199198
:base (when (:base ir-schema)
@@ -205,7 +204,7 @@
205204
(map (fn [ir-schema]
206205
{:path (resource-file-path ir-schema)
207206
:content (generate-module
208-
{:deps (:deps ir-schema)
207+
{:deps (generate-deps ir-schema)
209208
:classes [(generate-class ir-schema
210209
(map generate-class (:backbone-elements ir-schema)))]})})
211210
ir-schemas))

src/aidbox_sdk/schema.clj

+18-7
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
(filter #(str/ends-with? (.getName %) ".gz")))]
1717
(println "✅ Found packages:" (count packages))
1818
packages))
19-
2019
(defn create-gzip-reader [path]
2120
(-> path
2221
(io/input-stream)
@@ -40,9 +39,7 @@
4039
(map (fn [schema]
4140
(if-not (:resourceType schema)
4241
(assoc schema :resourceType "FHIRSchema")
43-
schema)
44-
45-
))))
42+
schema)))))
4643

4744
(defn prepare-schemas [schemas]
4845
(map #(->> (get-in % [:package-meta :name])
@@ -106,6 +103,18 @@
106103
(defn skip-root-package [packages]
107104
(rest packages))
108105

106+
(defn get-fhir-version [package]
107+
(let [allowed-base-packages #{"hl7.fhir.r4.core" "hl7.fhir.r4b.core" "hl7.fhir.r5.core"}]
108+
(->> (keys (:dependencies package))
109+
(map name)
110+
(filter #(contains? allowed-base-packages %))
111+
first)))
112+
113+
(defn enrich-schema-with-fhir-version [schema version]
114+
(if version
115+
(assoc schema :fhir-version version)
116+
(assoc schema :fhir-version (:package schema))))
117+
109118
(defmethod retrieve :url
110119
[{:keys [source]} {:keys [exit] :as opts}]
111120
(let [extract-link (fn [package] (-> package :href))
@@ -122,7 +131,9 @@
122131
[]))]
123132
(->> fhir-packages
124133
;; TODO using pmap for side effects is questionable
125-
(pmap (fn [package]
126-
(println "Downloading schemas for:" (extract-name package))
127-
(fetch-n-parse (extract-link package) opts)))
134+
(map (fn [package]
135+
(let [base-package-name (get-fhir-version package)
136+
schemas (fetch-n-parse (extract-link package) opts)]
137+
(println "Downloading schemas for:" (extract-name package))
138+
(map #(enrich-schema-with-fhir-version % base-package-name) schemas))))
128139
(flatten))))

test/aidbox_sdk/converter_test.clj

+31-2
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,37 @@
3030
:summary true,
3131
:elements {:referenceRange {:array true, :type "Reference"}}}}}))
3232

33+
(deftest test-resolve-dependencies
34+
(testing "simple case"
35+
(is (= #{"Address"
36+
"Attachment"
37+
"Period"
38+
"CodeableConcept"
39+
"ContactPoint"
40+
"HumanName"
41+
"DomainResource"
42+
"Reference"
43+
"Identifier"
44+
"BackboneElement"}
45+
(-> (sut/resolve-dependencies [(dissoc (fixt/get-data :patient-ir-schema) :deps)])
46+
first
47+
:deps))))
48+
49+
(testing "another package"
50+
(is (= #{"Address"
51+
"Attachment"
52+
"Period"
53+
"CodeableConcept"
54+
"ContactPoint"
55+
"HumanName"
56+
"DomainResource"
57+
"Reference"
58+
"Identifier"
59+
"BackboneElement"}
60+
(-> (sut/resolve-dependencies [(dissoc (fixt/get-data :patient-ir-schema) :deps)])
61+
first
62+
:deps)))))
63+
3364
(deftest test-url->resource-name
3465
(testing "one word"
3566
(is (= "Immunization"
@@ -83,8 +114,6 @@
83114
(fixt/get-data :us-core-vital-signs-fhir-schema)
84115
(fixt/get-data :us-core-bmi-fhir-schema)]))))))
85116

86-
(fixt/get-data :vitalsigns-fhir-schema)
87-
88117
(deftest test-sort-by-base
89118
(match
90119
(sut/sort-by-base
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
{:package "hl7.fhir.r4.core",
2+
:derivation "constraint",
3+
:name "Provenance",
4+
:resource-name "ehrsrle-provenance",
5+
:type "Provenance",
6+
:elements
7+
[{:name "agent",
8+
:base "Provenance",
9+
:array false,
10+
:required false,
11+
:value "string",
12+
:type nil,
13+
:choice-option false}
14+
{:name "policy",
15+
:base "Provenance",
16+
:array false,
17+
:required false,
18+
:value "string",
19+
:type nil,
20+
:choice-option false}
21+
{:name "reason",
22+
:base "Provenance",
23+
:array false,
24+
:required false,
25+
:value "string",
26+
:type nil,
27+
:choice-option false}
28+
{:name "target",
29+
:base "Provenance",
30+
:array false,
31+
:required false,
32+
:value "string",
33+
:type nil,
34+
:choice-option false}
35+
{:name "activity",
36+
:base "Provenance",
37+
:array false,
38+
:required false,
39+
:value "string",
40+
:type nil,
41+
:choice-option false}
42+
{:name "location",
43+
:base "Provenance",
44+
:array false,
45+
:required false,
46+
:value "string",
47+
:type nil,
48+
:choice-option false}
49+
{:name "recorded",
50+
:base "Provenance",
51+
:array false,
52+
:required false,
53+
:value "string",
54+
:type nil,
55+
:choice-option false}
56+
{:name "signature",
57+
:base "Provenance",
58+
:array false,
59+
:required false,
60+
:value "string",
61+
:type nil,
62+
:choice-option false}],
63+
:url "http://hl7.org/fhir/StructureDefinition/ehrsrle-provenance",
64+
:base-resource-name "Provenance",
65+
:backbone-elements [],
66+
:base "http://hl7.org/fhir/StructureDefinition/Provenance",
67+
:deps #{"Meta" "Provenance"}}

test/aidbox_sdk/fixtures/organization_preferred_contact_fhir_schema.edn

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{:package "hl7.fhir.r4.core",
22
:technical-id
33
"hl7.fhir.r4.core/4.0.1/FHIRSchema/http://hl7.org/fhir/StructureDefinition/organization-preferredContact/4.0.1",
4+
:fhir-version "hl7.fhir.r4.core"
45
:derivation "constraint",
56
:fhirVersion nil,
67
:excluded ["extension"],

test/aidbox_sdk/fixtures/organization_preferred_contact_ir_schema.edn

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
:derivation "constraint",
33
:name "Extension",
44
:type "Extension",
5+
:fhir-version "hl7.fhir.r4.core"
56
:resource-name "organization-preferred-Contact"
67
:elements
78
[{:name "url",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
{:package "hl7.fhir.us.core",
2+
:technical-id
3+
"hl7.fhir.us.core/6.1.0/FHIRSchema/http://hl7.org/fhir/us/core/StructureDefinition/us-core-bmi/6.1.0",
4+
:derivation "constraint",
5+
:fhirVersion nil,
6+
:name "us-core-bmi",
7+
:type "Observation",
8+
:resourceType "FHIRSchema",
9+
:elements
10+
{:code
11+
{:type "CodeableConcept",
12+
:pattern {:coding [{:code "39156-5", :system "http://loinc.org"}]},
13+
:mustSupport true},
14+
:valueQuantity
15+
{:max 1,
16+
:min 0,
17+
:elements
18+
{:code {:type "code", :fixed "kg/m2", :mustSupport true},
19+
:unit {:type "string", :mustSupport true},
20+
:value {:type "decimal", :mustSupport true},
21+
:system
22+
{:type "uri", :fixed "http://unitsofmeasure.org", :mustSupport true}},
23+
:required ["value" "unit" "system" "code"],
24+
:mustSupport true}},
25+
:id "us-core-bmi",
26+
:kind "resource",
27+
:url "http://hl7.org/fhir/us/core/StructureDefinition/us-core-bmi",
28+
:packageVersion "6.1.0",
29+
:base "http://hl7.org/fhir/us/core/StructureDefinition/us-core-vital-signs",
30+
:version "6.1.0"}

0 commit comments

Comments
 (0)