diff --git a/scripts/generate_options_schema.js b/scripts/generate_options_schema.js new file mode 100644 index 000000000..40b7c1f4c --- /dev/null +++ b/scripts/generate_options_schema.js @@ -0,0 +1,69 @@ +//@ts-check + +const { addTypeDocOptions } = require("../dist/lib/utils/options/sources"); +const { ParameterType } = require("../dist"); + +const IGNORED_OPTIONS = new Set(["help", "version"]); + +const IGNORED_DEFAULT_OPTIONS = new Set(["options", "tsconfig"]); + +const schema = { + $schema: "https://json-schema.org/draft/2019-09/schema", + title: "JSON Schema for typedoc.json", + type: "object", + properties: {}, +}; + +addTypeDocOptions({ + /** @param {import("../dist").DeclarationOption} option */ + addDeclaration(option) { + if (IGNORED_OPTIONS.has(option.name)) return; + + const data = { + description: option.help, + }; + + switch (option.type ?? ParameterType.String) { + case ParameterType.Array: + data.type = "array"; + data.items = { type: "string" }; + data.default = option.defaultValue ?? []; + break; + case ParameterType.String: + data.type = "string"; + if (!IGNORED_DEFAULT_OPTIONS.has(option.name)) { + data.default = option.defaultValue ?? ""; + } + break; + case ParameterType.Boolean: + data.type = "boolean"; + data.default = option.defaultValue ?? false; + break; + case ParameterType.Number: { + const decl = /** @type {import("../dist").NumberDeclarationOption} */ (option); + data.type = "number"; + data.default = decl.defaultValue ?? 0; + data.maximum = decl.maxValue; + data.minimum = decl.minValue; + break; + } + case ParameterType.Map: { + const map = /** @type {import("../dist").MapDeclarationOption} */ (option) + .map; + data.enum = + map instanceof Map ? [...map.keys()] : Object.keys(map); + data.default = option.defaultValue; + break; + } + case ParameterType.Mixed: + break; // Nothing to do... TypeDoc really shouldn't have any of these. + } + + schema.properties[option.name] = data; + }, +}); + +schema.properties.logger.enum = ["console", "none"]; +schema.properties.logger.default = "console"; + +console.log(JSON.stringify(schema, null, "\t")); diff --git a/src/lib/utils/options/declaration.ts b/src/lib/utils/options/declaration.ts index 0b3776863..960f5bf81 100644 --- a/src/lib/utils/options/declaration.ts +++ b/src/lib/utils/options/declaration.ts @@ -90,7 +90,6 @@ export enum ParameterType { Map, Mixed, Array, - Path, } export interface DeclarationOptionBase { diff --git a/src/lib/utils/options/sources/typedoc.ts b/src/lib/utils/options/sources/typedoc.ts index 5532fdd80..a407e4d45 100644 --- a/src/lib/utils/options/sources/typedoc.ts +++ b/src/lib/utils/options/sources/typedoc.ts @@ -1,7 +1,7 @@ import { Options } from ".."; import { ParameterType, ParameterHint } from "../declaration"; -export function addTypeDocOptions(options: Options) { +export function addTypeDocOptions(options: Pick) { options.addDeclaration({ name: "options", help: