@atomic-ehr/codegen 0.0.1-canary.20250822114054.4ca1428 → 0.0.1-canary.20250822150706.c3b8669
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/dist/api/builder.d.ts +3 -3
- package/dist/api/builder.d.ts.map +1 -1
- package/dist/api/builder.js +374 -0
- package/dist/api/generators/base/BaseGenerator.d.ts +4 -4
- package/dist/api/generators/base/BaseGenerator.d.ts.map +1 -1
- package/dist/api/generators/base/BaseGenerator.js +572 -0
- package/dist/api/generators/base/FileManager.d.ts +2 -2
- package/dist/api/generators/base/FileManager.d.ts.map +1 -1
- package/dist/api/generators/base/FileManager.js +204 -0
- package/dist/api/generators/base/PythonTypeMapper.d.ts +2 -2
- package/dist/api/generators/base/PythonTypeMapper.d.ts.map +1 -1
- package/dist/api/generators/base/PythonTypeMapper.js +71 -0
- package/dist/api/generators/base/TemplateEngine.d.ts +1 -1
- package/dist/api/generators/base/TemplateEngine.d.ts.map +1 -1
- package/dist/api/generators/base/TemplateEngine.js +133 -0
- package/dist/api/generators/base/TypeMapper.js +153 -0
- package/dist/api/generators/base/TypeScriptTypeMapper.d.ts +1 -1
- package/dist/api/generators/base/TypeScriptTypeMapper.d.ts.map +1 -1
- package/dist/api/generators/base/TypeScriptTypeMapper.js +232 -0
- package/dist/api/generators/base/builders/DirectoryBuilder.d.ts +4 -4
- package/dist/api/generators/base/builders/DirectoryBuilder.d.ts.map +1 -1
- package/dist/api/generators/base/builders/DirectoryBuilder.js +215 -0
- package/dist/api/generators/base/builders/FileBuilder.d.ts +2 -2
- package/dist/api/generators/base/builders/FileBuilder.d.ts.map +1 -1
- package/dist/api/generators/base/builders/FileBuilder.js +408 -0
- package/dist/api/generators/base/builders/IndexBuilder.d.ts +2 -2
- package/dist/api/generators/base/builders/IndexBuilder.d.ts.map +1 -1
- package/dist/api/generators/base/builders/IndexBuilder.js +290 -0
- package/dist/api/generators/base/enhanced-errors.d.ts +2 -2
- package/dist/api/generators/base/enhanced-errors.d.ts.map +1 -1
- package/dist/api/generators/base/enhanced-errors.js +259 -0
- package/dist/api/generators/base/error-handler.d.ts +1 -1
- package/dist/api/generators/base/error-handler.d.ts.map +1 -1
- package/dist/api/generators/base/error-handler.js +243 -0
- package/dist/api/generators/base/errors.d.ts +2 -2
- package/dist/api/generators/base/errors.d.ts.map +1 -1
- package/dist/api/generators/base/errors.js +694 -0
- package/dist/api/generators/base/index.d.ts +22 -22
- package/dist/api/generators/base/index.d.ts.map +1 -1
- package/dist/api/generators/base/index.js +161 -0
- package/dist/api/generators/base/types.d.ts +2 -2
- package/dist/api/generators/base/types.d.ts.map +1 -1
- package/dist/api/generators/base/types.js +12 -0
- package/dist/api/generators/rest-client.d.ts +2 -2
- package/dist/api/generators/rest-client.d.ts.map +1 -1
- package/dist/api/generators/rest-client.js +847 -0
- package/dist/api/generators/search-parameter-enhancer.d.ts +1 -1
- package/dist/api/generators/search-parameter-enhancer.d.ts.map +1 -1
- package/dist/api/generators/search-parameter-enhancer.js +801 -0
- package/dist/api/generators/types.js +4 -0
- package/dist/api/generators/typescript.d.ts +3 -3
- package/dist/api/generators/typescript.d.ts.map +1 -1
- package/dist/api/generators/typescript.js +537 -0
- package/dist/api/generators/validation-generator.js +632 -0
- package/dist/api/index.d.ts +10 -10
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +51 -0
- package/dist/cli/commands/generate/typescript.d.ts +1 -1
- package/dist/cli/commands/generate/typescript.d.ts.map +1 -1
- package/dist/cli/commands/generate/typescript.js +52 -0
- package/dist/cli/commands/generate.d.ts +5 -12
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +158 -0
- package/dist/cli/commands/index.d.ts +2 -1
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/commands/index.js +100 -0
- package/dist/cli/commands/typeschema/generate.js +130 -0
- package/dist/cli/commands/typeschema.js +48 -0
- package/dist/cli/index.js +12 -8664
- package/dist/cli/utils/log.d.ts +2 -2
- package/dist/cli/utils/log.d.ts.map +1 -1
- package/dist/cli/utils/log.js +23 -0
- package/dist/cli/utils/prompts.js +224 -0
- package/dist/cli/utils/spinner.js +270 -0
- package/dist/config.js +703 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +84 -40
- package/dist/logger.js +290 -0
- package/dist/typeschema/cache.d.ts +2 -2
- package/dist/typeschema/cache.d.ts.map +1 -1
- package/dist/typeschema/cache.js +285 -0
- package/dist/typeschema/core/binding.d.ts +1 -1
- package/dist/typeschema/core/binding.d.ts.map +1 -1
- package/dist/typeschema/core/binding.js +187 -0
- package/dist/typeschema/core/field-builder.d.ts +1 -1
- package/dist/typeschema/core/field-builder.d.ts.map +1 -1
- package/dist/typeschema/core/field-builder.js +259 -0
- package/dist/typeschema/core/identifier.js +117 -0
- package/dist/typeschema/core/nested-types.d.ts +1 -1
- package/dist/typeschema/core/nested-types.d.ts.map +1 -1
- package/dist/typeschema/core/nested-types.js +111 -0
- package/dist/typeschema/core/transformer.d.ts +2 -2
- package/dist/typeschema/core/transformer.d.ts.map +1 -1
- package/dist/typeschema/core/transformer.js +345 -0
- package/dist/typeschema/generator.d.ts +3 -3
- package/dist/typeschema/generator.d.ts.map +1 -1
- package/dist/typeschema/generator.js +352 -0
- package/dist/typeschema/index.d.ts +14 -14
- package/dist/typeschema/index.d.ts.map +1 -1
- package/dist/typeschema/index.js +92 -0
- package/dist/typeschema/parser.d.ts +2 -2
- package/dist/typeschema/parser.d.ts.map +1 -1
- package/dist/typeschema/parser.js +310 -0
- package/dist/typeschema/profile/processor.d.ts +1 -1
- package/dist/typeschema/profile/processor.d.ts.map +1 -1
- package/dist/typeschema/profile/processor.js +268 -0
- package/dist/typeschema/schema.js +456 -0
- package/dist/typeschema/type-schema.types.js +39 -0
- package/dist/typeschema/types.js +4 -0
- package/dist/typeschema/utils.d.ts +1 -1
- package/dist/typeschema/utils.d.ts.map +1 -1
- package/dist/typeschema/utils.js +13 -0
- package/dist/typeschema/value-set/processor.d.ts +1 -1
- package/dist/typeschema/value-set/processor.d.ts.map +1 -1
- package/dist/typeschema/value-set/processor.js +168 -0
- package/dist/utils/codegen-logger.js +204 -0
- package/dist/utils.js +42 -0
- package/package.json +15 -4
- package/dist/index-fgcebdva.js +0 -8515
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeSchema Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates TypeSchema documents from FHIR packages using fhrischema.
|
|
5
|
+
* Provides high-level API for converting FHIR Structure Definitions to TypeSchema format.
|
|
6
|
+
*/
|
|
7
|
+
import { CanonicalManager } from "@atomic-ehr/fhir-canonical-manager";
|
|
8
|
+
import { translate, } from "@atomic-ehr/fhirschema";
|
|
9
|
+
import { createLogger } from "../utils/codegen-logger.js";
|
|
10
|
+
import { TypeSchemaCache } from "./cache.js";
|
|
11
|
+
import { transformFHIRSchema, transformFHIRSchemas, } from "./core/transformer.js";
|
|
12
|
+
/**
|
|
13
|
+
* TypeSchema Generator class
|
|
14
|
+
*
|
|
15
|
+
* Main class for generating TypeSchema documents from FHIR packages.
|
|
16
|
+
* Leverages fhrischema for FHIR parsing and canonical manager for dependency resolution.
|
|
17
|
+
*/
|
|
18
|
+
export class TypeSchemaGenerator {
|
|
19
|
+
manager;
|
|
20
|
+
options;
|
|
21
|
+
cache = null;
|
|
22
|
+
cacheConfig;
|
|
23
|
+
logger;
|
|
24
|
+
constructor(options = {}, cacheConfig) {
|
|
25
|
+
this.options = {
|
|
26
|
+
resourceTypes: [],
|
|
27
|
+
maxDepth: 10,
|
|
28
|
+
verbose: false,
|
|
29
|
+
...options,
|
|
30
|
+
};
|
|
31
|
+
this.manager = CanonicalManager({ packages: [], workingDir: "tmp/fhir" });
|
|
32
|
+
this.cacheConfig = cacheConfig;
|
|
33
|
+
this.logger =
|
|
34
|
+
options.logger ||
|
|
35
|
+
createLogger({
|
|
36
|
+
verbose: this.options.verbose,
|
|
37
|
+
prefix: "TypeSchema",
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Initialize the cache if configured
|
|
42
|
+
*/
|
|
43
|
+
async initializeCache() {
|
|
44
|
+
if (this.cacheConfig && !this.cache) {
|
|
45
|
+
this.cache = new TypeSchemaCache(this.cacheConfig);
|
|
46
|
+
await this.cache.initialize();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Generate TypeSchema from a FHIR package name
|
|
51
|
+
*/
|
|
52
|
+
async generateFromPackage(packageName, packageVersion) {
|
|
53
|
+
await this.initializeCache();
|
|
54
|
+
const forceRegenerate = this.cacheConfig?.forceRegenerate ?? false;
|
|
55
|
+
if (this.cache && !forceRegenerate) {
|
|
56
|
+
const cachedSchemas = this.cache.getByPackage(packageName);
|
|
57
|
+
if (cachedSchemas.length > 0) {
|
|
58
|
+
this.logger.info(`Using cached TypeSchemas for package: ${packageName} (${cachedSchemas.length} schemas)`);
|
|
59
|
+
return cachedSchemas;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
this.logger.step(`Loading FHIR package: ${packageName}${packageVersion ? `@${packageVersion}` : ""}`);
|
|
63
|
+
this.manager = CanonicalManager({
|
|
64
|
+
packages: [`${packageName}${packageVersion ? `@${packageVersion}` : ""}`],
|
|
65
|
+
workingDir: "tmp/fhir",
|
|
66
|
+
});
|
|
67
|
+
await this.manager.init();
|
|
68
|
+
const allResources = await this.manager.search({});
|
|
69
|
+
const structureDefinitions = allResources.filter((resource) => resource.resourceType === "StructureDefinition");
|
|
70
|
+
const valueSets = allResources.filter((resource) => resource.resourceType === "ValueSet");
|
|
71
|
+
this.logger.info(`Found ${structureDefinitions.length} StructureDefinitions and ${valueSets.length} ValueSets in package`);
|
|
72
|
+
this.logger.progress(`Converting ${structureDefinitions.length} StructureDefinitions to FHIRSchemas`);
|
|
73
|
+
const filteredStructureDefinitions = this.applyStructureDefinitionTreeshaking(structureDefinitions);
|
|
74
|
+
const fhirSchemas = [];
|
|
75
|
+
let convertedCount = 0;
|
|
76
|
+
let failedCount = 0;
|
|
77
|
+
for (const sd of filteredStructureDefinitions) {
|
|
78
|
+
try {
|
|
79
|
+
const fhirSchema = translate(sd);
|
|
80
|
+
fhirSchemas.push(fhirSchema);
|
|
81
|
+
convertedCount++;
|
|
82
|
+
this.logger.debug(`Converted StructureDefinition: ${sd.name || sd.id} (${sd.resourceType})`);
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
failedCount++;
|
|
86
|
+
this.logger.warn(`Failed to convert StructureDefinition ${sd.name || sd.id}: ${error instanceof Error ? error.message : String(error)}`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
this.logger.success(`Schema conversion completed: ${convertedCount}/${filteredStructureDefinitions.length} successful, ${failedCount} failed`);
|
|
90
|
+
if (valueSets.length > 0) {
|
|
91
|
+
this.logger.debug(`${valueSets.length} ValueSets available for enum extraction`);
|
|
92
|
+
}
|
|
93
|
+
const packageInfo = {
|
|
94
|
+
name: packageName,
|
|
95
|
+
version: packageVersion || "latest",
|
|
96
|
+
};
|
|
97
|
+
const schemas = await this.generateFromSchemas(fhirSchemas, packageInfo);
|
|
98
|
+
if (this.cache && schemas.length > 0) {
|
|
99
|
+
this.logger.info(`Caching ${schemas.length} generated schemas for package: ${packageName}`);
|
|
100
|
+
for (const schema of schemas) {
|
|
101
|
+
await this.cache.set(schema);
|
|
102
|
+
}
|
|
103
|
+
this.logger.success(`Cached ${schemas.length} TypeSchemas for package: ${packageName}`);
|
|
104
|
+
}
|
|
105
|
+
return schemas;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Generate TypeSchema from individual FHIR schema
|
|
109
|
+
*/
|
|
110
|
+
async generateFromSchema(fhirSchema, packageInfo) {
|
|
111
|
+
this.logger.info("Transforming FHIR schema to TypeSchema");
|
|
112
|
+
return transformFHIRSchema(fhirSchema, this.manager, packageInfo);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Generate TypeSchema from multiple FHIR schemas with FHIR-specific enhancements
|
|
116
|
+
*/
|
|
117
|
+
async generateFromSchemas(fhirSchemas, packageInfo) {
|
|
118
|
+
this.logger.info(`Transforming ${fhirSchemas.length} FHIR schemas to TypeSchema`);
|
|
119
|
+
const baseSchemas = await transformFHIRSchemas(fhirSchemas, this.manager, packageInfo);
|
|
120
|
+
const results = [];
|
|
121
|
+
const groupedSchemas = this.groupTypeSchemas(baseSchemas);
|
|
122
|
+
results.push(...groupedSchemas.resources);
|
|
123
|
+
results.push(...groupedSchemas.complexTypes);
|
|
124
|
+
results.push(...groupedSchemas.primitives);
|
|
125
|
+
if (groupedSchemas.profiles.length > 0) {
|
|
126
|
+
this.logger.info(`Enhancing ${groupedSchemas.profiles.length} profiles`);
|
|
127
|
+
const profileResults = await this.enhanceProfiles(groupedSchemas.profiles);
|
|
128
|
+
results.push(...profileResults);
|
|
129
|
+
}
|
|
130
|
+
if (groupedSchemas.extensions.length > 0) {
|
|
131
|
+
this.logger.info(`Enhancing ${groupedSchemas.extensions.length} extensions`);
|
|
132
|
+
const extensionResults = await this.enhanceExtensions(groupedSchemas.extensions);
|
|
133
|
+
results.push(...extensionResults);
|
|
134
|
+
}
|
|
135
|
+
if (groupedSchemas.valueSets.length > 0) {
|
|
136
|
+
this.logger.info(`Enhancing ${groupedSchemas.valueSets.length} value sets`);
|
|
137
|
+
const valueSetResults = await this.enhanceValueSets(groupedSchemas.valueSets);
|
|
138
|
+
results.push(...valueSetResults);
|
|
139
|
+
}
|
|
140
|
+
if (groupedSchemas.codeSystems.length > 0) {
|
|
141
|
+
this.logger.info(`Enhancing ${groupedSchemas.codeSystems.length} code systems`);
|
|
142
|
+
const codeSystemResults = await this.enhanceCodeSystems(groupedSchemas.codeSystems);
|
|
143
|
+
results.push(...codeSystemResults);
|
|
144
|
+
}
|
|
145
|
+
this.logger.success(`Generated ${results.length} enhanced FHIR type schemas: ${groupedSchemas.resources.length} resources, ${groupedSchemas.complexTypes.length} complex types, ${groupedSchemas.primitives.length} primitives`);
|
|
146
|
+
return results;
|
|
147
|
+
}
|
|
148
|
+
groupTypeSchemas(schemas) {
|
|
149
|
+
const groups = {
|
|
150
|
+
resources: [],
|
|
151
|
+
complexTypes: [],
|
|
152
|
+
primitives: [],
|
|
153
|
+
profiles: [],
|
|
154
|
+
extensions: [],
|
|
155
|
+
valueSets: [],
|
|
156
|
+
codeSystems: [],
|
|
157
|
+
};
|
|
158
|
+
for (const schema of schemas) {
|
|
159
|
+
switch (schema.identifier.kind) {
|
|
160
|
+
case "resource":
|
|
161
|
+
groups.resources.push(schema);
|
|
162
|
+
break;
|
|
163
|
+
case "complex-type":
|
|
164
|
+
groups.complexTypes.push(schema);
|
|
165
|
+
break;
|
|
166
|
+
case "primitive-type":
|
|
167
|
+
groups.primitives.push(schema);
|
|
168
|
+
break;
|
|
169
|
+
case "binding":
|
|
170
|
+
if ("metadata" in schema && schema.metadata?.isExtension) {
|
|
171
|
+
groups.extensions.push(schema);
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
groups.complexTypes.push(schema);
|
|
175
|
+
}
|
|
176
|
+
break;
|
|
177
|
+
case "value-set":
|
|
178
|
+
groups.valueSets.push(schema);
|
|
179
|
+
break;
|
|
180
|
+
default:
|
|
181
|
+
if ("metadata" in schema && schema.metadata?.isCodeSystem) {
|
|
182
|
+
groups.codeSystems.push(schema);
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
groups.complexTypes.push(schema);
|
|
186
|
+
}
|
|
187
|
+
break;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return groups;
|
|
191
|
+
}
|
|
192
|
+
async enhanceProfiles(schemas) {
|
|
193
|
+
return schemas;
|
|
194
|
+
}
|
|
195
|
+
async enhanceExtensions(schemas) {
|
|
196
|
+
return schemas;
|
|
197
|
+
}
|
|
198
|
+
async enhanceValueSets(schemas) {
|
|
199
|
+
return schemas;
|
|
200
|
+
}
|
|
201
|
+
async enhanceCodeSystems(schemas) {
|
|
202
|
+
return schemas;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Apply treeshaking to StructureDefinitions before FHIR schema transformation
|
|
206
|
+
* This is more efficient and includes smart reference handling
|
|
207
|
+
*/
|
|
208
|
+
applyStructureDefinitionTreeshaking(structureDefinitions) {
|
|
209
|
+
const treeshakeList = this.options.treeshake;
|
|
210
|
+
if (!treeshakeList || treeshakeList.length === 0) {
|
|
211
|
+
return structureDefinitions;
|
|
212
|
+
}
|
|
213
|
+
this.logger.info(`Applying treeshaking filter for ResourceTypes: ${treeshakeList.join(", ")}`);
|
|
214
|
+
const allStructureDefinitions = new Map();
|
|
215
|
+
const realDependencies = new Map();
|
|
216
|
+
const referenceTargets = new Map();
|
|
217
|
+
for (const sd of structureDefinitions) {
|
|
218
|
+
const name = sd.name || sd.id;
|
|
219
|
+
if (name) {
|
|
220
|
+
allStructureDefinitions.set(name, sd);
|
|
221
|
+
realDependencies.set(name, new Set());
|
|
222
|
+
referenceTargets.set(name, new Set());
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
for (const sd of structureDefinitions) {
|
|
226
|
+
const name = sd.name || sd.id;
|
|
227
|
+
if (!name)
|
|
228
|
+
continue;
|
|
229
|
+
const { realDeps, refTargets } = this.extractStructureDefinitionDependenciesWithReferences(sd);
|
|
230
|
+
realDependencies.set(name, new Set(realDeps));
|
|
231
|
+
referenceTargets.set(name, new Set(refTargets));
|
|
232
|
+
}
|
|
233
|
+
const structureDefinitionsToKeep = new Set();
|
|
234
|
+
for (const resourceType of treeshakeList) {
|
|
235
|
+
if (allStructureDefinitions.has(resourceType)) {
|
|
236
|
+
structureDefinitionsToKeep.add(resourceType);
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
this.logger.warn(`ResourceType '${resourceType}' not found in structure definitions`);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
const addRealDependenciesRecursively = (name, visited = new Set()) => {
|
|
243
|
+
if (visited.has(name) || !realDependencies.has(name)) {
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
visited.add(name);
|
|
247
|
+
const deps = realDependencies.get(name) || new Set();
|
|
248
|
+
for (const dep of Array.from(deps)) {
|
|
249
|
+
if (allStructureDefinitions.has(dep)) {
|
|
250
|
+
structureDefinitionsToKeep.add(dep);
|
|
251
|
+
addRealDependenciesRecursively(dep, visited);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
};
|
|
255
|
+
for (const resourceType of Array.from(structureDefinitionsToKeep)) {
|
|
256
|
+
addRealDependenciesRecursively(resourceType);
|
|
257
|
+
}
|
|
258
|
+
const filteredStructureDefinitions = structureDefinitions.filter((sd) => {
|
|
259
|
+
const name = sd.name || sd.id;
|
|
260
|
+
return name && structureDefinitionsToKeep.has(name);
|
|
261
|
+
});
|
|
262
|
+
const excludedReferenceTargets = new Set();
|
|
263
|
+
for (const sd of structureDefinitions) {
|
|
264
|
+
const name = sd.name || sd.id;
|
|
265
|
+
if (name && !structureDefinitionsToKeep.has(name)) {
|
|
266
|
+
const isOnlyReferenceTarget = Array.from(referenceTargets.values()).some((targets) => targets.has(name));
|
|
267
|
+
if (isOnlyReferenceTarget) {
|
|
268
|
+
excludedReferenceTargets.add(name);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
if (excludedReferenceTargets.size > 0) {
|
|
273
|
+
this.logger.info(`Excluded reference-only targets: ${Array.from(excludedReferenceTargets).join(", ")}`);
|
|
274
|
+
}
|
|
275
|
+
this.logger.success(`Treeshaking completed: kept ${filteredStructureDefinitions.length}/${structureDefinitions.length} structure definitions`);
|
|
276
|
+
return filteredStructureDefinitions;
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Extract dependencies from StructureDefinition with smart reference handling
|
|
280
|
+
* Returns both real dependencies and reference targets separately
|
|
281
|
+
*/
|
|
282
|
+
extractStructureDefinitionDependenciesWithReferences(sd) {
|
|
283
|
+
const realDeps = new Set();
|
|
284
|
+
const refTargets = new Set();
|
|
285
|
+
if (sd.baseDefinition) {
|
|
286
|
+
const baseName = this.extractResourceNameFromUrl(sd.baseDefinition);
|
|
287
|
+
if (baseName) {
|
|
288
|
+
realDeps.add(baseName);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
if (sd.snapshot?.element || sd.differential?.element) {
|
|
292
|
+
const elements = sd.snapshot?.element || sd.differential?.element;
|
|
293
|
+
for (const element of elements) {
|
|
294
|
+
if (element.type) {
|
|
295
|
+
for (const type of element.type) {
|
|
296
|
+
if (type.code) {
|
|
297
|
+
realDeps.add(type.code);
|
|
298
|
+
if (type.code === "Reference" && type.targetProfile) {
|
|
299
|
+
for (const targetProfile of type.targetProfile) {
|
|
300
|
+
const targetName = this.extractResourceNameFromUrl(targetProfile);
|
|
301
|
+
if (targetName) {
|
|
302
|
+
refTargets.add(targetName);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
if (type.profile) {
|
|
308
|
+
for (const profile of type.profile) {
|
|
309
|
+
const profileName = this.extractResourceNameFromUrl(profile);
|
|
310
|
+
if (profileName) {
|
|
311
|
+
realDeps.add(profileName);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
return {
|
|
320
|
+
realDeps: Array.from(realDeps),
|
|
321
|
+
refTargets: Array.from(refTargets),
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Extract resource name from FHIR URL
|
|
326
|
+
*/
|
|
327
|
+
extractResourceNameFromUrl(url) {
|
|
328
|
+
const match = url.match(/\/([^/]+)$/);
|
|
329
|
+
return match ? (match[1] ?? null) : null;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Convenience function to generate TypeSchema from a package
|
|
334
|
+
*/
|
|
335
|
+
export async function generateTypeSchemaFromPackage(packageName, options = {}) {
|
|
336
|
+
const generator = new TypeSchemaGenerator(options);
|
|
337
|
+
return await generator.generateFromPackage(packageName);
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Convenience function to generate TypeSchema from FHIR schemas
|
|
341
|
+
*/
|
|
342
|
+
export async function generateTypeSchemaFromSchemas(fhirSchemas, packageInfo, options = {}) {
|
|
343
|
+
const generator = new TypeSchemaGenerator(options);
|
|
344
|
+
return await generator.generateFromSchemas(fhirSchemas, packageInfo);
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Convenience function to generate TypeSchema from a single FHIR schema
|
|
348
|
+
*/
|
|
349
|
+
export async function generateTypeSchemaFromSchema(fhirSchema, packageInfo, options = {}) {
|
|
350
|
+
const generator = new TypeSchemaGenerator(options);
|
|
351
|
+
return await generator.generateFromSchema(fhirSchema, packageInfo);
|
|
352
|
+
}
|
|
@@ -9,22 +9,22 @@
|
|
|
9
9
|
* - Reading TypeSchema documents
|
|
10
10
|
* - Validating TypeSchema documents
|
|
11
11
|
*/
|
|
12
|
-
import type { TypeSchema } from "./type-schema.types";
|
|
13
|
-
import type { TypeschemaParserOptions } from "./types";
|
|
12
|
+
import type { TypeSchema } from "./type-schema.types.js";
|
|
13
|
+
import type { TypeschemaParserOptions } from "./types.js";
|
|
14
14
|
export { CanonicalManager } from "@atomic-ehr/fhir-canonical-manager";
|
|
15
15
|
export type { FHIRSchema, FHIRSchemaElement } from "@atomic-ehr/fhirschema";
|
|
16
|
-
export { cacheSchema, clearGlobalCache, getCachedSchema, getGlobalCache, initializeGlobalCache, isCached, TypeSchemaCache, } from "./cache";
|
|
17
|
-
export { buildEnum, collectBindingSchemas, extractValueSetConcepts, generateBindingSchema, } from "./core/binding";
|
|
18
|
-
export { buildField, buildNestedField, getElementHierarchy, isExcluded, isNestedElement, isRequired, mergeElementHierarchy, } from "./core/field-builder";
|
|
19
|
-
export { buildBindingIdentifier, buildNestedIdentifier, buildSchemaIdentifier, buildValueSetIdentifier, dropVersionFromUrl, } from "./core/identifier";
|
|
20
|
-
export { buildNestedTypes, collectNestedElements, extractNestedDependencies, } from "./core/nested-types";
|
|
21
|
-
export { transformFHIRSchema, transformFHIRSchemas, } from "./core/transformer";
|
|
22
|
-
export { generateTypeSchemaFromPackage, generateTypeSchemaFromSchema, generateTypeSchemaFromSchemas, TypeSchemaGenerator, } from "./generator";
|
|
23
|
-
export { parseTypeSchemaFromFile, parseTypeSchemaFromFiles, parseTypeSchemaFromString, TypeSchemaParser, } from "./parser";
|
|
24
|
-
export * from "./type-schema.types";
|
|
25
|
-
export type { PackageInfo, TypeschemaGeneratorOptions, TypeschemaParserOptions, } from "./types";
|
|
26
|
-
export { isTypeSchemaBinding, isTypeSchemaForResourceComplexTypeLogical, isTypeSchemaValueSet, } from "./utils";
|
|
27
|
-
export { transformValueSet } from "./value-set/processor";
|
|
16
|
+
export { cacheSchema, clearGlobalCache, getCachedSchema, getGlobalCache, initializeGlobalCache, isCached, TypeSchemaCache, } from "./cache.js";
|
|
17
|
+
export { buildEnum, collectBindingSchemas, extractValueSetConcepts, generateBindingSchema, } from "./core/binding.js";
|
|
18
|
+
export { buildField, buildNestedField, getElementHierarchy, isExcluded, isNestedElement, isRequired, mergeElementHierarchy, } from "./core/field-builder.js";
|
|
19
|
+
export { buildBindingIdentifier, buildNestedIdentifier, buildSchemaIdentifier, buildValueSetIdentifier, dropVersionFromUrl, } from "./core/identifier.js";
|
|
20
|
+
export { buildNestedTypes, collectNestedElements, extractNestedDependencies, } from "./core/nested-types.js";
|
|
21
|
+
export { transformFHIRSchema, transformFHIRSchemas, } from "./core/transformer.js";
|
|
22
|
+
export { generateTypeSchemaFromPackage, generateTypeSchemaFromSchema, generateTypeSchemaFromSchemas, TypeSchemaGenerator, } from "./generator.js";
|
|
23
|
+
export { parseTypeSchemaFromFile, parseTypeSchemaFromFiles, parseTypeSchemaFromString, TypeSchemaParser, } from "./parser.js";
|
|
24
|
+
export * from "./type-schema.types.js";
|
|
25
|
+
export type { PackageInfo, TypeschemaGeneratorOptions, TypeschemaParserOptions, } from "./types.js";
|
|
26
|
+
export { isTypeSchemaBinding, isTypeSchemaForResourceComplexTypeLogical, isTypeSchemaValueSet, } from "./utils.js";
|
|
27
|
+
export { transformValueSet } from "./value-set/processor.js";
|
|
28
28
|
/**
|
|
29
29
|
* TypeSchema Core API class
|
|
30
30
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/typeschema/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/typeschema/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAG1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAG5E,OAAO,EACN,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,qBAAqB,EACrB,QAAQ,EACR,eAAe,GACf,MAAM,YAAY,CAAC;AAGpB,OAAO,EACN,SAAS,EACT,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,GACrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACN,UAAU,EACV,gBAAgB,EAChB,mBAAmB,EACnB,UAAU,EACV,eAAe,EACf,UAAU,EACV,qBAAqB,GACrB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACN,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,EACrB,uBAAuB,EACvB,kBAAkB,GAClB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACN,gBAAgB,EAChB,qBAAqB,EACrB,yBAAyB,GACzB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACN,mBAAmB,EACnB,oBAAoB,GACpB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACN,6BAA6B,EAC7B,4BAA4B,EAC5B,6BAA6B,EAC7B,mBAAmB,GACnB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACN,uBAAuB,EACvB,wBAAwB,EACxB,yBAAyB,EACzB,gBAAgB,GAChB,MAAM,aAAa,CAAC;AAMrB,cAAc,wBAAwB,CAAC;AAEvC,YAAY,EACX,WAAW,EACX,0BAA0B,EAC1B,uBAAuB,GACvB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACN,mBAAmB,EACnB,yCAAyC,EACzC,oBAAoB,GACpB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D;;;;;;GAMG;AACH,qBAAa,aAAa;IACzB,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,KAAK,CAAkB;gBAG9B,OAAO,GAAE;QACR,SAAS,CAAC,EAAE,GAAG,CAAC;QAChB,MAAM,CAAC,EAAE,uBAAuB,CAAC;QACjC,SAAS,CAAC,EAAE;YAAE,MAAM,CAAC,EAAE,OAAO,CAAA;SAAE,CAAC;KAC5B;IAOP;;OAEG;IACG,mBAAmB,CACxB,WAAW,EAAE,MAAM,EACnB,cAAc,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,UAAU,EAAE,CAAC;IAYxB;;OAEG;IACG,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;CAQjE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAClC,OAAO,CAAC,EAAE,qBAAqB,CAAC,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC,GACtD,aAAa,CAEf;AAED;;GAEG;AACH,wBAAsB,iCAAiC,CACtD,WAAW,EAAE,MAAM,EACnB,cAAc,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,UAAU,EAAE,CAAC,CAGvB;AAED;;GAEG;AACH,wBAAsB,4BAA4B,CACjD,UAAU,EAAE,MAAM,EAAE,GAClB,OAAO,CAAC,UAAU,EAAE,CAAC,CAGvB"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeSchema Core Module
|
|
3
|
+
*
|
|
4
|
+
* Main entry point for the TypeSchema library providing core functions
|
|
5
|
+
* for FHIR-to-TypeSchema generation, parsing, and validation.
|
|
6
|
+
*
|
|
7
|
+
* This module focuses on:
|
|
8
|
+
* - Converting FHIR to TypeSchema format
|
|
9
|
+
* - Reading TypeSchema documents
|
|
10
|
+
* - Validating TypeSchema documents
|
|
11
|
+
*/
|
|
12
|
+
import { TypeSchemaCache } from "./cache.js";
|
|
13
|
+
import { TypeSchemaGenerator } from "./generator.js";
|
|
14
|
+
import { TypeSchemaParser } from "./parser.js";
|
|
15
|
+
// Re-export core dependencies
|
|
16
|
+
export { CanonicalManager } from "@atomic-ehr/fhir-canonical-manager";
|
|
17
|
+
// Export cache functionality
|
|
18
|
+
export { cacheSchema, clearGlobalCache, getCachedSchema, getGlobalCache, initializeGlobalCache, isCached, TypeSchemaCache, } from "./cache.js";
|
|
19
|
+
// Re-export utility functions for FHIR processing
|
|
20
|
+
export { buildEnum, collectBindingSchemas, extractValueSetConcepts, generateBindingSchema, } from "./core/binding.js";
|
|
21
|
+
export { buildField, buildNestedField, getElementHierarchy, isExcluded, isNestedElement, isRequired, mergeElementHierarchy, } from "./core/field-builder.js";
|
|
22
|
+
export { buildBindingIdentifier, buildNestedIdentifier, buildSchemaIdentifier, buildValueSetIdentifier, dropVersionFromUrl, } from "./core/identifier.js";
|
|
23
|
+
export { buildNestedTypes, collectNestedElements, extractNestedDependencies, } from "./core/nested-types.js";
|
|
24
|
+
// Re-export FHIR transformation utilities
|
|
25
|
+
export { transformFHIRSchema, transformFHIRSchemas, } from "./core/transformer.js";
|
|
26
|
+
// Export generator functionality (FHIR -> TypeSchema)
|
|
27
|
+
export { generateTypeSchemaFromPackage, generateTypeSchemaFromSchema, generateTypeSchemaFromSchemas, TypeSchemaGenerator, } from "./generator.js";
|
|
28
|
+
// Export parser functionality (Read TypeSchema)
|
|
29
|
+
export { parseTypeSchemaFromFile, parseTypeSchemaFromFiles, parseTypeSchemaFromString, TypeSchemaParser, } from "./parser.js";
|
|
30
|
+
// Profile processing temporarily disabled (not in core TypeSchema spec)
|
|
31
|
+
// export { transformProfile } from "./profile/processor";
|
|
32
|
+
// Export new comprehensive types (preferred)
|
|
33
|
+
export * from "./type-schema.types.js";
|
|
34
|
+
// Export typeschema-specific utils (renamed to avoid conflicts)
|
|
35
|
+
export { isTypeSchemaBinding, isTypeSchemaForResourceComplexTypeLogical, isTypeSchemaValueSet, } from "./utils.js";
|
|
36
|
+
// Export value set processing
|
|
37
|
+
export { transformValueSet } from "./value-set/processor.js";
|
|
38
|
+
/**
|
|
39
|
+
* TypeSchema Core API class
|
|
40
|
+
*
|
|
41
|
+
* Provides core TypeSchema functionality: convert, read, and validate.
|
|
42
|
+
* Does NOT include target-specific generation (like TypeScript generation).
|
|
43
|
+
* Use target generators in src/api/generators/ for output generation.
|
|
44
|
+
*/
|
|
45
|
+
export class TypeSchemaAPI {
|
|
46
|
+
generator;
|
|
47
|
+
parser;
|
|
48
|
+
cache;
|
|
49
|
+
constructor(options = {}) {
|
|
50
|
+
this.generator = new TypeSchemaGenerator(options.generator);
|
|
51
|
+
this.parser = new TypeSchemaParser(options.parser);
|
|
52
|
+
this.cache = new TypeSchemaCache();
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Convert FHIR package to TypeSchema
|
|
56
|
+
*/
|
|
57
|
+
async generateFromPackage(packageName, packageVersion) {
|
|
58
|
+
const schemas = await this.generator.generateFromPackage(packageName, packageVersion);
|
|
59
|
+
// Cache generated schemas
|
|
60
|
+
this.cache.setMany(schemas);
|
|
61
|
+
return schemas;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Parse TypeSchema from files
|
|
65
|
+
*/
|
|
66
|
+
async parseFromFiles(inputFiles) {
|
|
67
|
+
const schemas = await this.parser.parseFromFiles(inputFiles);
|
|
68
|
+
// Cache parsed schemas
|
|
69
|
+
this.cache.setMany(schemas);
|
|
70
|
+
return schemas;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Create a new TypeSchema API instance
|
|
75
|
+
*/
|
|
76
|
+
export function createTypeSchemaAPI(options) {
|
|
77
|
+
return new TypeSchemaAPI(options);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Convenience function to convert FHIR package to TypeSchema
|
|
81
|
+
*/
|
|
82
|
+
export async function generateTypeSchemaFromPackageCore(packageName, packageVersion) {
|
|
83
|
+
const api = createTypeSchemaAPI();
|
|
84
|
+
return await api.generateFromPackage(packageName, packageVersion);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Convenience function to parse TypeSchema from files
|
|
88
|
+
*/
|
|
89
|
+
export async function parseTypeSchemaFromFilesCore(inputFiles) {
|
|
90
|
+
const api = createTypeSchemaAPI();
|
|
91
|
+
return await api.parseFromFiles(inputFiles);
|
|
92
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { TypeSchema, TypeSchemaIdentifier } from "./type-schema.types";
|
|
2
|
-
import type { TypeschemaParserOptions } from "./types";
|
|
1
|
+
import type { TypeSchema, TypeSchemaIdentifier } from "./type-schema.types.js";
|
|
2
|
+
import type { TypeschemaParserOptions } from "./types.js";
|
|
3
3
|
/**
|
|
4
4
|
* TypeSchema Parser class
|
|
5
5
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/typeschema/parser.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/typeschema/parser.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAE1D;;;;;GAKG;AACH,qBAAa,gBAAgB;IAC5B,OAAO,CAAC,OAAO,CAAoC;gBAEvC,OAAO,GAAE,uBAA4B;IASjD;;OAEG;IACG,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAU5D;;OAEG;IACG,eAAe,CACpB,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,QAAQ,GAAG,MAAM,GACxB,OAAO,CAAC,UAAU,EAAE,CAAC;IAkBxB;;OAEG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAWhE;;OAEG;IACH,WAAW,CAAC,UAAU,EAAE,GAAG,GAAG,UAAU;IAexC;;OAEG;IACH,gBAAgB,CACf,OAAO,EAAE,UAAU,EAAE,EACrB,UAAU,EAAE,OAAO,CAAC,oBAAoB,CAAC,GACvC,UAAU,EAAE;IAMf;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAIrE;;OAEG;IACH,UAAU,CACT,OAAO,EAAE,UAAU,EAAE,EACrB,IAAI,EAAE,oBAAoB,CAAC,MAAM,CAAC,GAChC,UAAU,EAAE;IAIf;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,UAAU,EAAE;IAMvE;;OAEG;IACH,eAAe,CAAC,MAAM,EAAE,UAAU,GAAG,oBAAoB,EAAE;IA6D3D;;OAEG;IACH,mBAAmB,CAClB,OAAO,EAAE,UAAU,EAAE,EACrB,YAAY,EAAE,UAAU,GACtB,UAAU,EAAE;IAcf;;OAEG;IACH,OAAO,CAAC,YAAY;IA6BpB;;OAEG;IACH,OAAO,CAAC,WAAW;IAmBnB;;OAEG;IACH,OAAO,CAAC,SAAS;IAcjB;;OAEG;IACH,OAAO,CAAC,eAAe;IAcvB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAczB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAazB;;OAEG;IACH,OAAO,CAAC,uBAAuB;CAe/B;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC5C,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,uBAAuB,GAC/B,OAAO,CAAC,UAAU,EAAE,CAAC,CAGvB;AAED;;GAEG;AACH,wBAAsB,yBAAyB,CAC9C,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,QAAQ,GAAG,MAAM,EAC1B,OAAO,CAAC,EAAE,uBAAuB,GAC/B,OAAO,CAAC,UAAU,EAAE,CAAC,CAGvB;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAC7C,SAAS,EAAE,MAAM,EAAE,EACnB,OAAO,CAAC,EAAE,uBAAuB,GAC/B,OAAO,CAAC,UAAU,EAAE,CAAC,CAGvB"}
|