Skip to content

Commit 1676d2b

Browse files
committed
feat: add configurable log levels in CLI and API
- Introduced `--log-level` option in CLI for granular logging control. - Enhanced `CodegenLogger` to support log levels (DEBUG, INFO, WARN, ERROR, SILENT). - Updated APIBuilder to allow log level configuration.
1 parent c134ba7 commit 1676d2b

12 files changed

Lines changed: 73 additions & 25 deletions

File tree

examples/csharp/generate.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ if (require.main === module) {
44
console.log("📦 Generating FHIR R4 Core Types...");
55

66
const builder = new APIBuilder()
7-
.verbose()
87
.throwException()
98
.fromPackage("hl7.fhir.r4.core", "4.0.1")
109
.csharp("SuperNameSpace", "src/api/writer-generator/csharp/staticFiles")

examples/typescript-ccda/generate.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ if (require.main === module) {
77
console.log("📦 Generating FHIR R4 Core Types...");
88

99
const builder = new APIBuilder()
10-
.verbose()
1110
.throwException()
1211
.fromPackage("hl7.cda.uv.core", "2.0.1-sd")
1312
.typescript({ withDebugComment: false })

examples/typescript-r4/generate.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ if (require.main === module) {
77
console.log("📦 Generating FHIR R4 Core Types...");
88

99
const builder = new APIBuilder()
10-
.verbose()
1110
.throwException()
1211
.fromPackage("hl7.fhir.r4.core", "4.0.1")
1312
.typescript({

examples/typescript-sql-on-fhir/generate.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { APIBuilder } from "../../src/api/builder";
22

33
const builder = new APIBuilder()
4-
.verbose()
54
.throwException()
65
.typescript({ withDebugComment: false, generateProfile: false })
76
.fromPackageRef("https://build.fhir.org/ig/FHIR/sql-on-fhir-v2//package.tgz")

src/api/builder.ts

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import { mkTypeSchemaIndex, type TreeShake, type TypeSchemaIndex, treeShake } fr
1515
import { generateTypeSchemas } from "@typeschema/index";
1616
import { extractNameFromCanonical, packageMetaToFhir, packageMetaToNpm, type TypeSchema } from "@typeschema/types";
1717
import type { TypeSchemaConfig } from "../config";
18-
import { CodegenLogger, createLogger } from "../utils/codegen-logger";
18+
import { CodegenLogger, createLogger, type LogLevel } from "../utils/codegen-logger";
1919
import { TypeScript, type TypeScriptOptions } from "./writer-generator/typescript";
2020
import type { FileBuffer, FileSystemWriter, WriterOptions } from "./writer-generator/writer";
2121

@@ -24,7 +24,6 @@ import type { FileBuffer, FileSystemWriter, WriterOptions } from "./writer-gener
2424
*/
2525
export interface APIBuilderOptions {
2626
outputDir?: string;
27-
verbose?: boolean;
2827
overwrite?: boolean; // FIXME: remove
2928
cache?: boolean; // FIXME: remove
3029
cleanOutput?: boolean;
@@ -35,6 +34,8 @@ export interface APIBuilderOptions {
3534
throwException?: boolean;
3635
exportTypeTree?: string;
3736
treeShake?: TreeShake;
37+
/** Log level for the logger. Default: INFO */
38+
logLevel?: LogLevel;
3839
}
3940

4041
/**
@@ -70,7 +71,7 @@ export type PartialBy<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
7071

7172
type APIBuilderConfig = PartialBy<
7273
Required<APIBuilderOptions>,
73-
"logger" | "typeSchemaConfig" | "typeSchemaOutputDir" | "exportTypeTree" | "treeShake"
74+
"logger" | "typeSchemaConfig" | "typeSchemaOutputDir" | "exportTypeTree" | "treeShake" | "logLevel"
7475
> & {
7576
cleanOutput: boolean;
7677
};
@@ -188,7 +189,6 @@ export class APIBuilder {
188189
constructor(options: APIBuilderOptions = {}) {
189190
this.options = {
190191
outputDir: options.outputDir || "./generated",
191-
verbose: options.verbose ?? false,
192192
overwrite: options.overwrite ?? true,
193193
cache: options.cache ?? true,
194194
cleanOutput: options.cleanOutput ?? true,
@@ -206,8 +206,8 @@ export class APIBuilder {
206206
this.logger =
207207
options.logger ||
208208
createLogger({
209-
verbose: this.options.verbose,
210209
prefix: "API",
210+
level: options.logLevel,
211211
});
212212
}
213213

@@ -259,7 +259,6 @@ export class APIBuilder {
259259
logger: new CodegenLogger({
260260
prefix: "C#",
261261
timestamp: true,
262-
verbose: true,
263262
suppressLoggingLevel: [],
264263
}),
265264
});
@@ -291,9 +290,8 @@ export class APIBuilder {
291290
return this;
292291
}
293292

294-
verbose(enabled = true): APIBuilder {
295-
this.options.verbose = enabled;
296-
this.logger?.configure({ verbose: enabled });
293+
setLogLevel(level: LogLevel): APIBuilder {
294+
this.logger?.setLevel(level);
297295
return this;
298296
}
299297

src/api/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,4 @@ export type { APIBuilderOptions } from "./builder";
1111
export { APIBuilder } from "./builder";
1212
export type { CSharpGeneratorOptions } from "./writer-generator/csharp/csharp";
1313
export type { TypeScriptOptions } from "./writer-generator/typescript";
14+
export { LogLevel } from "../utils/codegen-logger";

src/cli/commands/generate.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,6 @@ export const generateCommand: CommandModule<Record<string, unknown>, GenerateArg
7373

7474
// Create logger for CLI command
7575
const logger = createLogger({
76-
verbose,
7776
prefix: "Generate",
7877
});
7978

@@ -90,7 +89,6 @@ export const generateCommand: CommandModule<Record<string, unknown>, GenerateArg
9089
// Create API builder with config options
9190
const builder = new APIBuilder({
9291
outputDir: config.outputDir || "./generated",
93-
verbose,
9492
overwrite: config.overwrite ?? true,
9593
cache: config.cache ?? true,
9694
typeSchemaConfig: config.typeSchema,

src/cli/commands/index.ts

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
* Modern CLI with subcommands for typeschema and code generation
77
*/
88

9-
import { configure, error, header } from "@root/utils/codegen-logger";
9+
import { configure, error, header, LogLevel } from "@root/utils/codegen-logger";
1010
import yargs from "yargs";
1111
import { hideBin } from "yargs/helpers";
1212
import { generateCommand } from "./generate";
@@ -19,16 +19,44 @@ export interface CLIArgv {
1919
config?: string;
2020
verbose?: boolean;
2121
debug?: boolean;
22+
logLevel?: "debug" | "info" | "warn" | "error" | "silent";
23+
}
24+
25+
/**
26+
* Map string log level to LogLevel enum
27+
*/
28+
function parseLogLevel(level: string | undefined): LogLevel | undefined {
29+
if (!level) return undefined;
30+
const levelMap: Record<string, LogLevel> = {
31+
debug: LogLevel.DEBUG,
32+
info: LogLevel.INFO,
33+
warn: LogLevel.WARN,
34+
error: LogLevel.ERROR,
35+
silent: LogLevel.SILENT,
36+
};
37+
return levelMap[level.toLowerCase()];
2238
}
2339

2440
/**
2541
* Middleware to setup logging
2642
*/
2743
async function setupLoggingMiddleware(argv: any) {
44+
// Determine log level: explicit --log-level takes precedence over --verbose/--debug
45+
let level = parseLogLevel(argv.logLevel);
46+
47+
// If no explicit log level, use --verbose or --debug as shortcuts
48+
if (level === undefined) {
49+
if (argv.debug || argv.verbose) {
50+
level = LogLevel.DEBUG;
51+
} else {
52+
level = LogLevel.INFO;
53+
}
54+
}
55+
2856
// Configure the CliLogger with user preferences
2957
configure({
30-
verbose: argv.verbose || argv.debug,
3158
timestamp: argv.debug,
59+
level,
3260
});
3361
}
3462

@@ -56,6 +84,13 @@ export function createCLI() {
5684
default: false,
5785
global: true,
5886
})
87+
.option("log-level", {
88+
alias: "l",
89+
type: "string",
90+
choices: ["debug", "info", "warn", "error", "silent"] as const,
91+
description: "Set the log level (default: info)",
92+
global: true,
93+
})
5994
.option("config", {
6095
alias: "c",
6196
type: "string",

src/cli/commands/typeschema/generate.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,6 @@ export const generateTypeschemaCommand: CommandModule<Record<string, unknown>, G
6767
},
6868
handler: async (argv) => {
6969
const logger = createLogger({
70-
verbose: argv.verbose,
7170
prefix: "TypeSchema",
7271
});
7372

src/typeschema/generator.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ export class TypeSchemaGenerator {
3939
this.logger =
4040
options.logger ||
4141
createLogger({
42-
verbose: this.options.verbose,
4342
prefix: "TypeSchema",
4443
});
4544
}

0 commit comments

Comments
 (0)