@atomic-ehr/codegen 0.0.1-canary.20250830224431.6d211a5 → 0.0.1-canary.20250831211734.bb1536b

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.
@@ -4,7 +4,7 @@
4
4
  * Provides a fluent, chainable API for common codegen use cases with pre-built generators.
5
5
  * This builder pattern allows users to configure generation in a declarative way.
6
6
  */
7
- import type { Config, RestClientConfig, TypeSchemaConfig } from "../config.js";
7
+ import type { Config, TypeSchemaConfig } from "../config.js";
8
8
  import type { TypeSchema } from "../typeschema/type-schema.types.js";
9
9
  import type { CodegenLogger } from "../utils/codegen-logger.js";
10
10
  /**
@@ -79,10 +79,6 @@ export declare class APIBuilder {
79
79
  valueSetMode?: 'all' | 'required-only' | 'custom';
80
80
  valueSetDirectory?: string;
81
81
  }): APIBuilder;
82
- /**
83
- * Configure REST client generation
84
- */
85
- restClient(options?: RestClientConfig): APIBuilder;
86
82
  /**
87
83
  * Set a progress callback for monitoring generation
88
84
  */
@@ -99,10 +95,6 @@ export declare class APIBuilder {
99
95
  * Enable/disable validation
100
96
  */
101
97
  validate(enabled?: boolean): APIBuilder;
102
- /**
103
- * Ensure TypeScript generator is configured if REST client is configured
104
- */
105
- private ensureTypeScriptForRestClient;
106
98
  /**
107
99
  * Execute the generation process
108
100
  */
@@ -6,7 +6,6 @@
6
6
  */
7
7
  import { TypeSchemaCache, TypeSchemaGenerator, TypeSchemaParser, } from "../typeschema/index.js";
8
8
  import { createLogger } from "../utils/codegen-logger.js";
9
- import { RestClientGenerator } from "./generators/rest-client.js";
10
9
  import { TypeScriptGenerator } from "./generators/typescript.js";
11
10
  /**
12
11
  * High-Level API Builder class
@@ -99,21 +98,6 @@ export class APIBuilder {
99
98
  this.logger.debug(`Configured TypeScript generator (${options.moduleFormat || "esm"})`);
100
99
  return this;
101
100
  }
102
- /**
103
- * Configure REST client generation
104
- */
105
- restClient(options = {}) {
106
- // REST client goes in client subfolder
107
- const clientOutputDir = `${this.options.outputDir}/client`;
108
- const generator = new RestClientGenerator({
109
- outputDir: clientOutputDir,
110
- logger: this.logger.child("REST"),
111
- ...options, // Pass all RestClientConfig options
112
- });
113
- this.generators.set("restclient", generator);
114
- this.logger.debug(`Configured REST client generator (${options.clientName || "FHIRClient"})`);
115
- return this;
116
- }
117
101
  /**
118
102
  * Set a progress callback for monitoring generation
119
103
  */
@@ -149,29 +133,10 @@ export class APIBuilder {
149
133
  this.options.validate = enabled;
150
134
  return this;
151
135
  }
152
- /**
153
- * Ensure TypeScript generator is configured if REST client is configured
154
- */
155
- ensureTypeScriptForRestClient() {
156
- const hasRestClient = this.generators.has("restclient");
157
- const hasTypeScript = this.generators.has("typescript");
158
- if (hasRestClient && !hasTypeScript) {
159
- this.logger.debug("Automatically adding TypeScript generator for REST client");
160
- // Add TypeScript generator with minimal config
161
- this.typescript({
162
- moduleFormat: "esm",
163
- generateIndex: true,
164
- includeDocuments: false,
165
- namingConvention: "PascalCase",
166
- });
167
- }
168
- }
169
136
  /**
170
137
  * Execute the generation process
171
138
  */
172
139
  async generate() {
173
- // Ensure TypeScript is configured if REST client is configured
174
- this.ensureTypeScriptForRestClient();
175
140
  const startTime = performance.now();
176
141
  const result = {
177
142
  success: false,
@@ -253,7 +218,7 @@ export class APIBuilder {
253
218
  logger: this.logger.child("Schema"),
254
219
  treeshake: this.typeSchemaConfig?.treeshake,
255
220
  }, this.typeSchemaConfig);
256
- this.typeSchemaGenerator = generator; // Store for REST client generation
221
+ this.typeSchemaGenerator = generator;
257
222
  const schemas = await generator.generateFromPackage(packageName, version);
258
223
  this.schemas = [...this.schemas, ...schemas];
259
224
  if (this.cache) {
@@ -344,11 +309,6 @@ export function createAPIFromConfig(config) {
344
309
  if (config.typescript) {
345
310
  builder.typescript(config.typescript);
346
311
  }
347
- // Configure REST client generator if specified
348
- if (config.restClient) {
349
- console.log("fsdfdsfsdfdsf");
350
- builder.restClient(config.restClient);
351
- }
352
312
  return builder;
353
313
  }
354
314
  /**
@@ -100,6 +100,14 @@ export declare class TypeScriptGenerator extends BaseGenerator<TypeScriptGenerat
100
100
  * Get the TypeScript type name for a binding
101
101
  */
102
102
  private getValueSetTypeName;
103
+ /**
104
+ * Check if a field has enum values that should be inlined
105
+ */
106
+ private shouldUseInlineEnum;
107
+ /**
108
+ * Generate inline enum type from field enum values
109
+ */
110
+ private generateInlineEnumType;
103
111
  private shouldSkipSchema;
104
112
  private getFilenameForSchema;
105
113
  private extractImportsFromContent;
@@ -153,6 +161,10 @@ export declare class TypeScriptGenerator extends BaseGenerator<TypeScriptGenerat
153
161
  * Get current options for compatibility with API builder
154
162
  */
155
163
  getOptions(): TypeScriptGeneratorOptions;
164
+ /**
165
+ * Override generate to clean directory first
166
+ */
167
+ generate(schemas: TypeSchema[]): Promise<GeneratedFile[]>;
156
168
  /**
157
169
  * Run post-generation hooks - generate utility files
158
170
  */
@@ -183,6 +183,10 @@ export class TypeScriptGenerator extends BaseGenerator {
183
183
  if (!binding) {
184
184
  return false;
185
185
  }
186
+ // If generateValueSets is false, never use value set types
187
+ if (!this.tsOptions.generateValueSets) {
188
+ return false;
189
+ }
186
190
  const valueSetTypeName = this.typeMapper.formatTypeName(binding.name);
187
191
  return this.collectedValueSets.has(valueSetTypeName);
188
192
  }
@@ -192,6 +196,31 @@ export class TypeScriptGenerator extends BaseGenerator {
192
196
  getValueSetTypeName(binding) {
193
197
  return this.typeMapper.formatTypeName(binding.name);
194
198
  }
199
+ /**
200
+ * Check if a field has enum values that should be inlined
201
+ */
202
+ shouldUseInlineEnum(field) {
203
+ if (!field) {
204
+ return false;
205
+ }
206
+ // Only use inline enums when generateValueSets is false
207
+ if (this.tsOptions.generateValueSets) {
208
+ return false;
209
+ }
210
+ // Check if field has enum values directly on the field
211
+ return field.enum && Array.isArray(field.enum) && field.enum.length > 0;
212
+ }
213
+ /**
214
+ * Generate inline enum type from field enum values
215
+ */
216
+ generateInlineEnumType(field) {
217
+ if (!field.enum || !Array.isArray(field.enum)) {
218
+ return "string"; // fallback
219
+ }
220
+ // Create union type from enum values
221
+ const enumValues = field.enum.map((value) => `'${value}'`).join(' | ');
222
+ return enumValues;
223
+ }
195
224
  shouldSkipSchema(schema) {
196
225
  if (schema.identifier.kind === "value-set" ||
197
226
  schema.identifier.kind === "binding" ||
@@ -411,7 +440,7 @@ export class TypeScriptGenerator extends BaseGenerator {
411
440
  if ("choices" in field && field.choices && Array.isArray(field.choices)) {
412
441
  return imports;
413
442
  }
414
- // Handle value set imports
443
+ // Handle value set imports (only when generateValueSets is true)
415
444
  if (field.binding && this.shouldUseValueSetType(field.binding)) {
416
445
  const valueSetTypeName = this.getValueSetTypeName(field.binding);
417
446
  imports.push(valueSetTypeName);
@@ -527,6 +556,10 @@ export class TypeScriptGenerator extends BaseGenerator {
527
556
  const valueSetTypeName = this.getValueSetTypeName(field.binding);
528
557
  typeString = valueSetTypeName;
529
558
  }
559
+ else if (field.binding && this.shouldUseInlineEnum(field)) {
560
+ // Generate inline enum union type when generateValueSets is false
561
+ typeString = this.generateInlineEnumType(field);
562
+ }
530
563
  else {
531
564
  // Existing type mapping logic
532
565
  const languageType = this.typeMapper.mapType(field.type);
@@ -621,6 +654,16 @@ export class TypeScriptGenerator extends BaseGenerator {
621
654
  getOptions() {
622
655
  return { ...this.options };
623
656
  }
657
+ /**
658
+ * Override generate to clean directory first
659
+ */
660
+ async generate(schemas) {
661
+ // Clean output directory before generation
662
+ await this.fileManager.cleanDirectory();
663
+ this.logger.debug("Cleaned output directory before generation");
664
+ // Call parent implementation
665
+ return super.generate(schemas);
666
+ }
624
667
  /**
625
668
  * Run post-generation hooks - generate utility files
626
669
  */
@@ -781,13 +824,13 @@ export class TypeScriptGenerator extends BaseGenerator {
781
824
  // Export utilities
782
825
  lines.push('export * from "./utilities.js";');
783
826
  // Export value sets if any were generated
784
- if (this.collectedValueSets.size > 0) {
827
+ if (this.tsOptions.generateValueSets && this.collectedValueSets.size > 0) {
785
828
  lines.push('');
786
829
  lines.push('// Value Sets');
787
830
  lines.push('export * from "./valuesets/index.js";');
788
831
  }
789
832
  const content = lines.join('\n');
790
833
  await this.fileManager.writeFile('index.ts', content);
791
- this.logger.info(`Generated index.ts with type exports${this.collectedValueSets.size > 0 ? ' and value sets' : ''}`);
834
+ this.logger.info(`Generated index.ts with type exports${this.tsOptions.generateValueSets && this.collectedValueSets.size > 0 ? ' and value sets' : ''}`);
792
835
  }
793
836
  }
@@ -12,8 +12,6 @@ export type { PackageInfo } from "../typeschema/types.js";
12
12
  export type { APIBuilderOptions, GenerationResult, ProgressCallback, } from "./builder.js";
13
13
  export { APIBuilder, createAPI, createAPIFromConfig, generateTypesFromFiles, generateTypesFromPackage, } from "./builder.js";
14
14
  export type { GeneratedFile } from "./generators/base/index.js";
15
- export type { GeneratedRestClient, RestClientOptions, } from "./generators/rest-client.js";
16
- export { RestClientGenerator } from "./generators/rest-client.js";
17
15
  export type { TypeScriptGeneratorOptions } from "./generators/typescript.js";
18
16
  export { TypeScriptGenerator } from "./generators/typescript.js";
19
17
  /**
package/dist/api/index.js CHANGED
@@ -10,7 +10,6 @@
10
10
  export { TypeSchemaCache, TypeSchemaGenerator, TypeSchemaParser, } from "../typeschema/index.js";
11
11
  // Export main API builder and utilities
12
12
  export { APIBuilder, createAPI, createAPIFromConfig, generateTypesFromFiles, generateTypesFromPackage, } from "./builder.js";
13
- export { RestClientGenerator } from "./generators/rest-client.js";
14
13
  // Export generator classes for advanced usage
15
14
  export { TypeScriptGenerator } from "./generators/typescript.js";
16
15
  /**
@@ -67,7 +67,6 @@ export const generateCommand = {
67
67
  logger.info(`Packages: ${config.packages?.length || 0}`);
68
68
  logger.info(`Files: ${config.files?.length || 0}`);
69
69
  logger.info(`TypeScript generation: ${config.typescript ? "enabled" : "disabled"}`);
70
- logger.info(`REST Client generation: ${config.restClient ? "enabled" : "disabled"}`);
71
70
  }
72
71
  // Create API builder with config options
73
72
  const builder = new APIBuilder({
@@ -109,18 +108,9 @@ export const generateCommand = {
109
108
  }
110
109
  builder.typescript(config.typescript);
111
110
  }
112
- if (config.restClient) {
113
- if (verbose) {
114
- logger.info("Configuring REST Client generation from config");
115
- logger.debug(`Client name: ${config.restClient.clientName || "FHIRClient"}`);
116
- logger.debug(`Include validation: ${config.restClient.includeValidation ?? false}`);
117
- logger.debug(`Enhanced search: ${config.restClient.enhancedSearch ?? false}`);
118
- }
119
- builder.restClient(config.restClient);
120
- }
121
111
  // Check that at least one generator is configured
122
- if (!config.typescript && !config.restClient) {
123
- throw new Error("No generators configured. Please enable 'typescript' or 'restClient' in your config file.");
112
+ if (!config.typescript) {
113
+ throw new Error("No generators configured. Please enable 'typescript' in your config file.");
124
114
  }
125
115
  // Add progress callback if verbose
126
116
  if (verbose) {