diff --git a/src/lib/utils/options/declaration.ts b/src/lib/utils/options/declaration.ts index 8a191cc00..5f3728207 100644 --- a/src/lib/utils/options/declaration.ts +++ b/src/lib/utils/options/declaration.ts @@ -110,6 +110,7 @@ export interface TypeDocOptionMap { logger: unknown; // string | Function logLevel: typeof LogLevel; markedOptions: unknown; + compilerOptions: unknown; // Validation treatWarningsAsErrors: boolean; diff --git a/src/lib/utils/options/options.ts b/src/lib/utils/options/options.ts index 61b18a2d6..510671a14 100644 --- a/src/lib/utils/options/options.ts +++ b/src/lib/utils/options/options.ts @@ -328,8 +328,13 @@ export class Options { fixCompilerOptions( options: Readonly ): ts.CompilerOptions { + const overrides = this.getValue("compilerOptions"); const result = { ...options }; + if (overrides) { + Object.assign(result, overrides); + } + if ( this.getValue("emit") !== "both" && this.getValue("emit") !== true diff --git a/src/lib/utils/options/sources/typedoc.ts b/src/lib/utils/options/sources/typedoc.ts index b3e1b5f88..78fd34d84 100644 --- a/src/lib/utils/options/sources/typedoc.ts +++ b/src/lib/utils/options/sources/typedoc.ts @@ -327,6 +327,22 @@ export function addTypeDocOptions(options: Pick) { } }, }); + options.addDeclaration({ + name: "compilerOptions", + help: "Selectively override the TypeScript compiler options used by TypeDoc.", + type: ParameterType.Mixed, + validate(value) { + if ( + typeof value !== "object" || + Array.isArray(value) || + value == null + ) { + throw new Error( + "The 'compilerOptions' option must be a non-array object." + ); + } + }, + }); options.addDeclaration({ name: "treatWarningsAsErrors", diff --git a/src/test/utils/options/default-options.test.ts b/src/test/utils/options/default-options.test.ts index c7855ec3c..5a2a23fac 100644 --- a/src/test/utils/options/default-options.test.ts +++ b/src/test/utils/options/default-options.test.ts @@ -55,6 +55,14 @@ describe("Default Options", () => { }); }); + describe("compilerOptions", () => { + it("Errors if given a non-object", () => { + throws(() => opts.setValue("markedOptions", null)); + throws(() => opts.setValue("markedOptions", "bad")); + throws(() => opts.setValue("markedOptions", [])); + }); + }); + describe("requiredToBeDocumented", () => { it("Works with valid values", () => { doesNotThrow(() =>