@haste-health/codegen 0.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1 @@
1
+ # Codegen
@@ -0,0 +1,4 @@
1
+ export * as metaData from "./meta-data.js";
2
+ export * as operationDefinition from "./operation-definition.js";
3
+ export * as searchParameter from "./sets.js";
4
+ export * as typescript from "./typescript-types.js";
@@ -0,0 +1,5 @@
1
+ export * as metaData from "./meta-data.js";
2
+ export * as operationDefinition from "./operation-definition.js";
3
+ export * as searchParameter from "./sets.js";
4
+ export * as typescript from "./typescript-types.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/generate/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,mBAAmB,MAAM,2BAA2B,CAAC;AACjE,OAAO,KAAK,eAAe,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,UAAU,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,38 @@
1
+ import { uri } from "@haste-health/fhir-types/r4/types";
2
+ import { Data, FHIR_VERSION, Resource } from "@haste-health/fhir-types/versions";
3
+ interface Node {
4
+ _type_: "fp-primitive" | "primitive-type" | "complex-type" | "resource" | "type" | "typechoice" | "content-reference";
5
+ cardinality: "array" | "single";
6
+ base: uri;
7
+ }
8
+ export interface TypeChoiceNode extends Node {
9
+ _type_: "typechoice";
10
+ definition: Data<FHIR_VERSION, "ElementDefinition">;
11
+ fieldsToType: Record<string, uri>;
12
+ }
13
+ export interface ElementNode extends Node {
14
+ _type_: "primitive-type" | "complex-type" | "resource";
15
+ type: uri;
16
+ definition: Data<FHIR_VERSION, "ElementDefinition">;
17
+ properties: Record<string, number>;
18
+ }
19
+ export interface FPPrimitiveNode extends Node {
20
+ _type_: "fp-primitive";
21
+ type: uri;
22
+ }
23
+ export interface TypeNode extends Node {
24
+ _type_: "type";
25
+ type: uri;
26
+ definition: Data<FHIR_VERSION, "ElementDefinition">;
27
+ }
28
+ export interface ContentReferenceNode extends Node {
29
+ _type_: "content-reference";
30
+ definition: Data<FHIR_VERSION, "ElementDefinition">;
31
+ reference: number;
32
+ }
33
+ export type MetaNode = ElementNode | TypeNode | ContentReferenceNode | TypeChoiceNode | FPPrimitiveNode;
34
+ export interface MetaV2Compiled {
35
+ [key: string]: Array<MetaNode>;
36
+ }
37
+ export declare function generateMetaData<Version extends FHIR_VERSION>(sds: Resource<Version, "StructureDefinition">[]): MetaV2Compiled;
38
+ export {};
@@ -0,0 +1,224 @@
1
+ import { traversalBottomUp } from "../sdTraversal.js";
2
+ import { filterSDForTypes } from "../utilities.js";
3
+ function createFPPrimitiveNode(type) {
4
+ return [
5
+ {
6
+ _type_: "fp-primitive",
7
+ type,
8
+ cardinality: "single",
9
+ base: type,
10
+ },
11
+ ];
12
+ }
13
+ const FP_PRIMITIVES_TYPES = [
14
+ "http://hl7.org/fhirpath/System.Boolean",
15
+ "http://hl7.org/fhirpath/System.String",
16
+ "http://hl7.org/fhirpath/System.Date",
17
+ "http://hl7.org/fhirpath/System.DateTime",
18
+ "http://hl7.org/fhirpath/System.Decimal",
19
+ "http://hl7.org/fhirpath/System.Integer",
20
+ "http://hl7.org/fhirpath/System.Time",
21
+ ];
22
+ /**
23
+ *
24
+ * @param type
25
+ * @returns
26
+ */
27
+ function addFPPrimitiveNodes(metadata) {
28
+ return FP_PRIMITIVES_TYPES.reduce((metadata, type) => {
29
+ metadata[type] = createFPPrimitiveNode(type);
30
+ return metadata;
31
+ }, metadata);
32
+ }
33
+ function determineIsTypeChoice(element) {
34
+ return (element.type ?? []).length > 1;
35
+ }
36
+ function combineWithPath(path, type) {
37
+ return `${path}:${type}`;
38
+ }
39
+ // Generate indices around the element path and it's type which correlate to location in the meta.
40
+ function preGenerateIndices(sd) {
41
+ let curIndex = 0;
42
+ // Record
43
+ const indices = {};
44
+ for (let i = 0; i < (sd.snapshot?.element ?? []).length; i++) {
45
+ const element = sd.snapshot?.element[i];
46
+ if (!element)
47
+ throw new Error("No Element");
48
+ indices[element.path] = curIndex++;
49
+ }
50
+ return indices;
51
+ }
52
+ // function to capaitalize a string
53
+ function capitalize(str) {
54
+ return str.charAt(0).toUpperCase() + str.slice(1);
55
+ }
56
+ function getElementField(element, type) {
57
+ const path = element.path;
58
+ const pathSplit = path.split(".");
59
+ const field = pathSplit[pathSplit.length - 1];
60
+ if (type) {
61
+ return field.replace("[x]", capitalize(type));
62
+ }
63
+ return (element.type ?? []).length > 1 ? field.replace("[x]", "") : field;
64
+ }
65
+ function getAllTypeChoice(beginning, element) {
66
+ return Object.keys(element)
67
+ .filter((k) => k.startsWith(beginning))
68
+ .reduce((acc, k) => {
69
+ acc[k] = element[k];
70
+ return acc;
71
+ }, {});
72
+ }
73
+ function simpleElementDefinition(element) {
74
+ return {
75
+ path: element.path,
76
+ min: element.min,
77
+ max: element.max,
78
+ ...getAllTypeChoice("pattern", element),
79
+ ...getAllTypeChoice("minValue", element),
80
+ ...getAllTypeChoice("maxValue", element),
81
+ ...getAllTypeChoice("fixed", element),
82
+ maxLength: element.maxLength,
83
+ type: element.type,
84
+ base: element.base
85
+ ? {
86
+ path: element.base.path,
87
+ max: element.base.max,
88
+ min: element.base.min,
89
+ }
90
+ : undefined,
91
+ binding: element.binding
92
+ ? {
93
+ strength: element.binding.strength,
94
+ valueSet: element.binding.valueSet,
95
+ }
96
+ : undefined,
97
+ };
98
+ }
99
+ function getElementCardinality(element) {
100
+ const cardinality = element.max === "1" ? "single" : "array";
101
+ return cardinality;
102
+ }
103
+ function createContentReferenceNode(sd, element, reference) {
104
+ return {
105
+ _type_: "content-reference",
106
+ definition: simpleElementDefinition(element),
107
+ base: sd.type,
108
+ cardinality: getElementCardinality(element),
109
+ reference,
110
+ };
111
+ }
112
+ function createSingularNode(sd, index, element, children) {
113
+ if (index === 0) {
114
+ if (!["primitive-type", "complex-type", "resource"].includes(sd.kind)) {
115
+ throw new Error("sd must be of type 'primitive-type', 'complex-type' or 'resource'");
116
+ }
117
+ return {
118
+ _type_: sd.kind,
119
+ base: sd.type,
120
+ type: sd.type,
121
+ // Set as singular to ensure that the first element is always singular.
122
+ // Also removing base to ensure singular.
123
+ definition: simpleElementDefinition(element),
124
+ cardinality: "single",
125
+ properties: children.reduce((acc, k) => {
126
+ acc[k.field] = k.index;
127
+ return acc;
128
+ }, {}),
129
+ };
130
+ }
131
+ const type = element.type?.[0];
132
+ if ((element.type ?? []).length > 1) {
133
+ throw new Error("Multiple types are not supported for creating singular node.");
134
+ }
135
+ const cardinality = getElementCardinality(element);
136
+ if (children.length === 0) {
137
+ return {
138
+ _type_: "type",
139
+ base: sd.type,
140
+ type: type?.code,
141
+ definition: simpleElementDefinition(element),
142
+ cardinality,
143
+ };
144
+ }
145
+ return {
146
+ _type_: "complex-type",
147
+ base: sd.type,
148
+ type: type?.code,
149
+ definition: simpleElementDefinition(element),
150
+ properties: children.reduce((acc, k) => {
151
+ acc[k.field] = k.index;
152
+ return acc;
153
+ }, {}),
154
+ cardinality,
155
+ };
156
+ }
157
+ function createTypeChoiceNode(sd, element) {
158
+ return {
159
+ _type_: "typechoice",
160
+ base: sd.type,
161
+ definition: simpleElementDefinition(element),
162
+ cardinality: getElementCardinality(element),
163
+ fieldsToType: (element.type ?? []).reduce((acc, type) => {
164
+ acc[getElementField(element, type.code)] = type.code;
165
+ return acc;
166
+ }, {}),
167
+ };
168
+ }
169
+ function SDToMetaData(sd) {
170
+ // Used to handle content references so know ahead of time where to point.
171
+ const indices = preGenerateIndices(sd);
172
+ const metaInfo = [
173
+ ...new Array(Math.max(...Object.values(indices))),
174
+ ];
175
+ traversalBottomUp(sd, (element, children) => {
176
+ const index = indices[element.path];
177
+ if (element.contentReference) {
178
+ const elementIndex = indices[element.contentReference.substring(1)];
179
+ metaInfo[index] = createContentReferenceNode(sd, element, elementIndex);
180
+ return [
181
+ {
182
+ index,
183
+ field: getElementField(element),
184
+ },
185
+ ];
186
+ }
187
+ if (determineIsTypeChoice(element)) {
188
+ metaInfo[index] = createTypeChoiceNode(sd, element);
189
+ return [
190
+ ...(element.type ?? []).map((type) => {
191
+ const indexKey = combineWithPath(element.path, type.code);
192
+ const index = indices[indexKey];
193
+ return {
194
+ index,
195
+ field: getElementField(element, type.code),
196
+ };
197
+ }),
198
+ {
199
+ index,
200
+ field: getElementField(element),
201
+ },
202
+ ];
203
+ // For Type choices include a typechoice node which points to the types loc.
204
+ }
205
+ else {
206
+ metaInfo[index] = createSingularNode(sd, index, element, children);
207
+ return [
208
+ {
209
+ index,
210
+ field: getElementField(element),
211
+ },
212
+ ];
213
+ }
214
+ });
215
+ return metaInfo;
216
+ }
217
+ export function generateMetaData(sds) {
218
+ const metav2compiled = filterSDForTypes(sds).reduce((acc, sd) => {
219
+ acc[sd.type] = SDToMetaData(sd);
220
+ return acc;
221
+ }, {});
222
+ return addFPPrimitiveNodes(metav2compiled);
223
+ }
224
+ //# sourceMappingURL=meta-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta-data.js","sourceRoot":"","sources":["../../src/generate/meta-data.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAwDnD,SAAS,qBAAqB,CAAC,IAAS;IACtC,OAAO;QACL;YACE,MAAM,EAAE,cAAc;YACtB,IAAI;YACJ,WAAW,EAAE,QAAQ;YACrB,IAAI,EAAE,IAAI;SACX;KACF,CAAC;AACJ,CAAC;AAED,MAAM,mBAAmB,GAAU;IACjC,wCAAwC;IACxC,uCAAuC;IACvC,qCAAqC;IACrC,yCAAyC;IACzC,wCAAwC;IACxC,wCAAwC;IACxC,qCAAqC;CAC7B,CAAC;AAEX;;;;GAIG;AACH,SAAS,mBAAmB,CAAC,QAAwB;IACnD,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE;QACnD,QAAQ,CAAC,IAAI,CAAC,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAC7C,OAAO,QAAQ,CAAC;IAClB,CAAC,EAAE,QAAQ,CAAC,CAAC;AACf,CAAC;AAED,SAAS,qBAAqB,CAAC,OAA0B;IACvD,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AACzC,CAAC;AAKD,SAAS,eAAe,CAAC,IAAiB,EAAE,IAAS;IACnD,OAAO,GAAG,IAAI,IAAI,IAAI,EAAqB,CAAC;AAC9C,CAAC;AAED,kGAAkG;AAClG,SAAS,kBAAkB,CACzB,EAAiD;IAEjD,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,SAAS;IACT,MAAM,OAAO,GAAkD,EAAE,CAAC;IAElE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7D,MAAM,OAAO,GAAG,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;QACxC,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;QAC5C,OAAO,CAAC,OAAO,CAAC,IAAmB,CAAC,GAAG,QAAQ,EAAE,CAAC;IACpD,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,mCAAmC;AACnC,SAAS,UAAU,CAAC,GAAW;IAC7B,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,eAAe,CAAC,OAA0B,EAAE,IAAa;IAChE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC9C,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAC5E,CAAC;AAED,SAAS,gBAAgB,CACvB,SAAiB,EACjB,OAA0B;IAE1B,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;SACxB,MAAM,CAAC,CAAC,CAAC,EAAgC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;SACpE,MAAM,CAAC,CAAC,GAA4B,EAAE,CAAC,EAAE,EAAE;QAC1C,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACpB,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,EAAE,CAAC,CAAC;AACX,CAAC;AAED,SAAS,uBAAuB,CAC9B,OAAgD;IAEhD,OAAO;QACL,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,GAAG,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC;QACvC,GAAG,gBAAgB,CAAC,UAAU,EAAE,OAAO,CAAC;QACxC,GAAG,gBAAgB,CAAC,UAAU,EAAE,OAAO,CAAC;QACxC,GAAG,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC;QACrC,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,IAAI,EAAE,OAAO,CAAC,IAAI;YAChB,CAAC,CAAC;gBACE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI;gBACvB,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG;gBACrB,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG;aACtB;YACH,CAAC,CAAC,SAAS;QACb,OAAO,EAAE,OAAO,CAAC,OAAO;YACtB,CAAC,CAAC;gBACE,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ;gBAClC,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ;aACnC;YACH,CAAC,CAAC,SAAS;KACd,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,OAA0B;IACvD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;IAC7D,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAS,0BAA0B,CACjC,EAA4C,EAC5C,OAA2C,EAC3C,SAAiB;IAEjB,OAAO;QACL,MAAM,EAAE,mBAAmB;QAC3B,UAAU,EAAE,uBAAuB,CAAC,OAAO,CAAC;QAC5C,IAAI,EAAE,EAAE,CAAC,IAAI;QACb,WAAW,EAAE,qBAAqB,CAAC,OAAO,CAAC;QAC3C,SAAS;KACV,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CACzB,EAA4C,EAC5C,KAAa,EACb,OAA2C,EAC3C,QAA4C;IAE5C,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAChB,IAAI,CAAC,CAAC,gBAAgB,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACtE,MAAM,IAAI,KAAK,CACb,mEAAmE,CACpE,CAAC;QACJ,CAAC;QAED,OAAO;YACL,MAAM,EAAE,EAAE,CAAC,IAAsD;YACjE,IAAI,EAAE,EAAE,CAAC,IAAI;YACb,IAAI,EAAE,EAAE,CAAC,IAAI;YACb,uEAAuE;YACvE,yCAAyC;YACzC,UAAU,EAAE,uBAAuB,CAAC,OAAO,CAAC;YAC5C,WAAW,EAAE,QAAQ;YACrB,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,GAA2B,EAAE,CAAC,EAAE,EAAE;gBAC7D,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;gBACvB,OAAO,GAAG,CAAC;YACb,CAAC,EAAE,EAAE,CAAC;SACP,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAsC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAClE,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CACb,8DAA8D,CAC/D,CAAC;IACJ,CAAC;IACD,MAAM,WAAW,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAEnD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO;YACL,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,EAAE,CAAC,IAAI;YACb,IAAI,EAAE,IAAI,EAAE,IAAW;YACvB,UAAU,EAAE,uBAAuB,CAAC,OAAO,CAAC;YAC5C,WAAW;SACZ,CAAC;IACJ,CAAC;IAED,OAAO;QACL,MAAM,EAAE,cAAc;QACtB,IAAI,EAAE,EAAE,CAAC,IAAI;QACb,IAAI,EAAE,IAAI,EAAE,IAAW;QACvB,UAAU,EAAE,uBAAuB,CAAC,OAAO,CAAC;QAC5C,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,GAA2B,EAAE,CAAC,EAAE,EAAE;YAC7D,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;YACvB,OAAO,GAAG,CAAC;QACb,CAAC,EAAE,EAAE,CAAC;QACN,WAAW;KACZ,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAC3B,EAA4C,EAC5C,OAA2C;IAE3C,OAAO;QACL,MAAM,EAAE,YAAY;QACpB,IAAI,EAAE,EAAE,CAAC,IAAI;QACb,UAAU,EAAE,uBAAuB,CAAC,OAAO,CAAC;QAC5C,WAAW,EAAE,qBAAqB,CAAC,OAAO,CAAC;QAC3C,YAAY,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,MAAM,CACvC,CAAC,GAAwB,EAAE,IAAI,EAAE,EAAE;YACjC,GAAG,CAAC,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;YACrD,OAAO,GAAG,CAAC;QACb,CAAC,EACD,EAAE,CACH;KACF,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CACnB,EAA4C;IAE5C,0EAA0E;IAC1E,MAAM,OAAO,GAAG,kBAAkB,CAAC,EAAE,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAoB;QAChC,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;KAClD,CAAC;IAEF,iBAAiB,CACf,EAAE,EACF,CAAC,OAA0B,EAAE,QAAQ,EAAE,EAAE;QACvC,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,IAAmB,CAAC,CAAC;QACnD,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;YAC7B,MAAM,YAAY,GAChB,OAAO,CACL,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAA2B,CAChE,CAAC;YACJ,QAAQ,CAAC,KAAK,CAAC,GAAG,0BAA0B,CAC1C,EAAE,EACF,OAA6C,EAC7C,YAAY,CACb,CAAC;YAEF,OAAO;gBACL;oBACE,KAAK;oBACL,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC;iBAChC;aACF,CAAC;QACJ,CAAC;QAED,IAAI,qBAAqB,CAAC,OAAO,CAAC,EAAE,CAAC;YACnC,QAAQ,CAAC,KAAK,CAAC,GAAG,oBAAoB,CACpC,EAAE,EACF,OAA6C,CAC9C,CAAC;YAEF,OAAO;gBACL,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;oBACnC,MAAM,QAAQ,GAAG,eAAe,CAC9B,OAAO,CAAC,IAAmB,EAC3B,IAAI,CAAC,IAAI,CACV,CAAC;oBAEF,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;oBAChC,OAAO;wBACL,KAAK;wBACL,KAAK,EAAE,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC;qBAC3C,CAAC;gBACJ,CAAC,CAAC;gBACF;oBACE,KAAK;oBACL,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC;iBAChC;aACF,CAAC;YACF,4EAA4E;QAC9E,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,KAAK,CAAC,GAAG,kBAAkB,CAClC,EAAE,EACF,KAAK,EACL,OAA6C,EAC7C,QAAQ,CACT,CAAC;YAEF,OAAO;gBACL;oBACE,KAAK;oBACL,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC;iBAChC;aACF,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,GAA+C;IAE/C,MAAM,cAAc,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,MAAM,CACjD,CAAC,GAAmB,EAAE,EAAE,EAAE,EAAE;QAC1B,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;QAChC,OAAO,GAAG,CAAC;IACb,CAAC,EACD,EAAoB,CACrB,CAAC;IAEF,OAAO,mBAAmB,CAAC,cAAc,CAAC,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { FHIR_VERSION, Resource } from "@haste-health/fhir-types/versions";
2
+ export declare function generateOp(op: Resource<FHIR_VERSION, "OperationDefinition">): string;
3
+ export default function operationGeneration<Version extends FHIR_VERSION>(fhirVersion: Version, operations: Readonly<Array<Resource<Version, "OperationDefinition">>>): Promise<string>;
@@ -0,0 +1,65 @@
1
+ import { resourceTypes } from "@haste-health/fhir-types/r4/sets";
2
+ function generateParameterType(parameters) {
3
+ if (parameters.length === 0)
4
+ return `Record<string, never>`;
5
+ const fields = parameters
6
+ .map((p) => {
7
+ const isArray = p.max !== "1";
8
+ const required = p.min > 0;
9
+ const fieldName = `"${p.name}"${required ? "" : "?"}`;
10
+ const type = p.type === "Any" ? "Resource" : p.type;
11
+ const singularValue = p.type
12
+ ? `fhirTypes.${type}`
13
+ : generateParameterType(p.part || []);
14
+ const value = isArray ? `Array<${singularValue}>` : singularValue;
15
+ return `${fieldName}: ${value}`;
16
+ })
17
+ .join(",\n");
18
+ return `{${fields}}`;
19
+ }
20
+ function capitalize(s) {
21
+ return s.charAt(0).toUpperCase() + s.slice(1);
22
+ }
23
+ function getName(op) {
24
+ if (!op.id)
25
+ throw new Error("Must have id for generating operation");
26
+ return capitalize(op.id
27
+ .split("-")
28
+ .map((s) => capitalize(s))
29
+ .join(""));
30
+ }
31
+ function generateOutput(parameters) {
32
+ if (parameters.length === 1 &&
33
+ parameters[0].name === "return" &&
34
+ (parameters[0].type === "Any" ||
35
+ resourceTypes.has(parameters[0].type || ""))) {
36
+ return `fhirTypes.${parameters[0].type === "Any" ? "Resource" : parameters[0].type}`;
37
+ }
38
+ return generateParameterType(parameters);
39
+ }
40
+ export function generateOp(op) {
41
+ const namespace = getName(op);
42
+ const interfaceName = "IOp";
43
+ const operationName = "Op";
44
+ const inputName = `Input`;
45
+ const outputName = `Output`;
46
+ const inputParameters = (op.parameter || []).filter((op) => op.use === "in");
47
+ const outputParameters = (op.parameter || []).filter((op) => op.use === "out");
48
+ const inputType = `export type ${inputName} = ${generateParameterType(inputParameters)}`;
49
+ const outputType = `export type ${outputName} = ${generateOutput(outputParameters)}`;
50
+ const operationType = `export type ${interfaceName} = IOperation<${inputName}, ${outputName}>`;
51
+ const operationInstance = `export const ${operationName}: ${interfaceName} = new Operation<${inputName}, ${outputName}>(${JSON.stringify(op)} as fhirTypes.OperationDefinition)`;
52
+ return `export namespace ${namespace} {
53
+ ${[inputType, outputType, operationType, operationInstance].join("\n")}}`;
54
+ }
55
+ export default async function operationGeneration(fhirVersion, operations) {
56
+ if (fhirVersion !== "4.0")
57
+ throw new Error("Only support 4.0");
58
+ const code = [
59
+ `import type * as fhirTypes from "@haste-health/fhir-types/r4/types";`,
60
+ `import { Operation, IOperation } from "@haste-health/operation-execution";`,
61
+ ...operations.map((op) => generateOp(op)),
62
+ ].join("\n");
63
+ return code;
64
+ }
65
+ //# sourceMappingURL=operation-definition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operation-definition.js","sourceRoot":"","sources":["../../src/generate/operation-definition.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { FHIR_VERSION, Resource } from "@haste-health/fhir-types/versions";
2
+ export declare function generateSets<Version extends FHIR_VERSION>(version: Version, structureDefinitions: Readonly<Array<Resource<Version, "StructureDefinition">>>): string;
@@ -0,0 +1,20 @@
1
+ function generateTypeSet(name, sds) {
2
+ return `export const ${name}: Set<string> = new Set([${sds
3
+ .map((sd) => `"${sd.id}"`)
4
+ .join(",")}])\n`;
5
+ }
6
+ export function generateSets(version, structureDefinitions) {
7
+ // Ignore templates for now during type generation.
8
+ structureDefinitions = structureDefinitions
9
+ .filter((sd) => sd.kind !== "logical")
10
+ .filter((sd) => sd.derivation !== "constraint");
11
+ const primitiveTypes = structureDefinitions
12
+ .filter((sd) => sd.kind === "primitive-type")
13
+ .filter((sd) => sd.derivation !== "constraint");
14
+ const complexTypes = structureDefinitions
15
+ .filter((sd) => sd.kind === "complex-type")
16
+ .filter((sd) => sd.derivation !== "constraint");
17
+ const resourceTypes = structureDefinitions.filter((sd) => sd.kind === "resource");
18
+ return `${generateTypeSet("resourceTypes", resourceTypes)}\n${generateTypeSet("complexTypes", complexTypes)}\n${generateTypeSet("primitiveTypes", primitiveTypes)}\n`;
19
+ }
20
+ //# sourceMappingURL=sets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sets.js","sourceRoot":"","sources":["../../src/generate/sets.ts"],"names":[],"mappings":"AAEA,SAAS,eAAe,CACtB,IAAY,EACZ,GAAmE;IAEnE,OAAO,gBAAgB,IAAI,6BAA6B,GAAG;SACxD,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC;SACzB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,OAAgB,EAChB,oBAEC;IAED,mDAAmD;IACnD,oBAAoB,GAAG,oBAAoB;SACxC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC;SACrC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,KAAK,YAAY,CAAC,CAAC;IAElD,MAAM,cAAc,GAAG,oBAAoB;SACxC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,gBAAgB,CAAC;SAC5C,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,KAAK,YAAY,CAAC,CAAC;IAElD,MAAM,YAAY,GAAG,oBAAoB;SACtC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,cAAc,CAAC;SAC1C,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,KAAK,YAAY,CAAC,CAAC;IAClD,MAAM,aAAa,GAAG,oBAAoB,CAAC,MAAM,CAC/C,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,UAAU,CAC/B,CAAC;IAEF,OAAO,GAAG,eAAe,CAAC,eAAe,EAAE,aAAa,CAAC,KAAK,eAAe,CAC3E,cAAc,EACd,YAAY,CACb,KAAK,eAAe,CAAC,gBAAgB,EAAE,cAAc,CAAC,IAAI,CAAC;AAC9D,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { uri } from "@haste-health/fhir-types/lib/generated/r4/types";
2
+ import { FHIR_VERSION, Resource } from "@haste-health/fhir-types/versions";
3
+ type CanonicalMap = Record<uri, uri>;
4
+ export declare function generateTypeToCanonicalMap<Version extends FHIR_VERSION>(sds: Resource<Version, "StructureDefinition">[]): CanonicalMap;
5
+ export {};
@@ -0,0 +1,8 @@
1
+ import { filterSDForTypes } from "../utilities.js";
2
+ export function generateTypeToCanonicalMap(sds) {
3
+ return filterSDForTypes(sds).reduce((acc, sd) => {
4
+ acc[sd.type] = sd.url;
5
+ return acc;
6
+ }, {});
7
+ }
8
+ //# sourceMappingURL=type-to-canonical.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-to-canonical.js","sourceRoot":"","sources":["../../src/generate/type-to-canonical.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAInD,MAAM,UAAU,0BAA0B,CACxC,GAA+C;IAE/C,OAAO,gBAAgB,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAiB,EAAE,EAAE,EAAE,EAAE;QAC5D,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC;QACtB,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { FHIR_VERSION, Resource } from "@haste-health/fhir-types/versions";
2
+ export declare const primitiveTypes: Set<string>;
3
+ export declare function generateTypes<Version extends FHIR_VERSION>(fhirVersion: Version, structureDefinitions: Readonly<Array<Resource<Version, "StructureDefinition">>>): string;
@@ -0,0 +1,290 @@
1
+ import { traversalBottomUp } from "../sdTraversal.js";
2
+ export const primitiveTypes = new Set([
3
+ "base64Binary",
4
+ "boolean",
5
+ "canonical",
6
+ "code",
7
+ "date",
8
+ "dateTime",
9
+ "decimal",
10
+ "id",
11
+ "instant",
12
+ "integer",
13
+ "markdown",
14
+ "oid",
15
+ "positiveInt",
16
+ "string",
17
+ "time",
18
+ "unsignedInt",
19
+ "uri",
20
+ "url",
21
+ "uuid",
22
+ "xhtml",
23
+ ]);
24
+ function fhirSystemTypePredicate(type) {
25
+ switch (type) {
26
+ case "http://hl7.org/fhirpath/System.Boolean": {
27
+ return "boolean";
28
+ }
29
+ case "http://hl7.org/fhirpath/System.String": {
30
+ return "string";
31
+ }
32
+ case "http://hl7.org/fhirpath/System.Date": {
33
+ return "string";
34
+ }
35
+ case "http://hl7.org/fhirpath/System.DateTime": {
36
+ return "string";
37
+ }
38
+ case "http://hl7.org/fhirpath/System.Decimal": {
39
+ return "number";
40
+ }
41
+ case "http://hl7.org/fhirpath/System.Integer": {
42
+ return "number";
43
+ }
44
+ case "http://hl7.org/fhirpath/System.Time": {
45
+ return "string";
46
+ }
47
+ }
48
+ }
49
+ // function to capaitalize a string
50
+ function capitalize(str) {
51
+ return str.charAt(0).toUpperCase() + str.slice(1);
52
+ }
53
+ function isRoot(sd, elementDefinition) {
54
+ return elementDefinition.path === sd.id;
55
+ }
56
+ function documentation(element) {
57
+ if (element.short)
58
+ return ` /** \n * ${element.short}\n */\n`;
59
+ return "";
60
+ }
61
+ function getElementField(element, type) {
62
+ const path = element.path;
63
+ const isRequired = element.min && element.min > 0;
64
+ const pathSplit = path.split(".");
65
+ let field = pathSplit[pathSplit.length - 1];
66
+ if (type) {
67
+ field = field.replace("[x]", capitalize(type));
68
+ }
69
+ // Type choice is always optional
70
+ if (!isRequired || type) {
71
+ field = field + "?";
72
+ }
73
+ return `${field}`;
74
+ }
75
+ function primitiveToTypescriptType(primitiveSd) {
76
+ const primitiveValueType = primitiveSd.snapshot?.element.filter((element) => element.path.endsWith(".value"))[0]?.type?.[0]?.code;
77
+ // http://hl7.org/fhir/StructureDefinition/uri
78
+ // Skip over these primitive types as already exist in typescript
79
+ if (primitiveValueType) {
80
+ const primitiveType = `export type ${primitiveSd.id} = ${fhirSystemTypePredicate(primitiveValueType)}`;
81
+ // Avoid compiler issues by ts-ignoring boolean and string
82
+ // which don't allow type aliasing
83
+ if (primitiveSd.id === "boolean" || primitiveSd.id === "string") {
84
+ return `// @ts-ignore\n${primitiveType};`;
85
+ }
86
+ else {
87
+ let extension = "";
88
+ if (primitiveSd.baseDefinition &&
89
+ primitiveSd.baseDefinition !==
90
+ "http://hl7.org/fhir/StructureDefinition/Element") {
91
+ extension = ` & ${primitiveSd.baseDefinition.replace("http://hl7.org/fhir/StructureDefinition/", "")}`;
92
+ }
93
+ // For primitives that aren't string or boolean, add branding to have more type constraints.
94
+ return `${primitiveType} & { _${primitiveSd.id}: "fhir_${primitiveSd.id}"; } ${extension};`;
95
+ }
96
+ }
97
+ else {
98
+ throw new Error("No type found for primitive");
99
+ }
100
+ }
101
+ function isCollection(elementDefinition) {
102
+ switch (elementDefinition.max) {
103
+ case "*":
104
+ return true;
105
+ default:
106
+ if (!elementDefinition.max)
107
+ return false;
108
+ return parseInt(elementDefinition.max) > 1;
109
+ }
110
+ }
111
+ function wrapAsCollection(elementDefinition, typescriptString) {
112
+ if (isCollection(elementDefinition)) {
113
+ return `Array<${typescriptString}>`;
114
+ }
115
+ else {
116
+ return typescriptString;
117
+ }
118
+ }
119
+ function _typeToTypescriptType(type) {
120
+ // .id fields are often typed as http://hl7.org/fhirpath/System.String
121
+ // setting them to fhir primitive id instead
122
+ if (fhirSystemTypePredicate(type) &&
123
+ type !== "http://hl7.org/fhirpath/System.String") {
124
+ throw new Error("System type not supported '${type}'");
125
+ }
126
+ else if (type === "http://hl7.org/fhirpath/System.String") {
127
+ return "id";
128
+ }
129
+ return type;
130
+ }
131
+ function typeToTypescriptType(elementDefinition, type) {
132
+ const typescriptType = _typeToTypescriptType(type);
133
+ return wrapAsCollection(elementDefinition, typescriptType);
134
+ }
135
+ function isNested(element) {
136
+ return (element.type?.[0]?.code === "BackboneElement" ||
137
+ element.type?.[0]?.code === "Element");
138
+ }
139
+ function getInterfaceName(element) {
140
+ if (!element.id)
141
+ throw new Error("Cannot create interface name for '" + element.path + "'");
142
+ return element.id.split(".").map(capitalize).join("");
143
+ }
144
+ /*
145
+ Resolves an elements content Reference
146
+ */
147
+ function contentReference(sd, element) {
148
+ const contentReference = element.contentReference?.split("#")[1];
149
+ const referenceElement = sd.snapshot?.element.filter((element) => element.id === contentReference)[0];
150
+ if (!referenceElement)
151
+ throw new Error("unable to resolve contentreference: '" + element.contentReference + "'");
152
+ let referenceTypescriptType;
153
+ if (isNested(referenceElement)) {
154
+ referenceTypescriptType = getInterfaceName(referenceElement);
155
+ }
156
+ else {
157
+ const type = referenceElement.type?.[0]?.code;
158
+ if (type === undefined) {
159
+ throw new Error("No type found for content reference: '" + referenceElement.id + "'");
160
+ }
161
+ referenceTypescriptType = typeToTypescriptType(referenceElement, type);
162
+ }
163
+ // Handle cardinality on reference type.
164
+ if (element.max !== "1") {
165
+ referenceTypescriptType = `Array<${referenceTypescriptType}>`;
166
+ }
167
+ return [
168
+ `${documentation(element)} ${getElementField(element)}: ${referenceTypescriptType};`,
169
+ ];
170
+ }
171
+ function getPrimitiveExtension(element, type) {
172
+ return `${documentation(element)} _${getElementField({ ...element, min: 0 }, type)}: ${typeToTypescriptType(element, "Element")}`;
173
+ }
174
+ function processLeaf(sd, element) {
175
+ if (element.contentReference) {
176
+ return contentReference(sd, element);
177
+ }
178
+ else if (element.type?.length && element.type?.length > 1) {
179
+ return element.type
180
+ ?.map((type) => {
181
+ const fields = [
182
+ `${documentation(element)} ${getElementField(element, type.code)}: ${typeToTypescriptType(element, type.code)};`,
183
+ ];
184
+ if (primitiveTypes.has(type.code)) {
185
+ fields.push(getPrimitiveExtension(element, type.code));
186
+ }
187
+ return fields;
188
+ })
189
+ .flat();
190
+ }
191
+ const fields = [
192
+ `${documentation(element)} ${getElementField(element)}: ${typeToTypescriptType(element, element.type?.[0]?.code)};`,
193
+ ];
194
+ if (primitiveTypes.has(element.type?.[0]?.code)) {
195
+ fields.push(getPrimitiveExtension(element, element.type?.[0]?.code));
196
+ }
197
+ return fields;
198
+ }
199
+ function processComplexToTypescript(sd, element, children) {
200
+ const interfaceName = getInterfaceName(element);
201
+ // for resources include the resourceType filed
202
+ if (isRoot(sd, element) && sd.kind === "resource") {
203
+ children.unshift(`resourceType: "${sd.id}"`);
204
+ }
205
+ return {
206
+ typescriptInterface: `export interface ${interfaceName} {
207
+ ${children.join("\n")}
208
+ }`,
209
+ field: [
210
+ `${documentation(element)} ${getElementField(element)}: ${wrapAsCollection(element, interfaceName)};`,
211
+ ],
212
+ };
213
+ }
214
+ function resourceOrComplexFhirToTypescript(sd) {
215
+ let typescriptTypes = "";
216
+ traversalBottomUp(sd, (element, children) => {
217
+ if (children.length === 0) {
218
+ return processLeaf(sd, element);
219
+ }
220
+ else {
221
+ const { typescriptInterface, field } = processComplexToTypescript(sd, element, children);
222
+ typescriptTypes = `${typescriptTypes}\n${typescriptInterface}`;
223
+ return field;
224
+ }
225
+ });
226
+ return typescriptTypes;
227
+ }
228
+ function getNonAbstractResourceTypes(sds) {
229
+ return sds.filter((sd) => !sd.abstract);
230
+ }
231
+ // Handle DomainResource and Resource by union joining existing generated types.
232
+ function generateAbstracts({ resourceSDs, complexSDs, }) {
233
+ // Resources
234
+ const abstractResourceTypes = resourceSDs.filter((sd) => sd.abstract);
235
+ const nonAbstractResourceTypes = resourceSDs.filter((sd) => !sd.abstract);
236
+ const ResourceMap = `export type ResourceMap = {\n${nonAbstractResourceTypes
237
+ .map((resource) => {
238
+ return ` ${resource.id}: ${resource.id};`;
239
+ })
240
+ .join("\n")}\n}\n`;
241
+ const ResourceType = `export type ResourceType = keyof ResourceMap`;
242
+ const AResource = `export type AResource<T extends keyof ResourceMap> = ResourceMap[T];`;
243
+ const ConcreteType = `export type ConcreteType = ResourceMap[keyof ResourceMap]`;
244
+ const abstractResourceTypesTypescript = abstractResourceTypes
245
+ .map((abstractResource) => `export type ${abstractResource.id} = ConcreteType`)
246
+ .join("\n");
247
+ // Complex
248
+ const ComplexMap = `type ComplexMap = {\n${complexSDs
249
+ .map((complex) => {
250
+ return ` ${complex.id}: ${complex.id};`;
251
+ })
252
+ .join("\n")}\n}\n`;
253
+ const ComplexTypes = `type ComplexTypes = keyof ComplexMap`;
254
+ const DataMap = `type DataMap = ComplexMap & ResourceMap`;
255
+ const DataType = `export type DataType = keyof DataMap`;
256
+ const AData = `export type AData<T extends DataType> = DataMap[T];`;
257
+ return `${ResourceMap}\n
258
+ ${ResourceType}\n
259
+ ${AResource}\n
260
+ ${ConcreteType}\n
261
+ ${abstractResourceTypesTypescript}\n
262
+ ${ComplexMap}\n
263
+ ${ComplexTypes}\n
264
+ ${DataMap}\n
265
+ ${DataType}\n
266
+ ${AData}`;
267
+ }
268
+ export function generateTypes(fhirVersion, structureDefinitions) {
269
+ const primitiveSDs = structureDefinitions.filter((sd) => sd.kind === "primitive-type" && sd.derivation !== "constraint");
270
+ const complexSDs = structureDefinitions
271
+ .filter((sd) => sd.kind === "complex-type")
272
+ .filter((sd) => sd.derivation !== "constraint");
273
+ const resourceSDs = structureDefinitions
274
+ .filter((sd) => sd.kind === "resource")
275
+ .filter((sd) => sd.derivation !== "constraint");
276
+ const typescriptTypes = primitiveSDs
277
+ .map(primitiveToTypescriptType)
278
+ .filter((type) => type)
279
+ // Generate Complex types
280
+ .concat(complexSDs.map(resourceOrComplexFhirToTypescript))
281
+ // Generate Resources
282
+ .concat(getNonAbstractResourceTypes(resourceSDs)
283
+ .map(resourceOrComplexFhirToTypescript)
284
+ .filter((type) => type))
285
+ // Generate Maps
286
+ .concat(generateAbstracts({ resourceSDs, complexSDs }))
287
+ .join("\n");
288
+ return typescriptTypes;
289
+ }
290
+ //# sourceMappingURL=typescript-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typescript-types.js","sourceRoot":"","sources":["../../src/generate/typescript-types.ts"],"names":[],"mappings":"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"}
package/lib/index.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export * as sdTraversal from "./sdTraversal.js";
2
+ export * as generate from "./generate/index.js";
package/lib/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export * as sdTraversal from "./sdTraversal.js";
2
+ export * as generate from "./generate/index.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,WAAW,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { ElementDefinition } from "@haste-health/fhir-types/r4/types";
2
+ import { FHIR_VERSION, Resource } from "@haste-health/fhir-types/versions";
3
+ type VisitorFunction<T> = (element: ElementDefinition, children: T[], info: {
4
+ curIndex: number;
5
+ }) => T[];
6
+ export declare function eleIndexToChildIndices(elements: Array<ElementDefinition>, index?: number): Array<number>;
7
+ export declare function traversalBottomUp<T>(sd: Resource<FHIR_VERSION, "StructureDefinition">, visitorFunction: VisitorFunction<T>): T[];
8
+ export {};
@@ -0,0 +1,41 @@
1
+ export function eleIndexToChildIndices(elements, index) {
2
+ if (index === undefined) {
3
+ return eleIndexToChildIndices(elements, 0);
4
+ }
5
+ else {
6
+ const parent = elements[index];
7
+ const parentPath = parent.path;
8
+ const depth = (parentPath.match(/\./g) ?? []).length;
9
+ const parentPathEscaped = parentPath.replace(/\./g, "\\."); // Escape periods
10
+ const childRegex = new RegExp("^" + parentPathEscaped + "\\." + "[^\\.]+$");
11
+ let curIndex = index + 1;
12
+ const childrenIndices = [];
13
+ while (curIndex < elements.length &&
14
+ // Conform that the child is a direct child of the parent
15
+ (elements[curIndex]?.path?.match(/\./g) ?? []).length > depth) {
16
+ if (elements[curIndex].path.match(childRegex)) {
17
+ childrenIndices.push(curIndex);
18
+ }
19
+ curIndex++;
20
+ }
21
+ return childrenIndices;
22
+ }
23
+ }
24
+ function traversalBottomUpSdElements(elements, index, visitorFunction) {
25
+ const childIndices = eleIndexToChildIndices(elements, index);
26
+ const childTraversalValues = childIndices
27
+ .map((childIndex) => {
28
+ return traversalBottomUpSdElements(elements, childIndex, visitorFunction);
29
+ })
30
+ .flatMap((x) => x);
31
+ return visitorFunction(elements[index], childTraversalValues, {
32
+ curIndex: index,
33
+ });
34
+ }
35
+ export function traversalBottomUp(sd, visitorFunction) {
36
+ const elements = sd.snapshot?.element;
37
+ if (!elements)
38
+ throw new Error("StructureDefinition has no elements");
39
+ return traversalBottomUpSdElements(elements, 0, visitorFunction);
40
+ }
41
+ //# sourceMappingURL=sdTraversal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdTraversal.js","sourceRoot":"","sources":["../src/sdTraversal.ts"],"names":[],"mappings":"AASA,MAAM,UAAU,sBAAsB,CACpC,QAAkC,EAClC,KAAc;IAEd,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,sBAAsB,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC7C,CAAC;SAAM,CAAC;QACN,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC/B,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC;QAC/B,MAAM,KAAK,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QACrD,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,iBAAiB;QAC7E,MAAM,UAAU,GAAG,IAAI,MAAM,CAAC,GAAG,GAAG,iBAAiB,GAAG,KAAK,GAAG,UAAU,CAAC,CAAC;QAE5E,IAAI,QAAQ,GAAG,KAAK,GAAG,CAAC,CAAC;QACzB,MAAM,eAAe,GAAa,EAAE,CAAC;QACrC,OACE,QAAQ,GAAG,QAAQ,CAAC,MAAM;YAC1B,yDAAyD;YACzD,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,KAAK,EAC7D,CAAC;YACD,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC9C,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACjC,CAAC;YACD,QAAQ,EAAE,CAAC;QACb,CAAC;QACD,OAAO,eAAe,CAAC;IACzB,CAAC;AACH,CAAC;AAED,SAAS,2BAA2B,CAClC,QAAkC,EAClC,KAAa,EACb,eAAmC;IAEnC,MAAM,YAAY,GAAG,sBAAsB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC7D,MAAM,oBAAoB,GAAmC,YAAY;SACtE,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE;QAClB,OAAO,2BAA2B,CAAC,QAAQ,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;IAC5E,CAAC,CAAC;SACD,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACrB,OAAO,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,oBAAoB,EAAE;QAC5D,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,EAAiD,EACjD,eAAmC;IAEnC,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC;IACtC,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACtE,OAAO,2BAA2B,CAAC,QAAQ,EAAE,CAAC,EAAE,eAAe,CAAC,CAAC;AACnE,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { FHIR_VERSION, Resource } from "@haste-health/fhir-types/versions";
2
+ export declare function filterSDForTypes<Version extends FHIR_VERSION>(sds: Resource<Version, "StructureDefinition">[]): Resource<Version, "StructureDefinition">[];
@@ -0,0 +1,8 @@
1
+ export function filterSDForTypes(sds) {
2
+ return (sds
3
+ // Filter out constraints
4
+ .filter((sd) => sd.derivation !== "constraint")
5
+ // Logicals are not concrete types
6
+ .filter((sd) => sd.kind !== "logical"));
7
+ }
8
+ //# sourceMappingURL=utilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utilities.js","sourceRoot":"","sources":["../src/utilities.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,gBAAgB,CAC9B,GAA+C;IAE/C,OAAO,CACL,GAAG;QACD,yBAAyB;SACxB,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,KAAK,YAAY,CAAC;QAC/C,kCAAkC;SACjC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CACzC,CAAC;AACJ,CAAC"}
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@haste-health/codegen",
3
+ "version": "0.12.1",
4
+ "homepage": "https://haste.health",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "https://github.com/HasteHealth/HasteHealth.git"
8
+ },
9
+ "description": "",
10
+ "type": "module",
11
+ "scripts": {
12
+ "build": "tsc",
13
+ "publish": "pnpm build && pnpm npm publish --access public --tolerate-republish"
14
+ },
15
+ "keywords": [],
16
+ "author": "",
17
+ "license": "ISC",
18
+ "devDependencies": {
19
+ "@types/node": "^22.15.17",
20
+ "typescript": "5.9.2"
21
+ },
22
+ "dependencies": {
23
+ "@haste-health/artifacts": "workspace:^",
24
+ "@haste-health/fhir-types": "workspace:^",
25
+ "commander": "^12.1.0"
26
+ },
27
+ "files": [
28
+ "lib/**"
29
+ ],
30
+ "exports": {
31
+ ".": "./lib/index.js",
32
+ "./generate/type-to-canonical": "./lib/generate/type-to-canonical.js",
33
+ "./generate/meta-data": "./lib/generate/meta-data.js",
34
+ "./generate/operation-definition": "./lib/generate/operation-definition.js",
35
+ "./generate/sets": "./lib/generate/sets.js",
36
+ "./generate/typescript-types": "./lib/generate/typescript-types.js",
37
+ "./traversal/structure-definition": "./lib/sdTraversal.js"
38
+ }
39
+ }