@atomic-ehr/codegen 0.0.1-canary.20250821160126.c552195 → 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.
Files changed (122) hide show
  1. package/dist/api/builder.d.ts +3 -3
  2. package/dist/api/builder.d.ts.map +1 -1
  3. package/dist/api/builder.js +374 -0
  4. package/dist/api/generators/base/BaseGenerator.d.ts +4 -4
  5. package/dist/api/generators/base/BaseGenerator.d.ts.map +1 -1
  6. package/dist/api/generators/base/BaseGenerator.js +572 -0
  7. package/dist/api/generators/base/FileManager.d.ts +2 -2
  8. package/dist/api/generators/base/FileManager.d.ts.map +1 -1
  9. package/dist/api/generators/base/FileManager.js +204 -0
  10. package/dist/api/generators/base/PythonTypeMapper.d.ts +2 -2
  11. package/dist/api/generators/base/PythonTypeMapper.d.ts.map +1 -1
  12. package/dist/api/generators/base/PythonTypeMapper.js +71 -0
  13. package/dist/api/generators/base/TemplateEngine.d.ts +1 -1
  14. package/dist/api/generators/base/TemplateEngine.d.ts.map +1 -1
  15. package/dist/api/generators/base/TemplateEngine.js +133 -0
  16. package/dist/api/generators/base/TypeMapper.js +153 -0
  17. package/dist/api/generators/base/TypeScriptTypeMapper.d.ts +1 -1
  18. package/dist/api/generators/base/TypeScriptTypeMapper.d.ts.map +1 -1
  19. package/dist/api/generators/base/TypeScriptTypeMapper.js +232 -0
  20. package/dist/api/generators/base/builders/DirectoryBuilder.d.ts +4 -4
  21. package/dist/api/generators/base/builders/DirectoryBuilder.d.ts.map +1 -1
  22. package/dist/api/generators/base/builders/DirectoryBuilder.js +215 -0
  23. package/dist/api/generators/base/builders/FileBuilder.d.ts +2 -2
  24. package/dist/api/generators/base/builders/FileBuilder.d.ts.map +1 -1
  25. package/dist/api/generators/base/builders/FileBuilder.js +408 -0
  26. package/dist/api/generators/base/builders/IndexBuilder.d.ts +2 -2
  27. package/dist/api/generators/base/builders/IndexBuilder.d.ts.map +1 -1
  28. package/dist/api/generators/base/builders/IndexBuilder.js +290 -0
  29. package/dist/api/generators/base/enhanced-errors.d.ts +2 -2
  30. package/dist/api/generators/base/enhanced-errors.d.ts.map +1 -1
  31. package/dist/api/generators/base/enhanced-errors.js +259 -0
  32. package/dist/api/generators/base/error-handler.d.ts +1 -1
  33. package/dist/api/generators/base/error-handler.d.ts.map +1 -1
  34. package/dist/api/generators/base/error-handler.js +243 -0
  35. package/dist/api/generators/base/errors.d.ts +2 -2
  36. package/dist/api/generators/base/errors.d.ts.map +1 -1
  37. package/dist/api/generators/base/errors.js +694 -0
  38. package/dist/api/generators/base/index.d.ts +22 -22
  39. package/dist/api/generators/base/index.d.ts.map +1 -1
  40. package/dist/api/generators/base/index.js +161 -0
  41. package/dist/api/generators/base/types.d.ts +2 -2
  42. package/dist/api/generators/base/types.d.ts.map +1 -1
  43. package/dist/api/generators/base/types.js +12 -0
  44. package/dist/api/generators/rest-client.d.ts +2 -2
  45. package/dist/api/generators/rest-client.d.ts.map +1 -1
  46. package/dist/api/generators/rest-client.js +847 -0
  47. package/dist/api/generators/search-parameter-enhancer.d.ts +1 -1
  48. package/dist/api/generators/search-parameter-enhancer.d.ts.map +1 -1
  49. package/dist/api/generators/search-parameter-enhancer.js +801 -0
  50. package/dist/api/generators/types.js +4 -0
  51. package/dist/api/generators/typescript.d.ts +3 -3
  52. package/dist/api/generators/typescript.d.ts.map +1 -1
  53. package/dist/api/generators/typescript.js +537 -0
  54. package/dist/api/generators/validation-generator.js +632 -0
  55. package/dist/api/index.d.ts +10 -10
  56. package/dist/api/index.d.ts.map +1 -1
  57. package/dist/api/index.js +51 -0
  58. package/dist/cli/commands/generate/typescript.d.ts +1 -1
  59. package/dist/cli/commands/generate/typescript.d.ts.map +1 -1
  60. package/dist/cli/commands/generate/typescript.js +52 -0
  61. package/dist/cli/commands/generate.d.ts +5 -12
  62. package/dist/cli/commands/generate.d.ts.map +1 -1
  63. package/dist/cli/commands/generate.js +158 -0
  64. package/dist/cli/commands/index.d.ts +2 -1
  65. package/dist/cli/commands/index.d.ts.map +1 -1
  66. package/dist/cli/commands/index.js +100 -0
  67. package/dist/cli/commands/typeschema/generate.js +130 -0
  68. package/dist/cli/commands/typeschema.js +48 -0
  69. package/dist/cli/index.js +12 -8664
  70. package/dist/cli/utils/log.d.ts +2 -2
  71. package/dist/cli/utils/log.d.ts.map +1 -1
  72. package/dist/cli/utils/log.js +23 -0
  73. package/dist/cli/utils/prompts.js +224 -0
  74. package/dist/cli/utils/spinner.js +270 -0
  75. package/dist/config.d.ts +22 -2
  76. package/dist/config.d.ts.map +1 -1
  77. package/dist/config.js +703 -0
  78. package/dist/index.d.ts +2 -2
  79. package/dist/index.d.ts.map +1 -1
  80. package/dist/index.js +84 -38
  81. package/dist/logger.js +290 -0
  82. package/dist/typeschema/cache.d.ts +2 -2
  83. package/dist/typeschema/cache.d.ts.map +1 -1
  84. package/dist/typeschema/cache.js +285 -0
  85. package/dist/typeschema/core/binding.d.ts +1 -1
  86. package/dist/typeschema/core/binding.d.ts.map +1 -1
  87. package/dist/typeschema/core/binding.js +187 -0
  88. package/dist/typeschema/core/field-builder.d.ts +1 -1
  89. package/dist/typeschema/core/field-builder.d.ts.map +1 -1
  90. package/dist/typeschema/core/field-builder.js +259 -0
  91. package/dist/typeschema/core/identifier.js +117 -0
  92. package/dist/typeschema/core/nested-types.d.ts +1 -1
  93. package/dist/typeschema/core/nested-types.d.ts.map +1 -1
  94. package/dist/typeschema/core/nested-types.js +111 -0
  95. package/dist/typeschema/core/transformer.d.ts +2 -2
  96. package/dist/typeschema/core/transformer.d.ts.map +1 -1
  97. package/dist/typeschema/core/transformer.js +345 -0
  98. package/dist/typeschema/generator.d.ts +3 -3
  99. package/dist/typeschema/generator.d.ts.map +1 -1
  100. package/dist/typeschema/generator.js +352 -0
  101. package/dist/typeschema/index.d.ts +14 -14
  102. package/dist/typeschema/index.d.ts.map +1 -1
  103. package/dist/typeschema/index.js +92 -0
  104. package/dist/typeschema/parser.d.ts +2 -2
  105. package/dist/typeschema/parser.d.ts.map +1 -1
  106. package/dist/typeschema/parser.js +310 -0
  107. package/dist/typeschema/profile/processor.d.ts +1 -1
  108. package/dist/typeschema/profile/processor.d.ts.map +1 -1
  109. package/dist/typeschema/profile/processor.js +268 -0
  110. package/dist/typeschema/schema.js +456 -0
  111. package/dist/typeschema/type-schema.types.js +39 -0
  112. package/dist/typeschema/types.js +4 -0
  113. package/dist/typeschema/utils.d.ts +1 -1
  114. package/dist/typeschema/utils.d.ts.map +1 -1
  115. package/dist/typeschema/utils.js +13 -0
  116. package/dist/typeschema/value-set/processor.d.ts +1 -1
  117. package/dist/typeschema/value-set/processor.d.ts.map +1 -1
  118. package/dist/typeschema/value-set/processor.js +168 -0
  119. package/dist/utils/codegen-logger.js +204 -0
  120. package/dist/utils.js +42 -0
  121. package/package.json +15 -4
  122. package/dist/index-e7pfye24.js +0 -8532
@@ -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,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAGvD,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,SAAS,CAAC;AAGjB,OAAO,EACN,SAAS,EACT,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,GACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACN,UAAU,EACV,gBAAgB,EAChB,mBAAmB,EACnB,UAAU,EACV,eAAe,EACf,UAAU,EACV,qBAAqB,GACrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACN,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,EACrB,uBAAuB,EACvB,kBAAkB,GAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACN,gBAAgB,EAChB,qBAAqB,EACrB,yBAAyB,GACzB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACN,mBAAmB,EACnB,oBAAoB,GACpB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACN,6BAA6B,EAC7B,4BAA4B,EAC5B,6BAA6B,EAC7B,mBAAmB,GACnB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACN,uBAAuB,EACvB,wBAAwB,EACxB,yBAAyB,EACzB,gBAAgB,GAChB,MAAM,UAAU,CAAC;AAMlB,cAAc,qBAAqB,CAAC;AAEpC,YAAY,EACX,WAAW,EACX,0BAA0B,EAC1B,uBAAuB,GACvB,MAAM,SAAS,CAAC;AAEjB,OAAO,EACN,mBAAmB,EACnB,yCAAyC,EACzC,oBAAoB,GACpB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D;;;;;;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"}
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,qBAAqB,CAAC;AAC5E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAEvD;;;;;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"}
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"}