@twin.org/tools-core 0.0.3-next.20 → 0.0.3-next.21
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.
- package/dist/es/utils/jsonSchemaBuilder.js +83 -1
- package/dist/es/utils/jsonSchemaBuilder.js.map +1 -1
- package/dist/types/utils/jsonSchemaBuilder.d.ts +10 -0
- package/docs/changelog.md +14 -0
- package/docs/reference/classes/JsonSchemaBuilder.md +40 -0
- package/locales/en.json +2 -0
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonSchemaBuilder.js","sourceRoot":"","sources":["../../../src/utils/jsonSchemaBuilder.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2026 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { GeneralError, Is, JsonHelper, ObjectHelper, StringHelper } from \"@twin.org/core\";\nimport { nameof } from \"@twin.org/nameof\";\nimport { type IJsonSchema, JsonSchemaTagNames } from \"@twin.org/tools-models\";\nimport * as ts from \"typescript\";\nimport { Constants } from \"./constants.js\";\nimport { DiagnosticReporter } from \"./diagnosticReporter.js\";\nimport { DisallowedTypeGuard } from \"./disallowedTypeGuard.js\";\nimport { Enum } from \"./enum.js\";\nimport { FileUtils } from \"./fileUtils.js\";\nimport { ImportTypeQuerySchemaResolver } from \"./importTypeQuerySchemaResolver.js\";\nimport { IndexSignaturePatternResolver } from \"./indexSignaturePatternResolver.js\";\nimport { IntersectionSchemaMerger } from \"./intersectionSchemaMerger.js\";\nimport { JsDoc } from \"./jsDoc.js\";\nimport { MappedTypeSchemaResolver } from \"./mappedTypeSchemaResolver.js\";\nimport { ObjectTransformer } from \"./objectTransformer.js\";\nimport { RegEx } from \"./regEx.js\";\nimport { Resolver } from \"./resolver.js\";\nimport { TemplateLiteralPatternBuilder } from \"./templateLiteralPatternBuilder.js\";\nimport { UtilityTypeSchemaMapper } from \"./utilityTypeSchemaMapper.js\";\nimport type { ITypeScriptToSchemaContext } from \"../models/ITypeScriptToSchemaContext.js\";\n\n/**\n * Builder for composing JSON schema fragments from TypeScript AST nodes.\n */\nexport class JsonSchemaBuilder {\n\t/**\n\t * The JSON Schema version used.\n\t */\n\tpublic static readonly SCHEMA_VERSION = \"https://json-schema.org/draft/2020-12/schema\";\n\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof(JsonSchemaBuilder);\n\n\t/**\n\t * Dictionary of TypeScript utility type names to their schema mapping handlers.\n\t */\n\tprivate static readonly _utilityTypeHandlers: {\n\t\t[key: string]: (\n\t\t\tcontext: ITypeScriptToSchemaContext,\n\t\t\ttypeNode: ts.TypeReferenceNode\n\t\t) => IJsonSchema | undefined;\n\t} = {\n\t\tPartial: (context, typeNode) => JsonSchemaBuilder.mapPartialUtilityType(context, typeNode),\n\t\tRequired: (context, typeNode) => JsonSchemaBuilder.mapRequiredUtilityType(context, typeNode),\n\t\tPick: (context, typeNode) => JsonSchemaBuilder.mapPickUtilityType(context, typeNode),\n\t\tOmit: (context, typeNode) => JsonSchemaBuilder.mapOmitUtilityType(context, typeNode),\n\t\tExclude: (context, typeNode) => JsonSchemaBuilder.mapExcludeUtilityType(context, typeNode),\n\t\tExtract: (context, typeNode) => JsonSchemaBuilder.mapExtractUtilityType(context, typeNode),\n\t\tNonNullable: (context, typeNode) =>\n\t\t\tJsonSchemaBuilder.mapNonNullableUtilityType(context, typeNode),\n\t\tRecord: (context, typeNode) => JsonSchemaBuilder.mapRecordUtilityType(context, typeNode),\n\t\tJsonLdObjectWithId: (context, typeNode) =>\n\t\t\tJsonSchemaBuilder.mapJsonLdObjectUtilityType(context, typeNode, {\n\t\t\t\tkeysToRemove: [\"id\", \"@id\"],\n\t\t\t\tkeyToAdd: \"id\",\n\t\t\t\tisAddedKeyRequired: true\n\t\t\t}),\n\t\tJsonLdObjectWithAtId: (context, typeNode) =>\n\t\t\tJsonSchemaBuilder.mapJsonLdObjectUtilityType(context, typeNode, {\n\t\t\t\tkeysToRemove: [\"id\", \"@id\"],\n\t\t\t\tkeyToAdd: \"@id\",\n\t\t\t\tisAddedKeyRequired: true\n\t\t\t}),\n\t\tJsonLdObjectWithOptionalId: (context, typeNode) =>\n\t\t\tJsonSchemaBuilder.mapJsonLdObjectUtilityType(context, typeNode, {\n\t\t\t\tkeysToRemove: [\"id\", \"@id\"],\n\t\t\t\tkeyToAdd: \"id\",\n\t\t\t\tisAddedKeyRequired: false\n\t\t\t}),\n\t\tJsonLdObjectWithOptionalAtId: (context, typeNode) =>\n\t\t\tJsonSchemaBuilder.mapJsonLdObjectUtilityType(context, typeNode, {\n\t\t\t\tkeysToRemove: [\"id\", \"@id\"],\n\t\t\t\tkeyToAdd: \"@id\",\n\t\t\t\tisAddedKeyRequired: false\n\t\t\t}),\n\t\tJsonLdObjectWithNoId: (context, typeNode) =>\n\t\t\tJsonSchemaBuilder.mapJsonLdObjectUtilityType(context, typeNode, {\n\t\t\t\tkeysToRemove: [\"id\"]\n\t\t\t}),\n\t\tJsonLdObjectWithNoAtId: (context, typeNode) =>\n\t\t\tJsonSchemaBuilder.mapJsonLdObjectUtilityType(context, typeNode, {\n\t\t\t\tkeysToRemove: [\"@id\"]\n\t\t\t}),\n\t\tJsonLdObjectWithType: (context, typeNode) =>\n\t\t\tJsonSchemaBuilder.mapJsonLdObjectUtilityType(context, typeNode, {\n\t\t\t\tkeysToRemove: [\"type\", \"@type\"],\n\t\t\t\tkeyToAdd: \"type\",\n\t\t\t\tisAddedKeyRequired: true\n\t\t\t}),\n\t\tJsonLdObjectWithAtType: (context, typeNode) =>\n\t\t\tJsonSchemaBuilder.mapJsonLdObjectUtilityType(context, typeNode, {\n\t\t\t\tkeysToRemove: [\"type\", \"@type\"],\n\t\t\t\tkeyToAdd: \"@type\",\n\t\t\t\tisAddedKeyRequired: true\n\t\t\t}),\n\t\tJsonLdObjectWithOptionalType: (context, typeNode) =>\n\t\t\tJsonSchemaBuilder.mapJsonLdObjectUtilityType(context, typeNode, {\n\t\t\t\tkeysToRemove: [\"type\", \"@type\"],\n\t\t\t\tkeyToAdd: \"type\",\n\t\t\t\tisAddedKeyRequired: false\n\t\t\t}),\n\t\tJsonLdObjectWithOptionalAtType: (context, typeNode) =>\n\t\t\tJsonSchemaBuilder.mapJsonLdObjectUtilityType(context, typeNode, {\n\t\t\t\tkeysToRemove: [\"type\", \"@type\"],\n\t\t\t\tkeyToAdd: \"@type\",\n\t\t\t\tisAddedKeyRequired: false\n\t\t\t}),\n\t\tJsonLdObjectWithNoType: (context, typeNode) =>\n\t\t\tJsonSchemaBuilder.mapJsonLdObjectUtilityType(context, typeNode, {\n\t\t\t\tkeysToRemove: [\"type\"]\n\t\t\t}),\n\t\tJsonLdObjectWithNoAtType: (context, typeNode) =>\n\t\t\tJsonSchemaBuilder.mapJsonLdObjectUtilityType(context, typeNode, {\n\t\t\t\tkeysToRemove: [\"@type\"]\n\t\t\t}),\n\t\tJsonLdObjectWithContext: (context, typeNode) =>\n\t\t\tJsonSchemaBuilder.mapJsonLdObjectUtilityType(context, typeNode, {\n\t\t\t\tkeysToRemove: [\"@context\"],\n\t\t\t\tkeyToAdd: \"@context\",\n\t\t\t\tisAddedKeyRequired: true\n\t\t\t}),\n\t\tJsonLdObjectWithOptionalContext: (context, typeNode) =>\n\t\t\tJsonSchemaBuilder.mapJsonLdObjectUtilityType(context, typeNode, {\n\t\t\t\tkeysToRemove: [\"@context\"],\n\t\t\t\tkeyToAdd: \"@context\",\n\t\t\t\tisAddedKeyRequired: false\n\t\t\t}),\n\t\tJsonLdObjectWithNoContext: (context, typeNode) =>\n\t\t\tJsonSchemaBuilder.mapJsonLdObjectUtilityType(context, typeNode, {\n\t\t\t\tkeysToRemove: [\"@context\"]\n\t\t\t}),\n\t\tSingleOccurrenceArray: (context, typeNode) =>\n\t\t\tJsonSchemaBuilder.mapSingleOccurrenceArrayUtilityType(context, typeNode),\n\t\tObjectOrArray: (context, typeNode) =>\n\t\t\tJsonSchemaBuilder.mapObjectOrArrayUtilityType(context, typeNode)\n\t};\n\n\t/**\n\t * Parse all object declarations from a source file.\n\t * @param context The generation context.\n\t * @param sourceFilePath The source file path.\n\t * @param source The TypeScript source.\n\t * @param visitedFiles The list of visited source files.\n\t * @returns The generated schema titles.\n\t */\n\tpublic static parseAllObjectSchemas(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tsourceFilePath: string,\n\t\tsource: string,\n\t\tvisitedFiles: string[]\n\t): string[] {\n\t\tconst absoluteSourcePath = FileUtils.normalizeFilePath(sourceFilePath);\n\t\tif (visitedFiles.includes(absoluteSourcePath)) {\n\t\t\treturn [];\n\t\t}\n\t\tvisitedFiles.push(absoluteSourcePath);\n\n\t\tconst sourceFile = ts.createSourceFile(sourceFilePath, source, ts.ScriptTarget.Latest, true);\n\t\tconst previousSourceFile = context.activeSourceFile;\n\t\tcontext.activeSourceFile = sourceFile;\n\t\tcontext.schemas[context.packageName] ??= {};\n\t\tconst packageSchemaEntries = context.schemas[context.packageName];\n\t\tconst parsedTitles: string[] = [];\n\n\t\t// Preload local imports so utility type mapping can resolve referenced\n\t\t// object schemas while processing declarations in this file.\n\t\tfor (const statement of sourceFile.statements) {\n\t\t\t// import { Foo } from \"./module.js\" (local relative import)\n\t\t\tif (ts.isImportDeclaration(statement) && ts.isStringLiteral(statement.moduleSpecifier)) {\n\t\t\t\tconst importPath = statement.moduleSpecifier.text;\n\t\t\t\tif (importPath.startsWith(\".\")) {\n\t\t\t\t\tconst resolvedImportPath = FileUtils.resolveImportSourceFilePath(\n\t\t\t\t\t\tsourceFilePath,\n\t\t\t\t\t\timportPath\n\t\t\t\t\t);\n\t\t\t\t\tif (resolvedImportPath) {\n\t\t\t\t\t\tconst importedSource = FileUtils.readFile(resolvedImportPath);\n\t\t\t\t\t\tif (importedSource) {\n\t\t\t\t\t\t\tconst importedTitles = JsonSchemaBuilder.parseAllObjectSchemas(\n\t\t\t\t\t\t\t\tcontext,\n\t\t\t\t\t\t\t\tresolvedImportPath,\n\t\t\t\t\t\t\t\timportedSource,\n\t\t\t\t\t\t\t\tvisitedFiles\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tfor (const importedTitle of importedTitles) {\n\t\t\t\t\t\t\t\tif (!parsedTitles.includes(importedTitle)) {\n\t\t\t\t\t\t\t\t\tparsedTitles.push(importedTitle);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const statement of sourceFile.statements) {\n\t\t\tlet title: string | undefined;\n\t\t\tlet schema: Partial<IJsonSchema> | undefined;\n\t\t\tcontext.activeDisallowedType = undefined;\n\n\t\t\t// interface IFoo { prop: string; } (interface declaration)\n\t\t\tif (ts.isInterfaceDeclaration(statement)) {\n\t\t\t\tconst boundContext = JsonSchemaBuilder.withTypeParameterBindings(\n\t\t\t\t\tcontext,\n\t\t\t\t\tstatement.typeParameters\n\t\t\t\t);\n\t\t\t\ttitle = StringHelper.stripPrefix(statement.name.text);\n\t\t\t\tboundContext.activeEnclosingObjectName = title;\n\t\t\t\tschema = JsonSchemaBuilder.buildBaseSchema(context.namespace, title, statement);\n\t\t\t\tJsonSchemaBuilder.buildObjectSchema(boundContext, schema, statement.members);\n\t\t\t\tJsonSchemaBuilder.applyInterfaceExtendsSchema(boundContext, schema, statement);\n\t\t\t\t// type Foo = string | number or type Foo = { prop: string } (type alias declaration)\n\t\t\t} else if (ts.isTypeAliasDeclaration(statement)) {\n\t\t\t\tconst boundContext = JsonSchemaBuilder.withTypeParameterBindings(\n\t\t\t\t\tcontext,\n\t\t\t\t\tstatement.typeParameters\n\t\t\t\t);\n\t\t\t\ttitle = StringHelper.stripPrefix(statement.name.text);\n\t\t\t\tboundContext.activeEnclosingObjectName = title;\n\n\t\t\t\t// { prop: string } (type alias whose RHS is an inline object type)\n\t\t\t\tif (ts.isTypeLiteralNode(statement.type)) {\n\t\t\t\t\tschema = JsonSchemaBuilder.buildBaseSchema(context.namespace, title, statement);\n\t\t\t\t\tJsonSchemaBuilder.buildObjectSchema(boundContext, schema, statement.type.members);\n\t\t\t\t} else {\n\t\t\t\t\t// Const-and-type enum patterns always take priority so that JsDoc descriptions\n\t\t\t\t\t// on the const object members are preserved in the generated oneOf schema.\n\t\t\t\t\tconst constValues = Enum.extractEnumValuesFromConstAndType(\n\t\t\t\t\t\tstatement.name.text,\n\t\t\t\t\t\tsourceFile\n\t\t\t\t\t);\n\t\t\t\t\tif (constValues) {\n\t\t\t\t\t\tschema = JsonSchemaBuilder.buildBaseSchema(context.namespace, title, statement);\n\t\t\t\t\t\tJsonSchemaBuilder.buildEnumSchema(schema, constValues);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst mappedType = JsonSchemaBuilder.mapTypeNodeToSchema(boundContext, statement.type);\n\t\t\t\t\t\tif (mappedType) {\n\t\t\t\t\t\t\tschema = JsonSchemaBuilder.buildBaseSchema(context.namespace, title, statement);\n\t\t\t\t\t\t\tObject.assign(schema, mappedType);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// enum Color { Red = \"red\", Blue = \"blue\" } (native enum declaration)\n\t\t\t} else if (ts.isEnumDeclaration(statement)) {\n\t\t\t\ttitle = StringHelper.stripPrefix(statement.name.text);\n\t\t\t\tconst enumValues = Enum.extractEnumValuesFromEnumDeclaration(statement);\n\t\t\t\tif (enumValues && enumValues.length > 0) {\n\t\t\t\t\tschema = JsonSchemaBuilder.buildBaseSchema(context.namespace, title, statement);\n\t\t\t\t\tJsonSchemaBuilder.buildEnumSchema(schema, enumValues);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst activeDisallowedType = context.activeDisallowedType as\n\t\t\t\t| {\n\t\t\t\t\t\tdisallowedTypeName: string;\n\t\t\t\t\t\tpropertyName: string;\n\t\t\t\t\t\tenclosingObjectName: string;\n\t\t\t\t }\n\t\t\t\t| undefined;\n\t\t\tif (activeDisallowedType) {\n\t\t\t\tDiagnosticReporter.report(\n\t\t\t\t\tcontext,\n\t\t\t\t\tstatement,\n\t\t\t\t\t\"jsonSchemaBuilder.diagnostic.excludedEnclosingObjectDisallowedType\",\n\t\t\t\t\t{\n\t\t\t\t\t\tdisallowedTypeName: activeDisallowedType.disallowedTypeName,\n\t\t\t\t\t\tenclosingObjectName: activeDisallowedType.enclosingObjectName,\n\t\t\t\t\t\tpropertyName: activeDisallowedType.propertyName\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tcontext.activeDisallowedType = undefined;\n\t\t\t} else if (title && schema) {\n\t\t\t\tconst mappedSchema = ObjectHelper.removeEmptyProperties(\n\t\t\t\t\tObjectTransformer.normalizeSchemaDescriptions(schema as IJsonSchema)\n\t\t\t\t);\n\t\t\t\tpackageSchemaEntries[title] = mappedSchema;\n\t\t\t\tif (!parsedTitles.includes(title)) {\n\t\t\t\t\tparsedTitles.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const statement of sourceFile.statements) {\n\t\t\t// import { Foo } from \"./module.js\" (re-scan imports to process any newly visible schemas)\n\t\t\tif (ts.isImportDeclaration(statement) && ts.isStringLiteral(statement.moduleSpecifier)) {\n\t\t\t\tconst importPath = statement.moduleSpecifier.text;\n\t\t\t\tif (importPath.startsWith(\".\")) {\n\t\t\t\t\tconst resolvedImportPath = FileUtils.resolveImportSourceFilePath(\n\t\t\t\t\t\tsourceFilePath,\n\t\t\t\t\t\timportPath\n\t\t\t\t\t);\n\t\t\t\t\tif (resolvedImportPath) {\n\t\t\t\t\t\tconst importedSource = FileUtils.readFile(resolvedImportPath);\n\t\t\t\t\t\tif (importedSource) {\n\t\t\t\t\t\t\tconst importedTitles = JsonSchemaBuilder.parseAllObjectSchemas(\n\t\t\t\t\t\t\t\tcontext,\n\t\t\t\t\t\t\t\tresolvedImportPath,\n\t\t\t\t\t\t\t\timportedSource,\n\t\t\t\t\t\t\t\tvisitedFiles\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tfor (const importedTitle of importedTitles) {\n\t\t\t\t\t\t\t\tif (!parsedTitles.includes(importedTitle)) {\n\t\t\t\t\t\t\t\t\tparsedTitles.push(importedTitle);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tcontext.activeSourceFile = previousSourceFile;\n\t\treturn parsedTitles;\n\t}\n\n\t/**\n\t * Apply @json-schema tags from JSDoc to a schema object.\n\t * @param schema The schema to expand.\n\t * @param node The node to inspect for tags.\n\t * @throws GeneralError Thrown when a tag key is not supported by IJsonSchema.\n\t */\n\tpublic static applyJsonSchemaTags(schema: Partial<IJsonSchema>, node: ts.Node): void {\n\t\tconst defaultTagComment = JsDoc.getNodeTagComment(node, \"default\");\n\t\tif (defaultTagComment !== undefined && schema.default === undefined) {\n\t\t\tschema.default = JsDoc.parseTagValue(defaultTagComment);\n\t\t}\n\n\t\tconst tags = JsDoc.getNodeTags(node, \"json-schema\");\n\t\tfor (const [rawKey, rawValue] of Object.entries(tags)) {\n\t\t\tconst schemaKey = JsonSchemaBuilder.mapJsonSchemaTagKey(rawKey);\n\t\t\tif (!JsonSchemaBuilder.isAllowedJsonSchemaTagKey(schemaKey)) {\n\t\t\t\tthrow new GeneralError(JsonSchemaBuilder.CLASS_NAME, \"invalidJsonSchemaTagKey\", {\n\t\t\t\t\trawKey,\n\t\t\t\t\tschemaKey\n\t\t\t\t});\n\t\t\t}\n\t\t\tconst parsedValue = JsDoc.parseTagValue(rawValue);\n\t\t\tObjectHelper.propertySet(schema, schemaKey, parsedValue);\n\t\t}\n\t}\n\n\t/**\n\t * Determine whether a mapped @json-schema tag key is supported.\n\t * @param key The mapped schema key.\n\t * @returns True if the key is supported.\n\t */\n\tpublic static isAllowedJsonSchemaTagKey(key: string): boolean {\n\t\treturn JsonSchemaTagNames.includes(key);\n\t}\n\n\t/**\n\t * Build the base schema with common properties.\n\t * @param namespace The namespace for generated schema id.\n\t * @param title The schema title.\n\t * @param statement The type statement node.\n\t * @returns The base schema to be expanded.\n\t */\n\tpublic static buildBaseSchema(\n\t\tnamespace: string,\n\t\ttitle: string,\n\t\tstatement: ts.Node\n\t): Partial<IJsonSchema> {\n\t\tconst schema: Partial<IJsonSchema> = {\n\t\t\t$schema: JsonSchemaBuilder.SCHEMA_VERSION,\n\t\t\t$id: `${namespace}${title}`,\n\t\t\ttitle\n\t\t};\n\n\t\tconst description = JsDoc.getNodeJsDocDescription(statement);\n\t\tif (description) {\n\t\t\tschema.description = description;\n\t\t}\n\n\t\tJsonSchemaBuilder.applyJsonSchemaTags(schema, statement);\n\t\treturn schema;\n\t}\n\n\t/**\n\t * Add enum information to a schema.\n\t * @param schema The schema to expand.\n\t * @param entries The enum entries.\n\t */\n\tpublic static buildEnumSchema(\n\t\tschema: Partial<IJsonSchema>,\n\t\tentries: { value: string | number; description?: string }[]\n\t): void {\n\t\tschema.oneOf = entries.map(entry => ({\n\t\t\tconst: entry.value,\n\t\t\tdescription: entry.description\n\t\t}));\n\t}\n\n\t/**\n\t * Build an object schema from interface or type literal members.\n\t * @param context The generation context.\n\t * @param schema The schema to expand.\n\t * @param members The members to process.\n\t */\n\tpublic static buildObjectSchema(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tschema: Partial<IJsonSchema>,\n\t\tmembers: ts.NodeArray<ts.TypeElement>\n\t): void {\n\t\tconst { properties, required, patternProperties, additionalProperties, propertyNames } =\n\t\t\tJsonSchemaBuilder.buildObjectMembersSchema(context, members);\n\t\tschema.type = \"object\";\n\t\tif (Object.keys(properties).length > 0) {\n\t\t\tschema.properties = properties;\n\t\t}\n\t\tif (patternProperties) {\n\t\t\tschema.patternProperties = patternProperties;\n\t\t}\n\t\tif (propertyNames) {\n\t\t\tschema.propertyNames = propertyNames;\n\t\t}\n\t\tif (additionalProperties) {\n\t\t\tschema.additionalProperties = additionalProperties;\n\t\t}\n\t\tif (required.length > 0) {\n\t\t\tschema.required = required;\n\t\t}\n\t}\n\n\t/**\n\t * Build property schemas and required list from type members.\n\t * @param context The generation context.\n\t * @param members The members to process.\n\t * @returns The object property schema map and required list.\n\t */\n\tpublic static buildObjectMembersSchema(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tmembers: ts.NodeArray<ts.TypeElement>\n\t): {\n\t\tproperties: { [key: string]: IJsonSchema };\n\t\trequired: string[];\n\t\tpatternProperties?: { [pattern: string]: IJsonSchema };\n\t\tadditionalProperties?: IJsonSchema;\n\t\tpropertyNames?: IJsonSchema;\n\t} {\n\t\tconst properties: { [key: string]: IJsonSchema } = {};\n\t\tconst required: string[] = [];\n\t\tconst indexSignatureSchemas: IJsonSchema[] = [];\n\t\tconst patternPropertySchemas: { pattern: string; schema: IJsonSchema }[] = [];\n\n\t\tfor (const member of members) {\n\t\t\tif (context.activeDisallowedType) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// prop: string or prop?: string (property signature member)\n\t\t\tif (ts.isPropertySignature(member) && member.type) {\n\t\t\t\tif (JsonSchemaBuilder.isSymbolTypeNode(member.type)) {\n\t\t\t\t\tDiagnosticReporter.report(\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t\tmember,\n\t\t\t\t\t\t\"jsonSchemaBuilder.diagnostic.symbolValuedProperty\",\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpropertyName: member.name.getText()\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tconst isMemberTypeAllowed = JsonSchemaBuilder.checkTypeNodeAllowed(\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t\tmember.type,\n\t\t\t\t\t\tmember.name.getText(),\n\t\t\t\t\t\tcontext.activeEnclosingObjectName\n\t\t\t\t\t);\n\t\t\t\t\tif (isMemberTypeAllowed && JsonSchemaBuilder.isFunctionPropertyType(member.type)) {\n\t\t\t\t\t\tDiagnosticReporter.report(\n\t\t\t\t\t\t\tcontext,\n\t\t\t\t\t\t\tmember,\n\t\t\t\t\t\t\t\"jsonSchemaBuilder.diagnostic.functionTypedProperty\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpropertyName: member.name.getText()\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if (isMemberTypeAllowed) {\n\t\t\t\t\t\tconst memberName = member.name\n\t\t\t\t\t\t\t? JsonSchemaBuilder.extractPropertyName(context, member.name)\n\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\t\tconst memberTypeSchema = memberName\n\t\t\t\t\t\t\t? JsonSchemaBuilder.mapMemberTypeToSchema(context, member.type)\n\t\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\t\tif (memberName && memberTypeSchema) {\n\t\t\t\t\t\t\tconst memberDescription = JsDoc.getNodeJsDocDescription(member);\n\t\t\t\t\t\t\tif (memberDescription) {\n\t\t\t\t\t\t\t\tmemberTypeSchema.description = memberDescription;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tJsonSchemaBuilder.applyJsonSchemaTags(memberTypeSchema, member);\n\t\t\t\t\t\t\tproperties[memberName] = ObjectHelper.removeEmptyProperties(memberTypeSchema);\n\t\t\t\t\t\t\tif (!member.questionToken) {\n\t\t\t\t\t\t\t\trequired.push(memberName);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// [key: string]: Value (index signature member)\n\t\t\tif (ts.isIndexSignatureDeclaration(member)) {\n\t\t\t\tconst valueTypeSchema = member.type\n\t\t\t\t\t? (JsonSchemaBuilder.mapTypeNodeToSchema(context, member.type) ?? {})\n\t\t\t\t\t: {};\n\t\t\t\tif (IndexSignaturePatternResolver.isSupportedIndexSignature(member)) {\n\t\t\t\t\tindexSignatureSchemas.push(valueTypeSchema);\n\t\t\t\t} else {\n\t\t\t\t\tconst pattern = IndexSignaturePatternResolver.extractIndexSignaturePattern(\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t\tmember,\n\t\t\t\t\t\t(boundContext, typeName) =>\n\t\t\t\t\t\t\tJsonSchemaBuilder.getTypeParameterBinding(boundContext, typeName)\n\t\t\t\t\t);\n\t\t\t\t\tif (pattern) {\n\t\t\t\t\t\tpatternPropertySchemas.push({ pattern, schema: valueTypeSchema });\n\t\t\t\t\t} else {\n\t\t\t\t\t\tDiagnosticReporter.report(\n\t\t\t\t\t\t\tcontext,\n\t\t\t\t\t\t\tmember,\n\t\t\t\t\t\t\t\"jsonSchemaBuilder.diagnostic.unsupportedIndexSignature\",\n\t\t\t\t\t\t\t{ keyType: member.parameters[0]?.type?.getText() ?? \"unknown\" }\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!ts.isPropertySignature(member) && !ts.isIndexSignatureDeclaration(member)) {\n\t\t\t\t// any other member kind (method signatures, call signatures, etc.) is reported and skipped\n\t\t\t\tDiagnosticReporter.report(\n\t\t\t\t\tcontext,\n\t\t\t\t\tmember,\n\t\t\t\t\t\"jsonSchemaBuilder.diagnostic.unsupportedTypeElementMember\",\n\t\t\t\t\t{ kind: ts.SyntaxKind[member.kind] }\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst uniqueIndexSignatureSchemas = indexSignatureSchemas.filter((schema, index, schemas) => {\n\t\t\tconst schemaKey = JsonHelper.canonicalize(schema);\n\t\t\treturn schemas.findIndex(s => JsonHelper.canonicalize(s) === schemaKey) === index;\n\t\t});\n\n\t\tlet additionalProperties: IJsonSchema | undefined;\n\t\tif (uniqueIndexSignatureSchemas.length === 1) {\n\t\t\tadditionalProperties = uniqueIndexSignatureSchemas[0];\n\t\t} else if (uniqueIndexSignatureSchemas.length > 1) {\n\t\t\tadditionalProperties = { anyOf: uniqueIndexSignatureSchemas };\n\t\t}\n\n\t\tconst patternProperties = JsonSchemaBuilder.mergePatternPropertySchemas(patternPropertySchemas);\n\n\t\tlet propertyNames: IJsonSchema | undefined;\n\t\tif (patternPropertySchemas.length > 0 && uniqueIndexSignatureSchemas.length === 0) {\n\t\t\tconst staticKeys = Object.keys(properties);\n\t\t\tconst patternSchemas: IJsonSchema[] = Object.keys(patternProperties ?? {}).map(p => ({\n\t\t\t\tpattern: p\n\t\t\t}));\n\t\t\tif (staticKeys.length === 0) {\n\t\t\t\tpropertyNames = patternSchemas.length === 1 ? patternSchemas[0] : { anyOf: patternSchemas };\n\t\t\t} else {\n\t\t\t\tpropertyNames = { anyOf: [{ enum: staticKeys }, ...patternSchemas] };\n\t\t\t}\n\t\t}\n\n\t\treturn { properties, required, patternProperties, additionalProperties, propertyNames };\n\t}\n\n\t/**\n\t * Build an object schema from a type literal node.\n\t * @param context The generation context.\n\t * @param typeNode The type literal node.\n\t * @returns The object schema.\n\t */\n\tpublic static buildTypeLiteralSchema(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeLiteralNode\n\t): IJsonSchema {\n\t\tconst { properties, required, patternProperties, additionalProperties, propertyNames } =\n\t\t\tJsonSchemaBuilder.buildObjectMembersSchema(context, typeNode.members);\n\t\treturn {\n\t\t\ttype: \"object\",\n\t\t\tproperties: Object.keys(properties).length > 0 ? properties : undefined,\n\t\t\trequired: required.length > 0 ? required : undefined,\n\t\t\tpatternProperties,\n\t\t\tpropertyNames,\n\t\t\tadditionalProperties\n\t\t};\n\t}\n\n\t/**\n\t * Merge pattern property schemas by pattern, deduplicating equivalent branches.\n\t * @param patternPropertySchemas Pattern and schema entries to merge.\n\t * @returns Merged patternProperties map.\n\t */\n\tpublic static mergePatternPropertySchemas(\n\t\tpatternPropertySchemas: { pattern: string; schema: IJsonSchema }[]\n\t): { [pattern: string]: IJsonSchema } | undefined {\n\t\tif (patternPropertySchemas.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst groupedSchemas: { [pattern: string]: IJsonSchema[] } = {};\n\t\tfor (const patternPropertySchema of patternPropertySchemas) {\n\t\t\tgroupedSchemas[patternPropertySchema.pattern] ??= [];\n\t\t\tgroupedSchemas[patternPropertySchema.pattern].push(patternPropertySchema.schema);\n\t\t}\n\n\t\tconst mergedPatternProperties: { [pattern: string]: IJsonSchema } = {};\n\t\tfor (const [pattern, schemas] of Object.entries(groupedSchemas)) {\n\t\t\tconst uniqueSchemas = schemas.filter((schema, index, allSchemas) => {\n\t\t\t\tconst schemaKey = JsonHelper.canonicalize(schema);\n\t\t\t\treturn allSchemas.findIndex(s => JsonHelper.canonicalize(s) === schemaKey) === index;\n\t\t\t});\n\n\t\t\tmergedPatternProperties[pattern] =\n\t\t\t\tuniqueSchemas.length === 1 ? uniqueSchemas[0] : { anyOf: uniqueSchemas };\n\t\t}\n\n\t\treturn mergedPatternProperties;\n\t}\n\n\t/**\n\t * Map a property type node to schema.\n\t * @param context The generation context.\n\t * @param typeNode The member type node.\n\t * @returns The mapped member schema.\n\t */\n\tpublic static mapMemberTypeToSchema(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeNode\n\t): IJsonSchema | undefined {\n\t\t// [string, number] or [label: string, ...rest: string[]] (tuple type)\n\t\tif (ts.isTupleTypeNode(typeNode)) {\n\t\t\treturn JsonSchemaBuilder.mapTupleTypeToSchema(context, typeNode);\n\t\t}\n\n\t\t// typeof variable (type query, resolves the type of a declared value)\n\t\tif (ts.isTypeQueryNode(typeNode)) {\n\t\t\treturn ImportTypeQuerySchemaResolver.mapTypeQueryNodeToSchema(context, typeNode);\n\t\t}\n\n\t\t// { prop: string } (inline object type literal as a member type)\n\t\tif (ts.isTypeLiteralNode(typeNode)) {\n\t\t\treturn JsonSchemaBuilder.buildTypeLiteralSchema(context, typeNode);\n\t\t}\n\n\t\treturn JsonSchemaBuilder.mapTypeNodeToSchema(context, typeNode);\n\t}\n\n\t/**\n\t * Map TypeScript type nodes to JSON schema.\n\t * @param context The generation context.\n\t * @param typeNode The node to process.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapTypeNodeToSchema(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeNode\n\t): IJsonSchema | undefined {\n\t\tif (\n\t\t\t!JsonSchemaBuilder.checkTypeNodeAllowed(\n\t\t\t\tcontext,\n\t\t\t\ttypeNode,\n\t\t\t\tundefined,\n\t\t\t\tcontext.activeEnclosingObjectName\n\t\t\t)\n\t\t) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// readonly T[] or keyof T (type operator node)\n\t\tif (ts.isTypeOperatorNode(typeNode)) {\n\t\t\tif (typeNode.operator === ts.SyntaxKind.ReadonlyKeyword) {\n\t\t\t\treturn JsonSchemaBuilder.mapTypeNodeToSchema(context, typeNode.type);\n\t\t\t}\n\n\t\t\tif (typeNode.operator === ts.SyntaxKind.KeyOfKeyword) {\n\t\t\t\tconst keyofKeys = JsonSchemaBuilder.extractKeyofTypeKeys(context, typeNode.type);\n\t\t\t\tif (keyofKeys.length > 0) {\n\t\t\t\t\treturn { enum: keyofKeys };\n\t\t\t\t}\n\t\t\t\tif (JsonSchemaBuilder.isGenericKeyofOperand(context, typeNode.type)) {\n\t\t\t\t\treturn {};\n\t\t\t\t}\n\t\t\t\tDiagnosticReporter.report(\n\t\t\t\t\tcontext,\n\t\t\t\t\ttypeNode,\n\t\t\t\t\t\"jsonSchemaBuilder.diagnostic.unresolvedKeyofOperand\",\n\t\t\t\t\t{\n\t\t\t\t\t\toperand: typeNode.type.getText()\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\treturn {};\n\t\t\t}\n\t\t}\n\n\t\t// T[\"key\"] (indexed access type)\n\t\tif (ts.isIndexedAccessTypeNode(typeNode)) {\n\t\t\treturn JsonSchemaBuilder.mapIndexedAccessTypeToSchema(context, typeNode);\n\t\t}\n\n\t\t// `prefix-${T}` (template literal type)\n\t\tif (ts.isTemplateLiteralTypeNode(typeNode)) {\n\t\t\treturn JsonSchemaBuilder.mapTemplateLiteralTypeToSchema(context, typeNode);\n\t\t}\n\n\t\t// { [K in keyof T]: T[K] } (mapped type)\n\t\tif (ts.isMappedTypeNode(typeNode)) {\n\t\t\treturn JsonSchemaBuilder.mapMappedTypeToSchema(context, typeNode);\n\t\t}\n\n\t\t// T extends U ? X : Y (conditional type)\n\t\tif (ts.isConditionalTypeNode(typeNode)) {\n\t\t\treturn JsonSchemaBuilder.mapConditionalTypeToSchema(context, typeNode);\n\t\t}\n\n\t\t// (string | number) (parenthesised type, unwrap and recurse)\n\t\tif (ts.isParenthesizedTypeNode(typeNode)) {\n\t\t\treturn JsonSchemaBuilder.mapTypeNodeToSchema(context, typeNode.type);\n\t\t}\n\n\t\t// [string, number] or [label: string, ...rest: string[]] (tuple type)\n\t\tif (ts.isTupleTypeNode(typeNode)) {\n\t\t\treturn JsonSchemaBuilder.mapTupleTypeToSchema(context, typeNode);\n\t\t}\n\n\t\t// unknown (open schema, accepts any value)\n\t\tif (typeNode.kind === ts.SyntaxKind.UnknownKeyword) {\n\t\t\treturn {};\n\t\t}\n\t\t// any (open schema, accepts any value)\n\t\tif (typeNode.kind === ts.SyntaxKind.AnyKeyword) {\n\t\t\treturn {};\n\t\t}\n\t\t// never (empty schema that rejects all values)\n\t\tif (typeNode.kind === ts.SyntaxKind.NeverKeyword) {\n\t\t\treturn { not: {} };\n\t\t}\n\t\tif (typeNode.kind === ts.SyntaxKind.UndefinedKeyword) {\n\t\t\treturn undefined;\n\t\t}\n\t\tif (typeNode.kind === ts.SyntaxKind.VoidKeyword) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// string (string keyword type)\n\t\tif (typeNode.kind === ts.SyntaxKind.StringKeyword) {\n\t\t\treturn { type: \"string\" };\n\t\t}\n\t\t// number (number keyword type)\n\t\tif (typeNode.kind === ts.SyntaxKind.NumberKeyword) {\n\t\t\treturn { type: \"number\" };\n\t\t}\n\t\t// boolean (boolean keyword type)\n\t\tif (typeNode.kind === ts.SyntaxKind.BooleanKeyword) {\n\t\t\treturn { type: \"boolean\" };\n\t\t}\n\t\t// object (object keyword type)\n\t\tif (typeNode.kind === ts.SyntaxKind.ObjectKeyword) {\n\t\t\treturn { type: \"object\" };\n\t\t}\n\t\t// null (null keyword type)\n\t\tif (typeNode.kind === ts.SyntaxKind.NullKeyword) {\n\t\t\treturn { type: \"null\" };\n\t\t}\n\n\t\t// string[] or Foo[] (array type)\n\t\tif (ts.isArrayTypeNode(typeNode)) {\n\t\t\tconst elementType = JsonSchemaBuilder.mapTypeNodeToSchema(context, typeNode.elementType);\n\t\t\tif (elementType) {\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"array\",\n\t\t\t\t\titems: elementType\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\t// MyType<T> or Namespace.MyType (named type reference, possibly with type arguments)\n\t\tif (ts.isTypeReferenceNode(typeNode)) {\n\t\t\tconst typeName = ts.isIdentifier(typeNode.typeName)\n\t\t\t\t? typeNode.typeName.text\n\t\t\t\t: typeNode.typeName.right.text;\n\t\t\tconst typeParameterBinding = JsonSchemaBuilder.getTypeParameterBinding(context, typeName);\n\t\t\tif (typeParameterBinding !== undefined) {\n\t\t\t\treturn typeParameterBinding\n\t\t\t\t\t? JsonSchemaBuilder.mapTypeNodeToSchema(context, typeParameterBinding)\n\t\t\t\t\t: {};\n\t\t\t}\n\t\t\tif (typeName === \"undefined\") {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tif (typeName === \"Boolean\") {\n\t\t\t\treturn { type: \"boolean\" };\n\t\t\t}\n\t\t\tif (typeName === \"Object\") {\n\t\t\t\treturn { type: \"object\" };\n\t\t\t}\n\t\t\tif (typeName === \"Map\") {\n\t\t\t\tconst mapValueType = typeNode.typeArguments?.[1];\n\t\t\t\tconst additionalProperties = mapValueType\n\t\t\t\t\t? (JsonSchemaBuilder.mapTypeNodeToSchema(context, mapValueType) ?? {})\n\t\t\t\t\t: {};\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"object\",\n\t\t\t\t\tadditionalProperties\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (typeName === \"Set\") {\n\t\t\t\tconst setItemType = typeNode.typeArguments?.[0];\n\t\t\t\tconst items = setItemType\n\t\t\t\t\t? (JsonSchemaBuilder.mapTypeNodeToSchema(context, setItemType) ?? {})\n\t\t\t\t\t: {};\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"array\",\n\t\t\t\t\titems,\n\t\t\t\t\tuniqueItems: true\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (typeName === \"ReadonlyArray\") {\n\t\t\t\tconst arrayItemType = typeNode.typeArguments?.[0];\n\t\t\t\tconst items = arrayItemType\n\t\t\t\t\t? (JsonSchemaBuilder.mapTypeNodeToSchema(context, arrayItemType) ?? {})\n\t\t\t\t\t: {};\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"array\",\n\t\t\t\t\titems\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (Constants.ARRAY_NUMBER_TYPE_NAMES.includes(typeName)) {\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"array\",\n\t\t\t\t\titems: { type: \"number\" }\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst utilityHandler = JsonSchemaBuilder._utilityTypeHandlers[typeName];\n\t\t\tif (utilityHandler) {\n\t\t\t\treturn utilityHandler(context, typeNode);\n\t\t\t}\n\n\t\t\tif (Constants.UNSUPPORTED_UTILITY_TYPE_NAMES.includes(typeName)) {\n\t\t\t\tDiagnosticReporter.report(\n\t\t\t\t\tcontext,\n\t\t\t\t\ttypeNode,\n\t\t\t\t\t\"jsonSchemaBuilder.diagnostic.unsupportedUtilityType\",\n\t\t\t\t\t{ utilityType: typeName }\n\t\t\t\t);\n\t\t\t\treturn {};\n\t\t\t}\n\n\t\t\tconst title = StringHelper.stripPrefix(typeName);\n\t\t\tconst importedModuleSpecifier = context.activeSourceFile\n\t\t\t\t? JsonSchemaBuilder.findImportedModuleSpecifier(\n\t\t\t\t\t\tcontext.activeSourceFile,\n\t\t\t\t\t\ttypeNode,\n\t\t\t\t\t\ttypeName\n\t\t\t\t\t)\n\t\t\t\t: undefined;\n\t\t\tif (!importedModuleSpecifier || importedModuleSpecifier.startsWith(\".\")) {\n\t\t\t\tconst mappedReference = JsonSchemaBuilder.resolveReferenceMappingTarget(\n\t\t\t\t\tcontext,\n\t\t\t\t\t\"\",\n\t\t\t\t\ttypeName\n\t\t\t\t);\n\t\t\t\tif (mappedReference?.schemaId) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t$ref: mappedReference.schemaId\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst resolvedImportedSchemaId = JsonSchemaBuilder.resolveExternalTypeReferenceSchemaId(\n\t\t\t\tcontext,\n\t\t\t\ttypeNode,\n\t\t\t\ttypeName\n\t\t\t);\n\t\t\tconst existingSchemaId = resolvedImportedSchemaId\n\t\t\t\t? undefined\n\t\t\t\t: JsonSchemaBuilder.findExistingSchemaIdByTitle(context, title);\n\t\t\treturn {\n\t\t\t\t$ref: resolvedImportedSchemaId ?? existingSchemaId ?? `${context.namespace}${title}`\n\t\t\t};\n\t\t}\n\n\t\t// import(\"./module.js\").TypeName (import type node)\n\t\tif (ts.isImportTypeNode(typeNode)) {\n\t\t\treturn ImportTypeQuerySchemaResolver.mapImportTypeNodeToSchema(context, typeNode);\n\t\t}\n\n\t\t// { prop: string } (inline object type literal)\n\t\tif (ts.isTypeLiteralNode(typeNode)) {\n\t\t\treturn JsonSchemaBuilder.buildTypeLiteralSchema(context, typeNode);\n\t\t}\n\n\t\t// \"hello\" or 42 or true or false (literal type node wrapping a literal keyword or value)\n\t\tif (ts.isLiteralTypeNode(typeNode)) {\n\t\t\t// \"hello\" (string literal type)\n\t\t\tif (ts.isStringLiteral(typeNode.literal)) {\n\t\t\t\treturn { const: typeNode.literal.text };\n\t\t\t}\n\t\t\t// 42 (numeric literal type)\n\t\t\tif (ts.isNumericLiteral(typeNode.literal)) {\n\t\t\t\treturn { const: Number(typeNode.literal.text) };\n\t\t\t}\n\t\t\tif (typeNode.literal.kind === ts.SyntaxKind.NullKeyword) {\n\t\t\t\t// null (null keyword inside a literal type node)\n\t\t\t\treturn { type: \"null\" };\n\t\t\t}\n\t\t\tif (typeNode.literal.kind === ts.SyntaxKind.TrueKeyword) {\n\t\t\t\t// true (boolean true literal type — distinct from the boolean keyword type)\n\t\t\t\treturn { const: true };\n\t\t\t}\n\t\t\tif (typeNode.literal.kind === ts.SyntaxKind.FalseKeyword) {\n\t\t\t\t// false (boolean false literal type — distinct from the boolean keyword type)\n\t\t\t\treturn { const: false };\n\t\t\t}\n\t\t}\n\n\t\t// string | number | null (union type)\n\t\tif (ts.isUnionTypeNode(typeNode)) {\n\t\t\tconst mappedUnionTypes = typeNode.types\n\t\t\t\t.map(unionType => JsonSchemaBuilder.mapTypeNodeToSchema(context, unionType))\n\t\t\t\t.filter((mappedType): mappedType is IJsonSchema => mappedType !== undefined);\n\n\t\t\tif (mappedUnionTypes.length > 0) {\n\t\t\t\tif (mappedUnionTypes.length === 1) {\n\t\t\t\t\treturn mappedUnionTypes[0];\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\tJsonSchemaBuilder.isNeverDiscriminatedObjectUnion(\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t\ttypeNode.types,\n\t\t\t\t\t\tmappedUnionTypes\n\t\t\t\t\t) ||\n\t\t\t\t\tJsonSchemaBuilder.isLiteralTagDiscriminatedObjectUnion(context, mappedUnionTypes) ||\n\t\t\t\t\tJsonSchemaBuilder.isDisjointPrimitiveKeywordUnion(\n\t\t\t\t\t\ttypeNode,\n\t\t\t\t\t\ttypeNode.types,\n\t\t\t\t\t\tmappedUnionTypes\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\toneOf: mappedUnionTypes\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tanyOf: mappedUnionTypes\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\t// TypeA & TypeB (intersection type, try to merge into a single object schema)\n\t\tif (ts.isIntersectionTypeNode(typeNode)) {\n\t\t\tconst mappedIntersectionTypes = typeNode.types\n\t\t\t\t.map(intersectionType => JsonSchemaBuilder.mapTypeNodeToSchema(context, intersectionType))\n\t\t\t\t.filter((mappedType): mappedType is IJsonSchema => mappedType !== undefined);\n\n\t\t\tif (mappedIntersectionTypes.length > 0) {\n\t\t\t\tconst mergedIntersectionObjectSchema =\n\t\t\t\t\tIntersectionSchemaMerger.mergeIntersectionObjectSchemas(\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t\tmappedIntersectionTypes,\n\t\t\t\t\t\tschema => ObjectTransformer.toInlineUtilityObjectSchema(schema)\n\t\t\t\t\t);\n\t\t\t\tif (mergedIntersectionObjectSchema) {\n\t\t\t\t\treturn mergedIntersectionObjectSchema;\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tallOf: mappedIntersectionTypes\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\t// typeof variable (type query, treated as an open schema)\n\t\tif (ts.isTypeQueryNode(typeNode)) {\n\t\t\treturn ImportTypeQuerySchemaResolver.mapTypeQueryNodeToSchema(context, typeNode);\n\t\t}\n\n\t\tDiagnosticReporter.report(context, typeNode, \"jsonSchemaBuilder.diagnostic.unmappedTypeNode\", {\n\t\t\tkind: ts.SyntaxKind[typeNode.kind]\n\t\t});\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Determine whether a union of primitive keyword branches is pairwise disjoint.\n\t * @param unionTypeNode The union node being mapped.\n\t * @param unionTypeNodes The original union branch type nodes.\n\t * @param unionSchemas The mapped union branch schemas.\n\t * @returns True if every branch is a primitive keyword schema and no branches overlap.\n\t */\n\tpublic static isDisjointPrimitiveKeywordUnion(\n\t\tunionTypeNode: ts.UnionTypeNode,\n\t\tunionTypeNodes: ts.NodeArray<ts.TypeNode>,\n\t\tunionSchemas: IJsonSchema[]\n\t): boolean {\n\t\tif (unionSchemas.length < 2 || unionSchemas.length !== unionTypeNodes.length) {\n\t\t\treturn false;\n\t\t}\n\n\t\tlet unionContainer: ts.Node = unionTypeNode;\n\t\twhile (ts.isParenthesizedTypeNode(unionContainer.parent)) {\n\t\t\tunionContainer = unionContainer.parent;\n\t\t}\n\n\t\tif (\n\t\t\t!ts.isTypeAliasDeclaration(unionContainer.parent) ||\n\t\t\tunionContainer.parent.type !== unionContainer\n\t\t) {\n\t\t\t// Keep nested/property unions as anyOf; only top-level alias unions are promoted.\n\t\t\treturn false;\n\t\t}\n\n\t\tconst primitiveKinds = new Set<ts.SyntaxKind>([\n\t\t\tts.SyntaxKind.StringKeyword,\n\t\t\tts.SyntaxKind.NumberKeyword,\n\t\t\tts.SyntaxKind.BooleanKeyword,\n\t\t\tts.SyntaxKind.NullKeyword\n\t\t]);\n\n\t\tif (!unionTypeNodes.every(unionBranchType => primitiveKinds.has(unionBranchType.kind))) {\n\t\t\t// Mixed or non-primitive unions can overlap in value space.\n\t\t\treturn false;\n\t\t}\n\n\t\tconst schemaTypeDomains = unionSchemas.map(schema => {\n\t\t\tif (schema.type === \"integer\") {\n\t\t\t\treturn \"number\";\n\t\t\t}\n\n\t\t\treturn Is.stringValue(schema.type) ? schema.type : undefined;\n\t\t});\n\n\t\tif (\n\t\t\tschemaTypeDomains.some(\n\t\t\t\tschemaType =>\n\t\t\t\t\tschemaType !== \"string\" &&\n\t\t\t\t\tschemaType !== \"number\" &&\n\t\t\t\t\tschemaType !== \"boolean\" &&\n\t\t\t\t\tschemaType !== \"null\"\n\t\t\t)\n\t\t) {\n\t\t\t// Only primitive keyword domains are considered disjoint enough for oneOf.\n\t\t\treturn false;\n\t\t}\n\n\t\t// oneOf is safe when every branch maps to a unique primitive domain.\n\t\treturn new Set(schemaTypeDomains).size === unionSchemas.length;\n\t}\n\n\t/**\n\t * Determine whether a union of schemas represents mutually exclusive object branches.\n\t * @param context The generation context.\n\t * @param unionTypeNodes The union branch type nodes for cross-checking with the mapped schemas.\n\t * @param unionSchemas The mapped union branch schemas.\n\t * @returns True if each branch is an object schema with a unique required key set.\n\t */\n\tpublic static isNeverDiscriminatedObjectUnion(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tunionTypeNodes: ts.NodeArray<ts.TypeNode>,\n\t\tunionSchemas: IJsonSchema[]\n\t): boolean {\n\t\tif (unionSchemas.length < 2 || unionSchemas.length !== unionTypeNodes.length) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst branchInfos: {\n\t\t\trequiredKeys: Set<string>;\n\t\t\tforbiddenKeys: Set<string>;\n\t\t}[] = [];\n\t\tlet hasNeverDiscriminator = false;\n\n\t\tfor (const unionTypeNode of unionTypeNodes) {\n\t\t\tconst branchMembers = JsonSchemaBuilder.resolveNeverDiscriminatorMembers(\n\t\t\t\tcontext,\n\t\t\t\tunionTypeNode\n\t\t\t);\n\t\t\tif (!branchMembers) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst branchInfo: {\n\t\t\t\trequiredKeys: Set<string>;\n\t\t\t\tforbiddenKeys: Set<string>;\n\t\t\t} = {\n\t\t\t\trequiredKeys: new Set<string>(),\n\t\t\t\tforbiddenKeys: new Set<string>()\n\t\t\t};\n\n\t\t\tfor (const member of branchMembers) {\n\t\t\t\tif (ts.isPropertySignature(member) && member.type && member.name) {\n\t\t\t\t\tconst propertyName = JsonSchemaBuilder.extractPropertyName(context, member.name);\n\t\t\t\t\tif (propertyName) {\n\t\t\t\t\t\tif (member.type.kind === ts.SyntaxKind.NeverKeyword) {\n\t\t\t\t\t\t\t// never marks a property as impossible in this branch.\n\t\t\t\t\t\t\tbranchInfo.forbiddenKeys.add(propertyName);\n\t\t\t\t\t\t\thasNeverDiscriminator = true;\n\t\t\t\t\t\t} else if (!member.questionToken) {\n\t\t\t\t\t\t\t// Required non-never keys are the positive branch signals.\n\t\t\t\t\t\t\tbranchInfo.requiredKeys.add(propertyName);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tbranchInfos.push(branchInfo);\n\t\t}\n\n\t\tif (!hasNeverDiscriminator) {\n\t\t\treturn false;\n\t\t}\n\n\t\tfor (const branchInfo of branchInfos) {\n\t\t\tif (branchInfo.requiredKeys.size === 0 && branchInfo.forbiddenKeys.size === 0) {\n\t\t\t\t// Require each branch to contribute at least one discriminating signal.\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tfor (let i = 0; i < branchInfos.length; i++) {\n\t\t\tfor (let j = i + 1; j < branchInfos.length; j++) {\n\t\t\t\tconst firstBranch = branchInfos[i];\n\t\t\t\tconst secondBranch = branchInfos[j];\n\n\t\t\t\tconst firstExcludesSecond = [...firstBranch.requiredKeys].some(requiredKey =>\n\t\t\t\t\tsecondBranch.forbiddenKeys.has(requiredKey)\n\t\t\t\t);\n\t\t\t\tconst secondExcludesFirst = [...secondBranch.requiredKeys].some(requiredKey =>\n\t\t\t\t\tfirstBranch.forbiddenKeys.has(requiredKey)\n\t\t\t\t);\n\n\t\t\t\tif (!firstExcludesSecond && !secondExcludesFirst) {\n\t\t\t\t\t// Branch pairs must be mutually exclusive in at least one direction.\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Determine whether object union branches are discriminated by a shared required literal tag.\n\t * @param context The generation context.\n\t * @param unionSchemas The mapped union branch schemas.\n\t * @returns True if the union can be safely represented as oneOf.\n\t */\n\tpublic static isLiteralTagDiscriminatedObjectUnion(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tunionSchemas: IJsonSchema[]\n\t): boolean {\n\t\tif (unionSchemas.length < 2) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst resolvedObjectSchemas = unionSchemas\n\t\t\t.map(schema => JsonSchemaBuilder.resolveLocalSchemaReference(context, schema) ?? schema)\n\t\t\t.filter(\n\t\t\t\t(\n\t\t\t\t\tschema\n\t\t\t\t): schema is IJsonSchema & {\n\t\t\t\t\tproperties: { [key: string]: IJsonSchema };\n\t\t\t\t\trequired: string[];\n\t\t\t\t} =>\n\t\t\t\t\tschema.type === \"object\" &&\n\t\t\t\t\tIs.object(schema.properties) &&\n\t\t\t\t\tIs.array<string>(schema.required)\n\t\t\t);\n\n\t\tif (resolvedObjectSchemas.length !== unionSchemas.length) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst requiredDiscriminatorKeys = resolvedObjectSchemas.map(objectSchema => {\n\t\t\tconst discriminators = new Map<string, unknown>();\n\n\t\t\tfor (const requiredKey of objectSchema.required) {\n\t\t\t\tconst propertySchema = objectSchema.properties[requiredKey];\n\t\t\t\tif (\n\t\t\t\t\tIs.object(propertySchema) &&\n\t\t\t\t\tObject.prototype.hasOwnProperty.call(propertySchema, \"const\")\n\t\t\t\t) {\n\t\t\t\t\tdiscriminators.set(requiredKey, propertySchema.const);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn discriminators;\n\t\t});\n\n\t\tconst candidateKeys = new Set<string>(requiredDiscriminatorKeys[0].keys());\n\t\tfor (const discriminatorMap of requiredDiscriminatorKeys.slice(1)) {\n\t\t\tfor (const candidateKey of [...candidateKeys]) {\n\t\t\t\tif (!discriminatorMap.has(candidateKey)) {\n\t\t\t\t\tcandidateKeys.delete(candidateKey);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const candidateKey of candidateKeys) {\n\t\t\tconst discriminatorValues = requiredDiscriminatorKeys.map(discriminatorMap =>\n\t\t\t\tJsonHelper.canonicalize(discriminatorMap.get(candidateKey))\n\t\t\t);\n\n\t\t\tif (new Set(discriminatorValues).size === unionSchemas.length) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Resolve branch members that can encode never-based discriminators.\n\t * @param context The generation context.\n\t * @param unionTypeNode The union branch type node.\n\t * @returns Type members for the branch when resolvable.\n\t */\n\tpublic static resolveNeverDiscriminatorMembers(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tunionTypeNode: ts.TypeNode\n\t): ts.NodeArray<ts.TypeElement> | undefined {\n\t\tconst findTypeMembersInSourceFile = (\n\t\t\tsourceFile: ts.SourceFile,\n\t\t\ttypeName: string\n\t\t): ts.NodeArray<ts.TypeElement> | undefined => {\n\t\t\tfor (const statement of sourceFile.statements) {\n\t\t\t\tif (ts.isInterfaceDeclaration(statement) && statement.name.text === typeName) {\n\t\t\t\t\treturn statement.members;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\tts.isTypeAliasDeclaration(statement) &&\n\t\t\t\t\tstatement.name.text === typeName &&\n\t\t\t\t\tts.isTypeLiteralNode(statement.type)\n\t\t\t\t) {\n\t\t\t\t\treturn statement.type.members;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t};\n\n\t\t// { discriminator: \"a\"; other: string } (inline type literal as union branch)\n\t\tif (ts.isTypeLiteralNode(unionTypeNode)) {\n\t\t\treturn unionTypeNode.members;\n\t\t}\n\n\t\t// BranchType (named type reference resolves to its declaration)\n\t\tif (!ts.isTypeReferenceNode(unionTypeNode)) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst sourceFile = context.activeSourceFile;\n\t\tif (!sourceFile) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// BranchType (plain identifier type name)\n\t\tconst typeName = ts.isIdentifier(unionTypeNode.typeName)\n\t\t\t? unionTypeNode.typeName.text\n\t\t\t: unionTypeNode.typeName.right.text;\n\n\t\tconst localMembers = findTypeMembersInSourceFile(sourceFile, typeName);\n\t\tif (localMembers) {\n\t\t\treturn localMembers;\n\t\t}\n\n\t\tconst importedTypeReference = JsonSchemaBuilder.findImportedTypeReference(context, typeName);\n\t\tif (!importedTypeReference?.moduleSpecifier.startsWith(\".\")) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst resolvedImportPath = JsonSchemaBuilder.resolveImportDeclarationSourceFile(\n\t\t\tsourceFile.fileName,\n\t\t\timportedTypeReference.moduleSpecifier\n\t\t);\n\t\tif (!resolvedImportPath) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst importedSource = FileUtils.readFile(resolvedImportPath);\n\t\tif (!importedSource) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst importedSourceFile = ts.createSourceFile(\n\t\t\tresolvedImportPath,\n\t\t\timportedSource,\n\t\t\tts.ScriptTarget.Latest,\n\t\t\ttrue\n\t\t);\n\n\t\treturn findTypeMembersInSourceFile(importedSourceFile, importedTypeReference.candidateTypeName);\n\t}\n\n\t/**\n\t * Resolve a local $ref schema to its stored schema definition.\n\t * @param context The generation context.\n\t * @param schema The schema that may contain a local reference.\n\t * @returns The resolved schema when available.\n\t */\n\tpublic static resolveLocalSchemaReference(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tschema: IJsonSchema\n\t): IJsonSchema | undefined {\n\t\tif (!schema.$ref?.startsWith(context.namespace)) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst schemaTitle = schema.$ref.slice(context.namespace.length);\n\t\treturn context.schemas[context.packageName]?.[schemaTitle];\n\t}\n\n\t/**\n\t * Resolve a property value from a const object declaration in an imported source file.\n\t * @param context The generation context.\n\t * @param objectName The name of the const object.\n\t * @param propertyName The name of the property to resolve.\n\t * @returns The resolved string or number value, or undefined if unresolvable.\n\t */\n\tpublic static resolveConstObjectProperty(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tobjectName: string,\n\t\tpropertyName: string\n\t): string | number | undefined {\n\t\tif (!context.activeSourceFile) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst importReference = JsonSchemaBuilder.findImportedValueReference(\n\t\t\tcontext.activeSourceFile,\n\t\t\tobjectName\n\t\t);\n\t\tif (!importReference) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst resolvedPath = JsonSchemaBuilder.resolveImportDeclarationSourceFile(\n\t\t\tcontext.activeSourceFile.fileName,\n\t\t\timportReference.moduleSpecifier\n\t\t);\n\t\tif (!resolvedPath) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst importedSource = FileUtils.readFile(resolvedPath);\n\t\tif (!importedSource) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst importedSourceFile = ts.createSourceFile(\n\t\t\tresolvedPath,\n\t\t\timportedSource,\n\t\t\tts.ScriptTarget.Latest,\n\t\t\ttrue\n\t\t);\n\n\t\tlet objDecl = importedSourceFile.statements\n\t\t\t// export const FOO = { ... } as const (variable statement)\n\t\t\t.filter((stmt): stmt is ts.VariableStatement => ts.isVariableStatement(stmt))\n\t\t\t.flatMap(stmt => [...stmt.declarationList.declarations])\n\t\t\t// FOO (plain identifier binding name)\n\t\t\t.find(decl => ts.isIdentifier(decl.name) && decl.name.text === importReference.importedName);\n\n\t\tobjDecl ??= JsonSchemaBuilder.findVariableDeclarationInModuleGraph(\n\t\t\tresolvedPath,\n\t\t\timportReference.importedName,\n\t\t\tnew Set<string>()\n\t\t);\n\n\t\tif (!objDecl) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst valueFromInitializer =\n\t\t\tJsonSchemaBuilder.extractConstObjectPropertyFromDeclarationInitializer(objDecl, propertyName);\n\t\tif (valueFromInitializer !== undefined) {\n\t\t\treturn valueFromInitializer;\n\t\t}\n\n\t\tif (objDecl.type) {\n\t\t\treturn JsonSchemaBuilder.extractConstObjectPropertyFromDeclarationType(\n\t\t\t\tobjDecl.type,\n\t\t\t\tpropertyName\n\t\t\t);\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Find a variable declaration by traversing import and export chains.\n\t * @param sourceFilePath The source file path to start from.\n\t * @param variableName The variable declaration name to find.\n\t * @param visitedFiles The file set already visited.\n\t * @returns The variable declaration when found.\n\t */\n\tpublic static findVariableDeclarationInModuleGraph(\n\t\tsourceFilePath: string,\n\t\tvariableName: string,\n\t\tvisitedFiles: Set<string>\n\t): ts.VariableDeclaration | undefined {\n\t\tconst normalizedSourceFilePath = FileUtils.normalizeFilePath(sourceFilePath);\n\t\tif (visitedFiles.has(normalizedSourceFilePath)) {\n\t\t\treturn undefined;\n\t\t}\n\t\tvisitedFiles.add(normalizedSourceFilePath);\n\n\t\tconst source = FileUtils.readFile(sourceFilePath);\n\t\tif (!source) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst sourceFile = ts.createSourceFile(sourceFilePath, source, ts.ScriptTarget.Latest, true);\n\n\t\tconst declaration = sourceFile.statements\n\t\t\t.filter((stmt): stmt is ts.VariableStatement => ts.isVariableStatement(stmt))\n\t\t\t.flatMap(stmt => [...stmt.declarationList.declarations])\n\t\t\t.find(decl => ts.isIdentifier(decl.name) && decl.name.text === variableName);\n\t\tif (declaration) {\n\t\t\treturn declaration;\n\t\t}\n\n\t\tconst compilerOptions: ts.CompilerOptions = {\n\t\t\tmodule: ts.ModuleKind.NodeNext,\n\t\t\tmoduleResolution: ts.ModuleResolutionKind.NodeNext,\n\t\t\ttarget: ts.ScriptTarget.ESNext,\n\t\t\tskipLibCheck: true\n\t\t};\n\n\t\tconst moduleSpecifiers = sourceFile.statements\n\t\t\t.filter(statement => ts.isExportDeclaration(statement) || ts.isImportDeclaration(statement))\n\t\t\t.flatMap(statement => {\n\t\t\t\tconst moduleSpecifier = statement.moduleSpecifier;\n\t\t\t\treturn moduleSpecifier && ts.isStringLiteral(moduleSpecifier) ? [moduleSpecifier.text] : [];\n\t\t\t});\n\n\t\tfor (const moduleSpecifier of moduleSpecifiers) {\n\t\t\tconst resolvedModulePath = ts.resolveModuleName(\n\t\t\t\tmoduleSpecifier,\n\t\t\t\tsourceFilePath,\n\t\t\t\tcompilerOptions,\n\t\t\t\tts.sys\n\t\t\t).resolvedModule?.resolvedFileName;\n\n\t\t\tif (resolvedModulePath) {\n\t\t\t\tconst declarationInModule = JsonSchemaBuilder.findVariableDeclarationInModuleGraph(\n\t\t\t\t\tresolvedModulePath,\n\t\t\t\t\tvariableName,\n\t\t\t\t\tvisitedFiles\n\t\t\t\t);\n\t\t\t\tif (declarationInModule) {\n\t\t\t\t\treturn declarationInModule;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Find an imported symbol reference by local identifier name.\n\t * @param sourceFile The source file to inspect.\n\t * @param localName The local identifier name.\n\t * @returns The module specifier and imported symbol name.\n\t */\n\tpublic static findImportedValueReference(\n\t\tsourceFile: ts.SourceFile,\n\t\tlocalName: string\n\t):\n\t\t| {\n\t\t\t\tmoduleSpecifier: string;\n\t\t\t\timportedName: string;\n\t\t }\n\t\t| undefined {\n\t\tfor (const statement of sourceFile.statements) {\n\t\t\tif (ts.isImportDeclaration(statement) && ts.isStringLiteral(statement.moduleSpecifier)) {\n\t\t\t\tconst bindings = statement.importClause?.namedBindings;\n\t\t\t\tif (bindings && ts.isNamedImports(bindings)) {\n\t\t\t\t\tconst importElement = bindings.elements.find(el => el.name.text === localName);\n\t\t\t\t\tif (importElement) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tmoduleSpecifier: statement.moduleSpecifier.text,\n\t\t\t\t\t\t\timportedName: importElement.propertyName?.text ?? importElement.name.text\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Resolve an import declaration module specifier to a source file.\n\t * @param containingSourceFilePath The containing source file path.\n\t * @param moduleSpecifier The module specifier text.\n\t * @returns The resolved source file path.\n\t */\n\tpublic static resolveImportDeclarationSourceFile(\n\t\tcontainingSourceFilePath: string,\n\t\tmoduleSpecifier: string\n\t): string | undefined {\n\t\tconst resolvedContainingSourceFilePath = FileUtils.resolvePath(containingSourceFilePath);\n\n\t\tif (moduleSpecifier.startsWith(\".\")) {\n\t\t\treturn (\n\t\t\t\tFileUtils.resolveImportSourceFilePath(resolvedContainingSourceFilePath, moduleSpecifier) ??\n\t\t\t\t(moduleSpecifier.endsWith(\".js\")\n\t\t\t\t\t? FileUtils.resolveImportSourceFilePath(\n\t\t\t\t\t\t\tresolvedContainingSourceFilePath,\n\t\t\t\t\t\t\t`${moduleSpecifier.slice(0, -3)}.ts`\n\t\t\t\t\t\t)\n\t\t\t\t\t: undefined)\n\t\t\t);\n\t\t}\n\n\t\tconst compilerOptions: ts.CompilerOptions = {\n\t\t\tmodule: ts.ModuleKind.NodeNext,\n\t\t\tmoduleResolution: ts.ModuleResolutionKind.NodeNext,\n\t\t\ttarget: ts.ScriptTarget.ESNext,\n\t\t\tskipLibCheck: true\n\t\t};\n\n\t\treturn ts.resolveModuleName(\n\t\t\tmoduleSpecifier,\n\t\t\tresolvedContainingSourceFilePath,\n\t\t\tcompilerOptions,\n\t\t\tts.sys\n\t\t).resolvedModule?.resolvedFileName;\n\t}\n\n\t/**\n\t * Extract a const-object property value from a declaration initializer.\n\t * @param objectDeclaration The variable declaration.\n\t * @param propertyName The property to resolve.\n\t * @returns The resolved value.\n\t */\n\tpublic static extractConstObjectPropertyFromDeclarationInitializer(\n\t\tobjectDeclaration: ts.VariableDeclaration,\n\t\tpropertyName: string\n\t): string | number | undefined {\n\t\tif (!objectDeclaration.initializer) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tlet objLiteral: ts.ObjectLiteralExpression | undefined;\n\t\t// { key: \"value\" } (plain object literal initializer)\n\t\tif (ts.isObjectLiteralExpression(objectDeclaration.initializer)) {\n\t\t\tobjLiteral = objectDeclaration.initializer;\n\t\t} else if (\n\t\t\t// { key: \"value\" } as const (object literal wrapped in as-expression)\n\t\t\tts.isAsExpression(objectDeclaration.initializer) &&\n\t\t\t// { key: \"value\" } (unwrap the as-expression to get the literal)\n\t\t\tts.isObjectLiteralExpression(objectDeclaration.initializer.expression)\n\t\t) {\n\t\t\tobjLiteral = objectDeclaration.initializer.expression;\n\t\t}\n\n\t\tif (!objLiteral) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst prop = objLiteral.properties\n\t\t\t// key: \"value\" (named property assignment)\n\t\t\t.filter((p): p is ts.PropertyAssignment => ts.isPropertyAssignment(p))\n\t\t\t// myProp (plain identifier property name)\n\t\t\t.find(p => ts.isIdentifier(p.name) && p.name.text === propertyName);\n\n\t\tif (!prop) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// \"value\" (string literal property value)\n\t\tif (ts.isStringLiteral(prop.initializer)) {\n\t\t\treturn prop.initializer.text;\n\t\t}\n\t\t// 42 (numeric literal property value)\n\t\tif (ts.isNumericLiteral(prop.initializer)) {\n\t\t\treturn Number(prop.initializer.text);\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Extract a const-object property value from a declaration type annotation.\n\t * @param declarationTypeNode The declaration type annotation.\n\t * @param propertyName The property to resolve.\n\t * @returns The resolved value.\n\t */\n\tpublic static extractConstObjectPropertyFromDeclarationType(\n\t\tdeclarationTypeNode: ts.TypeNode,\n\t\tpropertyName: string\n\t): string | number | undefined {\n\t\tif (ts.isParenthesizedTypeNode(declarationTypeNode)) {\n\t\t\treturn JsonSchemaBuilder.extractConstObjectPropertyFromDeclarationType(\n\t\t\t\tdeclarationTypeNode.type,\n\t\t\t\tpropertyName\n\t\t\t);\n\t\t}\n\n\t\tif (\n\t\t\tts.isTypeOperatorNode(declarationTypeNode) &&\n\t\t\tdeclarationTypeNode.operator === ts.SyntaxKind.ReadonlyKeyword\n\t\t) {\n\t\t\treturn JsonSchemaBuilder.extractConstObjectPropertyFromDeclarationType(\n\t\t\t\tdeclarationTypeNode.type,\n\t\t\t\tpropertyName\n\t\t\t);\n\t\t}\n\n\t\tif (\n\t\t\tts.isTypeReferenceNode(declarationTypeNode) &&\n\t\t\tts.isIdentifier(declarationTypeNode.typeName) &&\n\t\t\tdeclarationTypeNode.typeName.text === \"Readonly\" &&\n\t\t\tIs.arrayValue(declarationTypeNode.typeArguments)\n\t\t) {\n\t\t\treturn JsonSchemaBuilder.extractConstObjectPropertyFromDeclarationType(\n\t\t\t\tdeclarationTypeNode.typeArguments[0],\n\t\t\t\tpropertyName\n\t\t\t);\n\t\t}\n\n\t\tif (ts.isTypeLiteralNode(declarationTypeNode)) {\n\t\t\tconst propertySignature = declarationTypeNode.members.find(\n\t\t\t\t(member): member is ts.PropertySignature => {\n\t\t\t\t\tif (!ts.isPropertySignature(member) || !member.name) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t(ts.isIdentifier(member.name) && member.name.text === propertyName) ||\n\t\t\t\t\t\t(ts.isStringLiteral(member.name) && member.name.text === propertyName) ||\n\t\t\t\t\t\t(ts.isNumericLiteral(member.name) && member.name.text === propertyName)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t);\n\n\t\t\tif (propertySignature?.type) {\n\t\t\t\treturn JsonSchemaBuilder.extractLiteralValueFromTypeNode(propertySignature.type);\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Extract a literal value from a type node when possible.\n\t * @param typeNode The type node.\n\t * @returns The literal value.\n\t */\n\tpublic static extractLiteralValueFromTypeNode(\n\t\ttypeNode: ts.TypeNode\n\t): string | number | undefined {\n\t\tif (ts.isLiteralTypeNode(typeNode)) {\n\t\t\tif (ts.isStringLiteral(typeNode.literal)) {\n\t\t\t\treturn typeNode.literal.text;\n\t\t\t}\n\n\t\t\tif (ts.isNumericLiteral(typeNode.literal)) {\n\t\t\t\treturn Number(typeNode.literal.text);\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Extract a referenced type name from an import type qualifier.\n\t * @param qualifier The import type qualifier.\n\t * @returns The resolved type name.\n\t */\n\tpublic static extractImportTypeName(qualifier: ts.EntityName | undefined): string | undefined {\n\t\tif (!qualifier) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// TypeName (plain identifier, e.g. import(\"pkg\").TypeName)\n\t\tif (ts.isIdentifier(qualifier)) {\n\t\t\treturn qualifier.text;\n\t\t}\n\n\t\t// Namespace.TypeName (qualified name, e.g. import(\"pkg\").Namespace.TypeName)\n\t\treturn qualifier.right.text;\n\t}\n\n\t/**\n\t * Resolve import-type references to local or external schema ids.\n\t * @param context The generation context.\n\t * @param moduleSpecifier The import module specifier.\n\t * @param typeName The imported type name.\n\t * @param title The derived schema title.\n\t * @returns The resolved schema id.\n\t */\n\tpublic static resolveImportTypeReferenceSchemaId(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tmoduleSpecifier: string,\n\t\ttypeName: string,\n\t\ttitle: string\n\t): string | undefined {\n\t\tconst mappedReference = JsonSchemaBuilder.resolveReferenceMappingTarget(\n\t\t\tcontext,\n\t\t\tmoduleSpecifier,\n\t\t\ttypeName\n\t\t);\n\n\t\tif (moduleSpecifier.startsWith(\".\")) {\n\t\t\tif (mappedReference?.schemaId) {\n\t\t\t\treturn mappedReference.schemaId;\n\t\t\t}\n\n\t\t\tconst activeFilePath = context.activeSourceFile?.fileName;\n\t\t\tif (!activeFilePath) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst resolvedImportPath = FileUtils.resolveImportSourceFilePath(\n\t\t\t\tactiveFilePath,\n\t\t\t\tmoduleSpecifier\n\t\t\t);\n\t\t\tif (!resolvedImportPath) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst importedSource = FileUtils.readFile(resolvedImportPath);\n\t\t\tif (!importedSource) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tJsonSchemaBuilder.parseAllObjectSchemas(context, resolvedImportPath, importedSource, []);\n\t\t\treturn context.schemas[context.packageName]?.[title]?.$id;\n\t\t}\n\n\t\tconst cachedSchemaId = context.schemas[moduleSpecifier]?.[title]?.$id;\n\t\tif (cachedSchemaId) {\n\t\t\treturn cachedSchemaId;\n\t\t}\n\n\t\tconst declarationResult = Resolver.resolveTypeDeclarationAst(moduleSpecifier, typeName);\n\t\tif (!declarationResult) {\n\t\t\treturn mappedReference?.schemaId;\n\t\t}\n\n\t\tconst externalContext: ITypeScriptToSchemaContext = {\n\t\t\tnamespace: mappedReference?.namespace ?? context.namespace,\n\t\t\tpackageName: moduleSpecifier,\n\t\t\tschemas: context.schemas,\n\t\t\tactiveSourceFile: context.activeSourceFile,\n\t\t\toptions: context.options\n\t\t};\n\n\t\tJsonSchemaBuilder.parseAllObjectSchemas(\n\t\t\texternalContext,\n\t\t\tdeclarationResult.sourceFile.fileName,\n\t\t\tdeclarationResult.sourceFile.getFullText(),\n\t\t\t[]\n\t\t);\n\n\t\treturn context.schemas[moduleSpecifier]?.[title]?.$id ?? mappedReference?.schemaId;\n\t}\n\n\t/**\n\t * Infer a primitive JSON schema from a literal expression.\n\t * @param context The generation context.\n\t * @param expr The expression to inspect.\n\t * @param asConst Whether to produce exact const schemas matching an as-const assertion.\n\t * @returns The inferred schema.\n\t */\n\tpublic static inferSchemaFromExpression(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\texpr: ts.Expression,\n\t\tasConst: boolean = false\n\t): IJsonSchema {\n\t\t// expr satisfies Type (satisfies operator, unwrap and recurse)\n\t\tif (ts.isSatisfiesExpression(expr)) {\n\t\t\treturn JsonSchemaBuilder.inferSchemaFromExpression(context, expr.expression, asConst);\n\t\t}\n\n\t\t// expr as const or expr as Type (as-expression, detect const assertion)\n\t\t// TypeScript does not have a dedicated SyntaxKind for `as const`. Instead the\n\t\t// compiler represents it as an AsExpression whose type child is a TypeReferenceNode\n\t\t// whose typeName identifier text is literally \"const\". Checking for that string is\n\t\t// the only reliable way to distinguish `as const` from `as SomeNamedType`.\n\t\tif (ts.isAsExpression(expr)) {\n\t\t\tconst isConstAssertion =\n\t\t\t\t// expr as Type (type reference in the as clause)\n\t\t\t\tts.isTypeReferenceNode(expr.type) &&\n\t\t\t\t// const (the identifier must be \"const\")\n\t\t\t\tts.isIdentifier(expr.type.typeName) &&\n\t\t\t\texpr.type.typeName.text === \"const\";\n\t\t\treturn JsonSchemaBuilder.inferSchemaFromExpression(\n\t\t\t\tcontext,\n\t\t\t\texpr.expression,\n\t\t\t\tisConstAssertion\n\t\t\t);\n\t\t}\n\n\t\tif (\n\t\t\t// -42 (prefix unary minus applied to a numeric literal)\n\t\t\tts.isPrefixUnaryExpression(expr) &&\n\t\t\texpr.operator === ts.SyntaxKind.MinusToken &&\n\t\t\t// 42 (the operand must be a bare numeric literal)\n\t\t\tts.isNumericLiteral(expr.operand)\n\t\t) {\n\t\t\treturn asConst ? { const: -Number(expr.operand.text) } : { type: \"number\" };\n\t\t}\n\n\t\t// \"hello\" or `hello` (plain string or no-substitution template literal)\n\t\tif (ts.isStringLiteral(expr) || ts.isNoSubstitutionTemplateLiteral(expr)) {\n\t\t\treturn asConst ? { const: expr.text } : { type: \"string\" };\n\t\t}\n\t\t// 42 (numeric literal)\n\t\tif (ts.isNumericLiteral(expr)) {\n\t\t\treturn asConst ? { const: Number(expr.text) } : { type: \"number\" };\n\t\t}\n\t\tif (expr.kind === ts.SyntaxKind.TrueKeyword) {\n\t\t\treturn asConst ? { const: true } : { type: \"boolean\" };\n\t\t}\n\t\tif (expr.kind === ts.SyntaxKind.FalseKeyword) {\n\t\t\treturn asConst ? { const: false } : { type: \"boolean\" };\n\t\t}\n\t\tif (expr.kind === ts.SyntaxKind.NullKeyword) {\n\t\t\treturn asConst ? { const: null } : { type: \"null\" };\n\t\t}\n\t\t// { key: \"value\" } (object literal expression)\n\t\tif (ts.isObjectLiteralExpression(expr)) {\n\t\t\treturn JsonSchemaBuilder.inferObjectLiteralSchema(context, expr, asConst);\n\t\t}\n\t\t// [\"a\", \"b\"] (array literal expression)\n\t\tif (ts.isArrayLiteralExpression(expr)) {\n\t\t\treturn JsonSchemaBuilder.inferArrayLiteralSchema(context, expr, asConst);\n\t\t}\n\n\t\tDiagnosticReporter.report(\n\t\t\tcontext,\n\t\t\texpr,\n\t\t\t\"jsonSchemaBuilder.diagnostic.unsupportedInferredExpressionKind\",\n\t\t\t{ kind: ts.SyntaxKind[expr.kind] }\n\t\t);\n\t\treturn {};\n\t}\n\n\t/**\n\t * Infer an object schema from an object literal expression, using const or widened types.\n\t * @param context The generation context.\n\t * @param expr The object literal expression.\n\t * @param asConst Whether property value schemas should be exact const types.\n\t * @returns The inferred object schema.\n\t */\n\tpublic static inferObjectLiteralSchema(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\texpr: ts.ObjectLiteralExpression,\n\t\tasConst: boolean\n\t): IJsonSchema {\n\t\tconst properties: { [key: string]: IJsonSchema } = {};\n\t\tconst required: string[] = [];\n\t\tfor (const property of expr.properties) {\n\t\t\t// key: \"value\" (named property assignment)\n\t\t\tif (ts.isPropertyAssignment(property)) {\n\t\t\t\tif (ts.isComputedPropertyName(property.name)) {\n\t\t\t\t\tDiagnosticReporter.report(\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t\tproperty.name,\n\t\t\t\t\t\t\"jsonSchemaBuilder.diagnostic.unsupportedInferredObjectComputedKey\",\n\t\t\t\t\t\t{ propertyName: property.name.getText() }\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tlet key: string | undefined;\n\t\t\t\t\t// myProp or \"my-prop\" (identifier or quoted string key)\n\t\t\t\t\tif (ts.isIdentifier(property.name) || ts.isStringLiteral(property.name)) {\n\t\t\t\t\t\tkey = property.name.text;\n\t\t\t\t\t}\n\t\t\t\t\tif (key !== undefined) {\n\t\t\t\t\t\tproperties[key] = JsonSchemaBuilder.inferSchemaFromExpression(\n\t\t\t\t\t\t\tcontext,\n\t\t\t\t\t\t\tproperty.initializer,\n\t\t\t\t\t\t\tasConst\n\t\t\t\t\t\t);\n\t\t\t\t\t\trequired.push(key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// { shorthand } (shorthand property, resolves the variable's type/value)\n\t\t\t} else if (ts.isShorthandPropertyAssignment(property)) {\n\t\t\t\tconst shorthandDeclaration = JsonSchemaBuilder.findVariableDeclaration(\n\t\t\t\t\tcontext.activeSourceFile,\n\t\t\t\t\tproperty.name.text\n\t\t\t\t);\n\t\t\t\tif (shorthandDeclaration?.type) {\n\t\t\t\t\tproperties[property.name.text] =\n\t\t\t\t\t\tJsonSchemaBuilder.mapTypeNodeToSchema(context, shorthandDeclaration.type) ?? {};\n\t\t\t\t\trequired.push(property.name.text);\n\t\t\t\t} else if (shorthandDeclaration?.initializer) {\n\t\t\t\t\tproperties[property.name.text] = JsonSchemaBuilder.inferSchemaFromExpression(\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t\tshorthandDeclaration.initializer,\n\t\t\t\t\t\tasConst\n\t\t\t\t\t);\n\t\t\t\t\trequired.push(property.name.text);\n\t\t\t\t} else {\n\t\t\t\t\tDiagnosticReporter.report(\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t\tproperty,\n\t\t\t\t\t\t\"jsonSchemaBuilder.diagnostic.unsupportedInferredObjectMemberKind\",\n\t\t\t\t\t\t{ kind: \"ShorthandPropertyAssignment\", memberName: property.name.text }\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t// { ...spread } (spread assignment, not supported for inference)\n\t\t\t} else if (ts.isSpreadAssignment(property)) {\n\t\t\t\tDiagnosticReporter.report(\n\t\t\t\t\tcontext,\n\t\t\t\t\tproperty,\n\t\t\t\t\t\"jsonSchemaBuilder.diagnostic.unsupportedInferredObjectSpread\",\n\t\t\t\t\t{ expression: property.expression.getText() }\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tDiagnosticReporter.report(\n\t\t\t\t\tcontext,\n\t\t\t\t\tproperty,\n\t\t\t\t\t\"jsonSchemaBuilder.diagnostic.unsupportedInferredObjectMemberKind\",\n\t\t\t\t\t{ kind: ts.SyntaxKind[property.kind] }\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tif (Object.keys(properties).length === 0) {\n\t\t\treturn { type: \"object\" };\n\t\t}\n\t\treturn { type: \"object\", properties, required };\n\t}\n\n\t/**\n\t * Infer an array schema from an array literal expression.\n\t * For as-const arrays a fixed-length tuple schema is produced; otherwise a plain array schema.\n\t * @param context The generation context.\n\t * @param expr The array literal expression.\n\t * @param asConst Whether to produce a const-exact tuple schema.\n\t * @returns The inferred array schema.\n\t */\n\tpublic static inferArrayLiteralSchema(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\texpr: ts.ArrayLiteralExpression,\n\t\tasConst: boolean\n\t): IJsonSchema {\n\t\tif (!asConst || expr.elements.length === 0) {\n\t\t\treturn { type: \"array\" };\n\t\t}\n\t\tconst prefixItems: IJsonSchema[] = [];\n\t\tfor (const element of expr.elements) {\n\t\t\t// [...items] or a hole in [1,, 3] (spread or omitted element, not supported)\n\t\t\tif (ts.isSpreadElement(element) || ts.isOmittedExpression(element)) {\n\t\t\t\tDiagnosticReporter.report(\n\t\t\t\t\tcontext,\n\t\t\t\t\telement,\n\t\t\t\t\t\"jsonSchemaBuilder.diagnostic.unsupportedInferredTupleElement\",\n\t\t\t\t\t{ kind: ts.SyntaxKind[element.kind] }\n\t\t\t\t);\n\t\t\t\treturn { type: \"array\" };\n\t\t\t}\n\n\t\t\tprefixItems.push(JsonSchemaBuilder.inferSchemaFromExpression(context, element, true));\n\t\t}\n\t\treturn {\n\t\t\ttype: \"array\",\n\t\t\tprefixItems,\n\t\t\titems: false,\n\t\t\tminItems: prefixItems.length,\n\t\t\tmaxItems: prefixItems.length\n\t\t};\n\t}\n\n\t/**\n\t * Map conditional type nodes (e.g. T extends U ? X : Y) to schema.\n\t * @param context The generation context.\n\t * @param typeNode The conditional type node.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapConditionalTypeToSchema(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.ConditionalTypeNode\n\t): IJsonSchema | undefined {\n\t\tconst trueSchema = JsonSchemaBuilder.mapTypeNodeToSchema(context, typeNode.trueType);\n\t\tconst falseSchema = JsonSchemaBuilder.mapTypeNodeToSchema(context, typeNode.falseType);\n\n\t\tif (!trueSchema && !falseSchema) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (trueSchema && falseSchema) {\n\t\t\tif (JsonHelper.canonicalize(trueSchema) === JsonHelper.canonicalize(falseSchema)) {\n\t\t\t\treturn trueSchema;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tanyOf: [trueSchema, falseSchema]\n\t\t\t};\n\t\t}\n\n\t\treturn trueSchema ?? falseSchema;\n\t}\n\n\t/**\n\t * Map indexed access type nodes (e.g. T[\"id\"]) to schema.\n\t * @param context The generation context.\n\t * @param typeNode The indexed access type node.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapIndexedAccessTypeToSchema(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.IndexedAccessTypeNode\n\t): IJsonSchema | undefined {\n\t\tconst baseSchema =\n\t\t\tJsonSchemaBuilder.resolveUtilityBaseObjectSchema(context, typeNode.objectType) ??\n\t\t\tJsonSchemaBuilder.mapTypeNodeToSchema(context, typeNode.objectType);\n\t\tif (!baseSchema) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst indexKeys = JsonSchemaBuilder.extractIndexedAccessKeys(context, typeNode.indexType);\n\t\tif (indexKeys.length === 0) {\n\t\t\tif (\n\t\t\t\ttypeNode.indexType.kind === ts.SyntaxKind.NumberKeyword &&\n\t\t\t\tbaseSchema.type === \"array\" &&\n\t\t\t\tIs.object(baseSchema.items)\n\t\t\t) {\n\t\t\t\treturn ObjectHelper.clone(baseSchema.items);\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\ttypeNode.indexType.kind === ts.SyntaxKind.NumberKeyword &&\n\t\t\t\tbaseSchema.type === \"array\" &&\n\t\t\t\tIs.array(baseSchema.prefixItems)\n\t\t\t) {\n\t\t\t\tconst uniquePrefixSchemas = baseSchema.prefixItems.filter((schema, index, allSchemas) => {\n\t\t\t\t\tconst schemaKey = JsonHelper.canonicalize(schema);\n\t\t\t\t\treturn allSchemas.findIndex(s => JsonHelper.canonicalize(s) === schemaKey) === index;\n\t\t\t\t});\n\n\t\t\t\tif (uniquePrefixSchemas.length === 1) {\n\t\t\t\t\treturn ObjectHelper.clone(uniquePrefixSchemas[0]);\n\t\t\t\t}\n\n\t\t\t\tif (uniquePrefixSchemas.length > 1) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tanyOf: uniquePrefixSchemas.map(schema => ObjectHelper.clone(schema))\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t(typeNode.indexType.kind === ts.SyntaxKind.StringKeyword ||\n\t\t\t\t\ttypeNode.indexType.kind === ts.SyntaxKind.NumberKeyword) &&\n\t\t\t\tIs.object(baseSchema.additionalProperties)\n\t\t\t) {\n\t\t\t\treturn ObjectHelper.clone(baseSchema.additionalProperties);\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst resolvedPropertySchemas = indexKeys\n\t\t\t.map(indexKey =>\n\t\t\t\tObjectTransformer.resolvePropertySchemaFromObjectSchema(baseSchema, indexKey)\n\t\t\t)\n\t\t\t.filter((schema): schema is IJsonSchema => schema !== undefined);\n\n\t\tif (resolvedPropertySchemas.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst uniqueSchemas = resolvedPropertySchemas.filter((schema, index, allSchemas) => {\n\t\t\tconst schemaKey = JsonHelper.canonicalize(schema);\n\t\t\treturn allSchemas.findIndex(s => JsonHelper.canonicalize(s) === schemaKey) === index;\n\t\t});\n\n\t\tif (uniqueSchemas.length === 1) {\n\t\t\treturn uniqueSchemas[0];\n\t\t}\n\n\t\treturn {\n\t\t\tanyOf: uniqueSchemas\n\t\t};\n\t}\n\n\t/**\n\t * Map template literal type nodes to string schemas.\n\t * @param context The generation context.\n\t * @param typeNode The template literal type node.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapTemplateLiteralTypeToSchema(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TemplateLiteralTypeNode\n\t): IJsonSchema {\n\t\tconst templatePattern = TemplateLiteralPatternBuilder.buildTemplateLiteralPattern(typeNode);\n\t\tif (!templatePattern) {\n\t\t\tDiagnosticReporter.report(\n\t\t\t\tcontext,\n\t\t\t\ttypeNode,\n\t\t\t\t\"jsonSchemaBuilder.diagnostic.unsupportedTemplateLiteralSpan\",\n\t\t\t\t{ type: typeNode.getText() }\n\t\t\t);\n\t\t}\n\n\t\treturn templatePattern\n\t\t\t? {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tpattern: templatePattern\n\t\t\t\t}\n\t\t\t: {\n\t\t\t\t\ttype: \"string\"\n\t\t\t\t};\n\t}\n\n\t/**\n\t * Map mapped type nodes to object schemas.\n\t * @param context The generation context.\n\t * @param typeNode The mapped type node.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapMappedTypeToSchema(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.MappedTypeNode\n\t): IJsonSchema | undefined {\n\t\tconst mappedTypeParameterName = typeNode.typeParameter.name.text;\n\t\tconst mappedKeys = JsonSchemaBuilder.extractMappedTypeKeys(\n\t\t\tcontext,\n\t\t\ttypeNode.typeParameter.constraint\n\t\t);\n\t\tconst sourceObjectSchema = JsonSchemaBuilder.resolveMappedTypeSourceObjectSchema(\n\t\t\tcontext,\n\t\t\ttypeNode\n\t\t);\n\t\tconst mappedEntries = MappedTypeSchemaResolver.resolveMappedTypePropertyEntries(\n\t\t\tcontext,\n\t\t\ttypeNode,\n\t\t\tmappedKeys,\n\t\t\tmappedTypeParameterName\n\t\t);\n\n\t\tif (mappedEntries === undefined) {\n\t\t\tDiagnosticReporter.report(\n\t\t\t\tcontext,\n\t\t\t\ttypeNode,\n\t\t\t\t\"jsonSchemaBuilder.diagnostic.unresolvedMappedTypeRemap\",\n\t\t\t\t{\n\t\t\t\t\ttypeName: typeNode.typeParameter.name.text\n\t\t\t\t}\n\t\t\t);\n\t\t\treturn MappedTypeSchemaResolver.buildMappedTypeFallbackSchema(\n\t\t\t\tcontext,\n\t\t\t\ttypeNode,\n\t\t\t\tmappedKeys,\n\t\t\t\tmappedTypeParameterName,\n\t\t\t\tsourceObjectSchema\n\t\t\t);\n\t\t}\n\n\t\tif (sourceObjectSchema && JsonSchemaBuilder.isHomomorphicMappedType(typeNode)) {\n\t\t\tconst mappedSchema = ObjectTransformer.toInlineUtilityObjectSchema(sourceObjectSchema);\n\t\t\tJsonSchemaBuilder.applyMappedTypeOptionality(mappedSchema, typeNode.questionToken);\n\t\t\treturn mappedSchema;\n\t\t}\n\n\t\tconst properties: { [key: string]: IJsonSchema } = {};\n\t\tfor (const mappedEntry of mappedEntries) {\n\t\t\tconst propertySchema = JsonSchemaBuilder.mapMappedTypePropertySchema(\n\t\t\t\tcontext,\n\t\t\t\ttypeNode,\n\t\t\t\tmappedEntry.sourceKey,\n\t\t\t\tmappedTypeParameterName,\n\t\t\t\tsourceObjectSchema\n\t\t\t);\n\t\t\tif (propertySchema) {\n\t\t\t\tconst existingPropertySchema = properties[mappedEntry.mappedKey];\n\t\t\t\tproperties[mappedEntry.mappedKey] = existingPropertySchema\n\t\t\t\t\t? MappedTypeSchemaResolver.mergeMappedTypePropertySchemas(\n\t\t\t\t\t\t\texistingPropertySchema,\n\t\t\t\t\t\t\tpropertySchema\n\t\t\t\t\t\t)\n\t\t\t\t\t: propertySchema;\n\t\t\t}\n\t\t}\n\n\t\tif (mappedKeys.length > 0 && mappedEntries.length === 0) {\n\t\t\treturn {\n\t\t\t\ttype: \"object\"\n\t\t\t};\n\t\t}\n\n\t\tif (Object.keys(properties).length > 0) {\n\t\t\tlet requiredPropertyKeys = Object.keys(properties);\n\t\t\tif (\n\t\t\t\ttypeNode.questionToken === undefined &&\n\t\t\t\tsourceObjectSchema &&\n\t\t\t\tJsonSchemaBuilder.isMappedTypeIndexedValueByTypeParameter(typeNode, mappedTypeParameterName)\n\t\t\t) {\n\t\t\t\tconst sourceRequiredKeys =\n\t\t\t\t\tMappedTypeSchemaResolver.resolveMappedTypeSourceRequiredPropertyKeys(\n\t\t\t\t\t\tmappedEntries,\n\t\t\t\t\t\tsourceObjectSchema\n\t\t\t\t\t);\n\t\t\t\tif (sourceRequiredKeys) {\n\t\t\t\t\trequiredPropertyKeys = sourceRequiredKeys;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst mappedSchema: IJsonSchema = {\n\t\t\t\ttype: \"object\",\n\t\t\t\tproperties\n\t\t\t};\n\t\t\tJsonSchemaBuilder.applyMappedTypeRequiredKeys(\n\t\t\t\tmappedSchema,\n\t\t\t\trequiredPropertyKeys,\n\t\t\t\ttypeNode.questionToken\n\t\t\t);\n\t\t\treturn mappedSchema;\n\t\t}\n\n\t\tconst additionalProperties = typeNode.type\n\t\t\t? (JsonSchemaBuilder.mapTypeNodeToSchema(context, typeNode.type) ?? {})\n\t\t\t: {};\n\n\t\treturn {\n\t\t\ttype: \"object\",\n\t\t\tadditionalProperties\n\t\t};\n\t}\n\n\t/**\n\t * Determine whether a mapped type value uses indexed access with the mapped key parameter.\n\t * @param typeNode The mapped type node.\n\t * @param mappedTypeParameterName The mapped type parameter name.\n\t * @returns True if the value shape is based on source indexed access.\n\t */\n\tpublic static isMappedTypeIndexedValueByTypeParameter(\n\t\ttypeNode: ts.MappedTypeNode,\n\t\tmappedTypeParameterName: string\n\t): boolean {\n\t\treturn (\n\t\t\ttypeNode.type !== undefined &&\n\t\t\t// T[K] (value type is an indexed access)\n\t\t\tts.isIndexedAccessTypeNode(typeNode.type) &&\n\t\t\tJsonSchemaBuilder.isMappedTypeParameterReference(\n\t\t\t\ttypeNode.type.indexType,\n\t\t\t\tmappedTypeParameterName\n\t\t\t)\n\t\t);\n\t}\n\n\t/**\n\t * Check whether a type node is allowed for schema generation.\n\t * @param context The generation context.\n\t * @param typeNode The type node to inspect.\n\t * @param propertyName The optional property name when the type is a property type.\n\t * @param enclosingObjectName The optional enclosing object name when the type is a property type.\n\t * @returns True when the type is allowed.\n\t */\n\tpublic static checkTypeNodeAllowed(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeNode,\n\t\tpropertyName?: string,\n\t\tenclosingObjectName?: string\n\t): boolean {\n\t\tconst disallowedTypeName = DisallowedTypeGuard.getDisallowedTypeName(typeNode);\n\t\tif (disallowedTypeName) {\n\t\t\tif (Is.stringValue(propertyName) && Is.stringValue(enclosingObjectName)) {\n\t\t\t\tcontext.activeDisallowedType = {\n\t\t\t\t\tdisallowedTypeName,\n\t\t\t\t\tpropertyName,\n\t\t\t\t\tenclosingObjectName\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Determine whether a property type should be treated as a function and skipped.\n\t * @param typeNode The property type node.\n\t * @returns True if the property type is function-like.\n\t */\n\tpublic static isFunctionPropertyType(typeNode: ts.TypeNode): boolean {\n\t\tif (ts.isParenthesizedTypeNode(typeNode)) {\n\t\t\treturn JsonSchemaBuilder.isFunctionPropertyType(typeNode.type);\n\t\t}\n\n\t\tif (ts.isFunctionTypeNode(typeNode) || ts.isConstructorTypeNode(typeNode)) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (ts.isTypeReferenceNode(typeNode)) {\n\t\t\tconst typeName = ts.isIdentifier(typeNode.typeName)\n\t\t\t\t? typeNode.typeName.text\n\t\t\t\t: typeNode.typeName.right.text;\n\t\t\treturn typeName === \"Function\";\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Determine whether a type node represents symbol or unique symbol.\n\t * @param typeNode The type node to inspect.\n\t * @returns True when the type is symbol or unique symbol.\n\t */\n\tpublic static isSymbolTypeNode(typeNode: ts.TypeNode): boolean {\n\t\t// (symbol) (parenthesised type, unwrap and recurse)\n\t\tif (ts.isParenthesizedTypeNode(typeNode)) {\n\t\t\treturn JsonSchemaBuilder.isSymbolTypeNode(typeNode.type);\n\t\t}\n\n\t\tif (typeNode.kind === ts.SyntaxKind.SymbolKeyword) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// unique symbol (unique symbol type operator)\n\t\tif (\n\t\t\tts.isTypeOperatorNode(typeNode) &&\n\t\t\ttypeNode.operator === ts.SyntaxKind.UniqueKeyword &&\n\t\t\ttypeNode.type.kind === ts.SyntaxKind.SymbolKeyword\n\t\t) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Determine whether a computed property expression references a symbol.\n\t * Covers well-known symbols (Symbol.iterator, etc.) and const variables\n\t * declared with a unique symbol type annotation.\n\t * @param context The generation context.\n\t * @param expression The computed property expression.\n\t * @returns True when the key is symbol-based.\n\t */\n\tpublic static isSymbolKeyedComputedExpression(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\texpression: ts.Expression\n\t): boolean {\n\t\tif (\n\t\t\t// Symbol.iterator (property access on the Symbol object)\n\t\t\tts.isPropertyAccessExpression(expression) &&\n\t\t\t// Symbol (the object must be the bare \"Symbol\" identifier)\n\t\t\tts.isIdentifier(expression.expression) &&\n\t\t\texpression.expression.text === \"Symbol\"\n\t\t) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// mySymbol (identifier whose const declaration has a Symbol type)\n\t\tif (ts.isIdentifier(expression)) {\n\t\t\tconst decl = JsonSchemaBuilder.findConstVariableDeclaration(context, expression.text);\n\t\t\tif (decl?.type && JsonSchemaBuilder.isSymbolTypeNode(decl.type)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Extract a property name from TypeScript property syntax.\n\t * Computed names are resolved when they evaluate to concrete literals.\n\t * @param context The generation context.\n\t * @param propertyName The property name node.\n\t * @returns The normalized property name.\n\t */\n\tpublic static extractPropertyName(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tpropertyName: ts.PropertyName\n\t): string | undefined {\n\t\t// myProp or #privateField (identifier or private-identifier property name)\n\t\tif (ts.isIdentifier(propertyName) || ts.isPrivateIdentifier(propertyName)) {\n\t\t\treturn propertyName.text;\n\t\t}\n\n\t\t// \"my-prop\" or 0 (string or numeric literal property name)\n\t\tif (ts.isStringLiteral(propertyName) || ts.isNumericLiteral(propertyName)) {\n\t\t\treturn propertyName.text;\n\t\t}\n\n\t\t// [computedKey] (computed property name)\n\t\tif (ts.isComputedPropertyName(propertyName)) {\n\t\t\tif (JsonSchemaBuilder.isSymbolKeyedComputedExpression(context, propertyName.expression)) {\n\t\t\t\tDiagnosticReporter.report(\n\t\t\t\t\tcontext,\n\t\t\t\t\tpropertyName,\n\t\t\t\t\t\"jsonSchemaBuilder.diagnostic.symbolKeyedMember\",\n\t\t\t\t\t{\n\t\t\t\t\t\tmemberName: propertyName.getText()\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tconst computedPropertyName = JsonSchemaBuilder.resolveComputedPropertyNameExpression(\n\t\t\t\t\tcontext,\n\t\t\t\t\tpropertyName.expression,\n\t\t\t\t\tnew Set<string>()\n\t\t\t\t);\n\t\t\t\tif (Is.stringValue(computedPropertyName)) {\n\t\t\t\t\treturn computedPropertyName;\n\t\t\t\t}\n\n\t\t\t\tDiagnosticReporter.report(\n\t\t\t\t\tcontext,\n\t\t\t\t\tpropertyName,\n\t\t\t\t\t\"jsonSchemaBuilder.diagnostic.unsupportedComputedPropertyName\",\n\t\t\t\t\t{\n\t\t\t\t\t\tpropertyName: propertyName.getText()\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Find a variable declaration by name in a source file.\n\t * @param sourceFile The source file to search.\n\t * @param variableName The variable name.\n\t * @returns The declaration if found.\n\t */\n\tpublic static findVariableDeclaration(\n\t\tsourceFile: ts.SourceFile | undefined,\n\t\tvariableName: string\n\t): ts.VariableDeclaration | undefined {\n\t\tif (!sourceFile) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tfor (const statement of sourceFile.statements) {\n\t\t\t// const foo = ... or let foo = ... (any variable statement)\n\t\t\tif (ts.isVariableStatement(statement)) {\n\t\t\t\tfor (const declaration of statement.declarationList.declarations) {\n\t\t\t\t\t// foo (plain identifier binding matching the requested name)\n\t\t\t\t\tif (ts.isIdentifier(declaration.name) && declaration.name.text === variableName) {\n\t\t\t\t\t\treturn declaration;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Resolve a schema for an imported identifier used in a type query.\n\t * @param context The generation context.\n\t * @param localName The local imported symbol name.\n\t * @returns The mapped schema if resolvable.\n\t */\n\tpublic static resolveImportedTypeQuerySchema(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tlocalName: string\n\t): IJsonSchema | undefined {\n\t\tconst sourceFile = context.activeSourceFile;\n\t\tif (!sourceFile) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tfor (const statement of sourceFile.statements) {\n\t\t\t// import { localName } from \"./module.js\" (relative named import)\n\t\t\tif (ts.isImportDeclaration(statement) && ts.isStringLiteral(statement.moduleSpecifier)) {\n\t\t\t\tif (statement.moduleSpecifier.text.startsWith(\".\")) {\n\t\t\t\t\tconst bindings = statement.importClause?.namedBindings;\n\t\t\t\t\t// { Named, Import } (named import bindings)\n\t\t\t\t\tif (bindings && ts.isNamedImports(bindings)) {\n\t\t\t\t\t\tconst importElement = bindings.elements.find(el => el.name.text === localName);\n\t\t\t\t\t\tif (importElement) {\n\t\t\t\t\t\t\tconst importedName = importElement.propertyName?.text ?? importElement.name.text;\n\t\t\t\t\t\t\tconst resolvedPath = FileUtils.resolveImportSourceFilePath(\n\t\t\t\t\t\t\t\tsourceFile.fileName,\n\t\t\t\t\t\t\t\tstatement.moduleSpecifier.text\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (!resolvedPath) {\n\t\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst importedSource = FileUtils.readFile(resolvedPath);\n\t\t\t\t\t\t\tif (!importedSource) {\n\t\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst importedSourceFile = ts.createSourceFile(\n\t\t\t\t\t\t\t\tresolvedPath,\n\t\t\t\t\t\t\t\timportedSource,\n\t\t\t\t\t\t\t\tts.ScriptTarget.Latest,\n\t\t\t\t\t\t\t\ttrue\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst importedDeclaration = JsonSchemaBuilder.findVariableDeclaration(\n\t\t\t\t\t\t\t\timportedSourceFile,\n\t\t\t\t\t\t\t\timportedName\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (!importedDeclaration) {\n\t\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst importedContext: ITypeScriptToSchemaContext = {\n\t\t\t\t\t\t\t\t...context,\n\t\t\t\t\t\t\t\tactiveSourceFile: importedSourceFile\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tif (importedDeclaration.type) {\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\tJsonSchemaBuilder.mapTypeNodeToSchema(\n\t\t\t\t\t\t\t\t\t\timportedContext,\n\t\t\t\t\t\t\t\t\t\timportedDeclaration.type\n\t\t\t\t\t\t\t\t\t) ?? {}\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (importedDeclaration.initializer) {\n\t\t\t\t\t\t\t\treturn JsonSchemaBuilder.inferSchemaFromExpression(\n\t\t\t\t\t\t\t\t\timportedContext,\n\t\t\t\t\t\t\t\t\timportedDeclaration.initializer\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Resolve computed property name expressions when they can be evaluated to concrete keys.\n\t * @param context The generation context.\n\t * @param expression The computed property expression.\n\t * @param resolvingIdentifiers Identifier names currently being resolved.\n\t * @returns The resolved property key.\n\t */\n\tpublic static resolveComputedPropertyNameExpression(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\texpression: ts.Expression,\n\t\tresolvingIdentifiers: Set<string>\n\t): string | undefined {\n\t\tif (\n\t\t\t// \"key\" or `key` or 42 (literal expressions resolve directly)\n\t\t\tts.isStringLiteral(expression) ||\n\t\t\tts.isNoSubstitutionTemplateLiteral(expression) ||\n\t\t\tts.isNumericLiteral(expression)\n\t\t) {\n\t\t\treturn expression.text;\n\t\t}\n\n\t\t// (\"key\") (parenthesised expression, unwrap and recurse)\n\t\tif (ts.isParenthesizedExpression(expression)) {\n\t\t\treturn JsonSchemaBuilder.resolveComputedPropertyNameExpression(\n\t\t\t\tcontext,\n\t\t\t\texpression.expression,\n\t\t\t\tresolvingIdentifiers\n\t\t\t);\n\t\t}\n\n\t\t// expr as Type or <Type>expr (cast expression, unwrap and recurse)\n\t\tif (ts.isAsExpression(expression) || ts.isTypeAssertionExpression(expression)) {\n\t\t\treturn JsonSchemaBuilder.resolveComputedPropertyNameExpression(\n\t\t\t\tcontext,\n\t\t\t\texpression.expression,\n\t\t\t\tresolvingIdentifiers\n\t\t\t);\n\t\t}\n\n\t\t// expr satisfies Type (satisfies operator, unwrap and recurse)\n\t\tif (ts.isSatisfiesExpression(expression)) {\n\t\t\treturn JsonSchemaBuilder.resolveComputedPropertyNameExpression(\n\t\t\t\tcontext,\n\t\t\t\texpression.expression,\n\t\t\t\tresolvingIdentifiers\n\t\t\t);\n\t\t}\n\n\t\tif (\n\t\t\t// -42 or +42 (prefix unary numeric expression)\n\t\t\tts.isPrefixUnaryExpression(expression) &&\n\t\t\t(expression.operator === ts.SyntaxKind.MinusToken ||\n\t\t\t\texpression.operator === ts.SyntaxKind.PlusToken)\n\t\t) {\n\t\t\tconst operandValue = JsonSchemaBuilder.resolveComputedPropertyNameExpression(\n\t\t\t\tcontext,\n\t\t\t\texpression.operand,\n\t\t\t\tresolvingIdentifiers\n\t\t\t);\n\t\t\tif (Is.stringValue(operandValue) && /^\\d+(?:\\.\\d+)?$/.test(operandValue)) {\n\t\t\t\treturn expression.operator === ts.SyntaxKind.MinusToken ? `-${operandValue}` : operandValue;\n\t\t\t}\n\t\t}\n\n\t\t// `prefix-${expr}` (template expression, resolve spans recursively)\n\t\tif (ts.isTemplateExpression(expression)) {\n\t\t\tlet resolvedKey = expression.head.text;\n\t\t\tfor (const span of expression.templateSpans) {\n\t\t\t\tconst spanValue = JsonSchemaBuilder.resolveComputedPropertyNameExpression(\n\t\t\t\t\tcontext,\n\t\t\t\t\tspan.expression,\n\t\t\t\t\tresolvingIdentifiers\n\t\t\t\t);\n\t\t\t\tif (!Is.stringValue(spanValue)) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t\tresolvedKey += `${spanValue}${span.literal.text}`;\n\t\t\t}\n\n\t\t\treturn resolvedKey;\n\t\t}\n\n\t\t// myConst (identifier, resolve via const variable declaration)\n\t\tif (ts.isIdentifier(expression)) {\n\t\t\tif (resolvingIdentifiers.has(expression.text)) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst constDeclaration = JsonSchemaBuilder.findConstVariableDeclaration(\n\t\t\t\tcontext,\n\t\t\t\texpression.text\n\t\t\t);\n\t\t\tif (constDeclaration?.initializer) {\n\t\t\t\tresolvingIdentifiers.add(expression.text);\n\t\t\t\tconst identifierValue = JsonSchemaBuilder.resolveComputedPropertyNameExpression(\n\t\t\t\t\tcontext,\n\t\t\t\t\tconstDeclaration.initializer,\n\t\t\t\t\tresolvingIdentifiers\n\t\t\t\t);\n\t\t\t\tresolvingIdentifiers.delete(expression.text);\n\t\t\t\treturn identifierValue;\n\t\t\t}\n\t\t}\n\n\t\t// OBJ.property (property access on a known identifier, resolve via const object)\n\t\tif (ts.isPropertyAccessExpression(expression) && ts.isIdentifier(expression.expression)) {\n\t\t\tconst objectName = expression.expression.text;\n\t\t\tconst propertyName = expression.name.text;\n\n\t\t\tconst importedValue = JsonSchemaBuilder.resolveConstObjectProperty(\n\t\t\t\tcontext,\n\t\t\t\tobjectName,\n\t\t\t\tpropertyName\n\t\t\t);\n\t\t\tif (importedValue !== undefined) {\n\t\t\t\treturn `${importedValue}`;\n\t\t\t}\n\n\t\t\tconst localValue = JsonSchemaBuilder.resolveLocalConstObjectProperty(\n\t\t\t\tcontext,\n\t\t\t\tobjectName,\n\t\t\t\tpropertyName\n\t\t\t);\n\t\t\tif (localValue !== undefined) {\n\t\t\t\treturn `${localValue}`;\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Find a local const variable declaration in the active source file.\n\t * @param context The generation context.\n\t * @param variableName The variable name.\n\t * @returns The declaration when found.\n\t */\n\tpublic static findConstVariableDeclaration(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tvariableName: string\n\t): ts.VariableDeclaration | undefined {\n\t\tconst sourceFile = context.activeSourceFile;\n\t\tif (!sourceFile) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tfor (const statement of sourceFile.statements) {\n\t\t\tif (\n\t\t\t\t// const myVar = ... (const variable statement)\n\t\t\t\tts.isVariableStatement(statement) &&\n\t\t\t\tstatement.declarationList.flags === ts.NodeFlags.Const\n\t\t\t) {\n\t\t\t\tfor (const declaration of statement.declarationList.declarations) {\n\t\t\t\t\t// myVar (plain identifier binding matching the requested name)\n\t\t\t\t\tif (ts.isIdentifier(declaration.name) && declaration.name.text === variableName) {\n\t\t\t\t\t\treturn declaration;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Resolve a property value from a local const object declaration.\n\t * @param context The generation context.\n\t * @param objectName The const object name.\n\t * @param propertyName The property to resolve.\n\t * @returns The resolved value when available.\n\t */\n\tpublic static resolveLocalConstObjectProperty(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tobjectName: string,\n\t\tpropertyName: string\n\t): string | number | undefined {\n\t\tconst objectDeclaration = JsonSchemaBuilder.findConstVariableDeclaration(context, objectName);\n\t\tif (!objectDeclaration) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst valueFromInitializer =\n\t\t\tJsonSchemaBuilder.extractConstObjectPropertyFromDeclarationInitializer(\n\t\t\t\tobjectDeclaration,\n\t\t\t\tpropertyName\n\t\t\t);\n\t\tif (valueFromInitializer !== undefined) {\n\t\t\treturn valueFromInitializer;\n\t\t}\n\n\t\tif (objectDeclaration.type) {\n\t\t\treturn JsonSchemaBuilder.extractConstObjectPropertyFromDeclarationType(\n\t\t\t\tobjectDeclaration.type,\n\t\t\t\tpropertyName\n\t\t\t);\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Map a tuple type node to schema.\n\t * @param context The generation context.\n\t * @param tupleTypeNode The tuple type node.\n\t * @returns The mapped tuple schema.\n\t */\n\tpublic static mapTupleTypeToSchema(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttupleTypeNode: ts.TupleTypeNode\n\t): IJsonSchema | undefined {\n\t\tconst fixedSchemas: IJsonSchema[] = [];\n\t\tlet restSchema: IJsonSchema | undefined;\n\t\tlet restIndex = -1;\n\n\t\tfor (const [index, element] of tupleTypeNode.elements.entries()) {\n\t\t\tconst tupleElementType = JsonSchemaBuilder.extractTupleElementType(element);\n\t\t\tif (!tupleElementType) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst mappedSchema = JsonSchemaBuilder.mapTypeNodeToSchema(context, tupleElementType);\n\t\t\tif (!mappedSchema) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\t// ...string[] (rest element in tuple)\n\t\t\tif (ts.isRestTypeNode(element)) {\n\t\t\t\trestSchema = JsonSchemaBuilder.extractRestElementSchema(context, element.type);\n\t\t\t\trestIndex = index;\n\t\t\t\tif (!restSchema) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfixedSchemas.push(mappedSchema);\n\t\t\t}\n\t\t}\n\n\t\tif (!restSchema) {\n\t\t\treturn {\n\t\t\t\ttype: \"array\",\n\t\t\t\tprefixItems: fixedSchemas,\n\t\t\t\titems: false,\n\t\t\t\tminItems: fixedSchemas.length,\n\t\t\t\tmaxItems: fixedSchemas.length\n\t\t\t};\n\t\t}\n\n\t\tconst prefixCount = restIndex > -1 ? restIndex : fixedSchemas.length;\n\t\tconst prefixItems = fixedSchemas.slice(0, prefixCount);\n\t\tconst suffixItems = restIndex > -1 ? fixedSchemas.slice(prefixCount) : [];\n\n\t\tif (suffixItems.length === 0) {\n\t\t\treturn {\n\t\t\t\ttype: \"array\",\n\t\t\t\tprefixItems: prefixItems.length > 0 ? prefixItems : undefined,\n\t\t\t\titems: restSchema,\n\t\t\t\tminItems: prefixItems.length\n\t\t\t};\n\t\t}\n\n\t\tconst anyOfItemSchemas = [restSchema, ...suffixItems];\n\t\tconst uniqueAnyOfSchemas = anyOfItemSchemas.filter((schema, index, allSchemas) => {\n\t\t\tconst schemaKey = JsonHelper.canonicalize(schema);\n\t\t\treturn allSchemas.findIndex(s => JsonHelper.canonicalize(s) === schemaKey) === index;\n\t\t});\n\n\t\tconst effectivePrefixItems = prefixItems;\n\t\tconst restSchemaKey = JsonHelper.canonicalize(restSchema);\n\n\t\tconst uniqueSuffixCandidate = suffixItems.find(\n\t\t\tschema => JsonHelper.canonicalize(schema) !== restSchemaKey\n\t\t);\n\t\tconst exactSingleUniqueSuffixConstraint =\n\t\t\trestIndex === 0 &&\n\t\t\tsuffixItems.length > 1 &&\n\t\t\tuniqueSuffixCandidate &&\n\t\t\tsuffixItems.filter(\n\t\t\t\tschema => JsonHelper.canonicalize(schema) === JsonHelper.canonicalize(uniqueSuffixCandidate)\n\t\t\t).length === 1\n\t\t\t\t? {\n\t\t\t\t\t\tcontains: uniqueSuffixCandidate,\n\t\t\t\t\t\tminContains: 1,\n\t\t\t\t\t\tmaxContains: 1\n\t\t\t\t\t}\n\t\t\t\t: {};\n\n\t\treturn {\n\t\t\ttype: \"array\",\n\t\t\tprefixItems: effectivePrefixItems.length > 0 ? effectivePrefixItems : undefined,\n\t\t\titems:\n\t\t\t\tuniqueAnyOfSchemas.length === 1 ? uniqueAnyOfSchemas[0] : { anyOf: uniqueAnyOfSchemas },\n\t\t\tminItems: effectivePrefixItems.length + suffixItems.length,\n\t\t\t...exactSingleUniqueSuffixConstraint\n\t\t};\n\t}\n\n\t/**\n\t * Extract schema for a tuple rest element.\n\t * @param context The generation context.\n\t * @param restElementType The rest element type.\n\t * @returns The mapped rest element schema.\n\t */\n\tpublic static extractRestElementSchema(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\trestElementType: ts.TypeNode\n\t): IJsonSchema | undefined {\n\t\t// string[] (array form of rest element type, e.g. ...string[])\n\t\tif (ts.isArrayTypeNode(restElementType)) {\n\t\t\treturn JsonSchemaBuilder.mapTypeNodeToSchema(context, restElementType.elementType);\n\t\t}\n\n\t\treturn JsonSchemaBuilder.mapTypeNodeToSchema(context, restElementType);\n\t}\n\n\t/**\n\t * Find an existing schema id by title in known package schemas.\n\t * @param context The generation context.\n\t * @param schemaTitle The schema title to find.\n\t * @returns The existing schema id if found.\n\t */\n\tpublic static findExistingSchemaIdByTitle(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tschemaTitle: string\n\t): string | undefined {\n\t\tfor (const packageSchemaEntries of Object.values(context.schemas)) {\n\t\t\tconst existingSchema = packageSchemaEntries[schemaTitle];\n\t\t\tif (existingSchema?.$id) {\n\t\t\t\treturn existingSchema.$id;\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Apply interface inheritance (`extends`) as `allOf` references.\n\t * @param context The generation context.\n\t * @param schema The schema to expand.\n\t * @param declaration The interface declaration.\n\t */\n\tpublic static applyInterfaceExtendsSchema(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tschema: Partial<IJsonSchema>,\n\t\tdeclaration: ts.InterfaceDeclaration\n\t): void {\n\t\tconst extendsClause = declaration.heritageClauses?.find(\n\t\t\tclause => clause.token === ts.SyntaxKind.ExtendsKeyword\n\t\t);\n\t\tif (!extendsClause) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst allOfRefs: IJsonSchema[] = [];\n\t\tfor (const extendedType of extendsClause.types) {\n\t\t\tconst expression = extendedType.expression;\n\t\t\tlet typeName: string | undefined;\n\t\t\t// interface IFoo extends BaseType (plain identifier in extends clause)\n\t\t\tif (ts.isIdentifier(expression)) {\n\t\t\t\ttypeName = expression.text;\n\t\t\t\t// interface IFoo extends Namespace.BaseType (qualified extends expression)\n\t\t\t} else if (ts.isPropertyAccessExpression(expression)) {\n\t\t\t\ttypeName = expression.name.text;\n\t\t\t}\n\n\t\t\tif (typeName) {\n\t\t\t\t// interface IFoo extends Partial<T> (utility type in extends, identifier guard)\n\t\t\t\t// A heritage clause expression is an Identifier node, not a TypeReferenceNode,\n\t\t\t\t// so it cannot be passed directly to mapTypeNodeToSchema. A synthetic\n\t\t\t\t// TypeReferenceNode is constructed here using the same expression + type\n\t\t\t\t// arguments so the utility handler receives exactly the AST shape it expects.\n\t\t\t\tif (JsonSchemaBuilder._utilityTypeHandlers[typeName] && ts.isIdentifier(expression)) {\n\t\t\t\t\tconst syntheticTypeNode = ts.factory.createTypeReferenceNode(\n\t\t\t\t\t\texpression,\n\t\t\t\t\t\textendedType.typeArguments\n\t\t\t\t\t);\n\t\t\t\t\tconst mappedSchema = JsonSchemaBuilder.mapTypeNodeToSchema(context, syntheticTypeNode);\n\t\t\t\t\tif (mappedSchema) {\n\t\t\t\t\t\tallOfRefs.push(mappedSchema);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst title = StringHelper.stripPrefix(typeName);\n\t\t\t\t\tconst existingSchemaId = JsonSchemaBuilder.findExistingSchemaIdByTitle(context, title);\n\t\t\t\t\tallOfRefs.push({\n\t\t\t\t\t\t$ref: existingSchemaId ?? `${context.namespace}${title}`\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (allOfRefs.length > 0) {\n\t\t\tschema.allOf = allOfRefs;\n\t\t}\n\t}\n\n\t/**\n\t * Map Partial<T> to an object schema with no required properties.\n\t * @param context The generation context.\n\t * @param typeNode The Partial type reference.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapPartialUtilityType(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode\n\t): IJsonSchema | undefined {\n\t\treturn UtilityTypeSchemaMapper.mapPartialUtilityType(context, typeNode, (ctx, baseTypeNode) =>\n\t\t\tJsonSchemaBuilder.resolveUtilityBaseObjectSchema(ctx, baseTypeNode)\n\t\t);\n\t}\n\n\t/**\n\t * Map Required<T> to an object schema with all properties required.\n\t * @param context The generation context.\n\t * @param typeNode The Required type reference.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapRequiredUtilityType(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode\n\t): IJsonSchema | undefined {\n\t\treturn UtilityTypeSchemaMapper.mapRequiredUtilityType(context, typeNode, (ctx, baseTypeNode) =>\n\t\t\tJsonSchemaBuilder.resolveUtilityBaseObjectSchema(ctx, baseTypeNode)\n\t\t);\n\t}\n\n\t/**\n\t * Map Pick<T, K> to an object schema with selected keys preserved.\n\t * @param context The generation context.\n\t * @param typeNode The Pick type reference.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapPickUtilityType(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode\n\t): IJsonSchema | undefined {\n\t\treturn UtilityTypeSchemaMapper.mapPickUtilityType(\n\t\t\tcontext,\n\t\t\ttypeNode,\n\t\t\t(ctx, baseTypeNode) => JsonSchemaBuilder.resolveUtilityBaseObjectSchema(ctx, baseTypeNode),\n\t\t\t(ctx, keysNode) => JsonSchemaBuilder.extractUtilityTypeKeys(ctx, keysNode)\n\t\t);\n\t}\n\n\t/**\n\t * Map Omit<T, K> to an object schema with selected keys removed.\n\t * @param context The generation context.\n\t * @param typeNode The Omit type reference.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapOmitUtilityType(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode\n\t): IJsonSchema | undefined {\n\t\treturn UtilityTypeSchemaMapper.mapOmitUtilityType(\n\t\t\tcontext,\n\t\t\ttypeNode,\n\t\t\t(ctx, baseTypeNode) => JsonSchemaBuilder.resolveUtilityBaseObjectSchema(ctx, baseTypeNode),\n\t\t\t(ctx, keysNode) => JsonSchemaBuilder.extractUtilityTypeKeys(ctx, keysNode)\n\t\t);\n\t}\n\n\t/**\n\t * Map Exclude<T, U> to a schema that removes U members from T.\n\t * @param context The generation context.\n\t * @param typeNode The Exclude type reference.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapExcludeUtilityType(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode\n\t): IJsonSchema | undefined {\n\t\treturn UtilityTypeSchemaMapper.mapExcludeUtilityType(context, typeNode, (ctx, node) =>\n\t\t\tJsonSchemaBuilder.mapTypeNodeToSchema(ctx, node)\n\t\t);\n\t}\n\n\t/**\n\t * Map Extract<T, U> to a schema that keeps U members from T.\n\t * @param context The generation context.\n\t * @param typeNode The Extract type reference.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapExtractUtilityType(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode\n\t): IJsonSchema | undefined {\n\t\treturn UtilityTypeSchemaMapper.mapExtractUtilityType(context, typeNode, (ctx, node) =>\n\t\t\tJsonSchemaBuilder.mapTypeNodeToSchema(ctx, node)\n\t\t);\n\t}\n\n\t/**\n\t * Map NonNullable<T> by removing null and undefined branches from T.\n\t * @param context The generation context.\n\t * @param typeNode The NonNullable type reference.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapNonNullableUtilityType(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode\n\t): IJsonSchema | undefined {\n\t\treturn UtilityTypeSchemaMapper.mapNonNullableUtilityType(context, typeNode, (ctx, node) =>\n\t\t\tJsonSchemaBuilder.mapTypeNodeToSchema(ctx, node)\n\t\t);\n\t}\n\n\t/**\n\t * Map Record<K, V> to an object schema with key constraints where possible.\n\t * @param context The generation context.\n\t * @param typeNode The Record type reference.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapRecordUtilityType(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode\n\t): IJsonSchema | undefined {\n\t\treturn UtilityTypeSchemaMapper.mapRecordUtilityType(context, typeNode, (ctx, node) =>\n\t\t\tJsonSchemaBuilder.mapTypeNodeToSchema(ctx, node)\n\t\t);\n\t}\n\n\t/**\n\t * Determine whether a type node represents null or undefined.\n\t * @param typeNode The type node.\n\t * @returns True if the node is null or undefined.\n\t */\n\tpublic static isNullOrUndefinedTypeNode(typeNode: ts.TypeNode): boolean {\n\t\tif (\n\t\t\t// null or undefined (keyword type nodes)\n\t\t\ttypeNode.kind === ts.SyntaxKind.NullKeyword ||\n\t\t\ttypeNode.kind === ts.SyntaxKind.UndefinedKeyword\n\t\t) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// null (literal type wrapping the null keyword, e.g. from union members)\n\t\tif (ts.isLiteralTypeNode(typeNode)) {\n\t\t\treturn typeNode.literal.kind === ts.SyntaxKind.NullKeyword;\n\t\t}\n\n\t\t// undefined (type reference whose name is the identifier \"undefined\")\n\t\tif (ts.isTypeReferenceNode(typeNode) && ts.isIdentifier(typeNode.typeName)) {\n\t\t\treturn typeNode.typeName.text === \"undefined\";\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Extract literal keys from a Record key type argument.\n\t * @param keyTypeNode The key type argument node.\n\t * @returns The extracted literal keys.\n\t */\n\tpublic static extractRecordLiteralKeys(keyTypeNode: ts.TypeNode): string[] {\n\t\t// \"key\" (single string literal key type, e.g. Record<\"key\", V>)\n\t\tif (ts.isLiteralTypeNode(keyTypeNode) && ts.isStringLiteral(keyTypeNode.literal)) {\n\t\t\treturn [keyTypeNode.literal.text];\n\t\t}\n\n\t\t// \"a\" | \"b\" | \"c\" (union of string literal key types)\n\t\tif (ts.isUnionTypeNode(keyTypeNode)) {\n\t\t\tconst keys = keyTypeNode.types\n\t\t\t\t// \"key\" (each member must be a string literal type)\n\t\t\t\t.filter(type => ts.isLiteralTypeNode(type) && ts.isStringLiteral(type.literal))\n\t\t\t\t.map(type => (type as ts.LiteralTypeNode).literal as ts.StringLiteral)\n\t\t\t\t.map(literal => literal.text);\n\t\t\treturn keys.length === keyTypeNode.types.length ? keys : [];\n\t\t}\n\n\t\treturn [];\n\t}\n\n\t/**\n\t * Map JsonLdObject utility types using key-removal and optional key-addition rules.\n\t * @param context The generation context.\n\t * @param typeNode The JsonLdObject utility type reference.\n\t * @param options Mapping options.\n\t * @param options.keysToRemove Keys to remove from the base schema.\n\t * @param options.keyToAdd Optional key to add to the base schema.\n\t * @param options.isAddedKeyRequired Whether the added key should be required.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapJsonLdObjectUtilityType(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode,\n\t\toptions: {\n\t\t\tkeysToRemove: string[];\n\t\t\tkeyToAdd?: \"id\" | \"@id\" | \"type\" | \"@type\" | \"@context\";\n\t\t\tisAddedKeyRequired?: boolean;\n\t\t}\n\t): IJsonSchema | undefined {\n\t\treturn UtilityTypeSchemaMapper.mapJsonLdObjectUtilityType(\n\t\t\tcontext,\n\t\t\ttypeNode,\n\t\t\toptions,\n\t\t\t(ctx, baseTypeNode) => JsonSchemaBuilder.resolveUtilityBaseObjectSchema(ctx, baseTypeNode),\n\t\t\t(ctx, node) => JsonSchemaBuilder.mapTypeNodeToSchema(ctx, node)\n\t\t);\n\t}\n\n\t/**\n\t * Resolve a default schema for JsonLdObject utility key additions when the type argument is omitted.\n\t * @param baseSchema The base object schema.\n\t * @param keyToAdd The key being added by the utility.\n\t * @returns The resolved schema.\n\t */\n\tpublic static mapJsonLdObjectDefaultSchemaByKey(\n\t\tbaseSchema: IJsonSchema,\n\t\tkeyToAdd: \"id\" | \"@id\" | \"type\" | \"@type\" | \"@context\"\n\t): IJsonSchema {\n\t\tif (keyToAdd === \"id\" || keyToAdd === \"@id\") {\n\t\t\treturn JsonSchemaBuilder.mapJsonLdObjectWithIdDefaultIdSchema(baseSchema);\n\t\t}\n\n\t\tif (keyToAdd === \"@context\") {\n\t\t\treturn JsonSchemaBuilder.mapJsonLdObjectWithContextDefaultContextSchema(baseSchema);\n\t\t}\n\n\t\treturn JsonSchemaBuilder.mapJsonLdObjectWithTypeDefaultTypeSchema(baseSchema);\n\t}\n\n\t/**\n\t * Resolve default id schema for JsonLdObjectWithId when Id type argument is omitted.\n\t * @param baseSchema The base object schema.\n\t * @returns The resolved id schema.\n\t */\n\tpublic static mapJsonLdObjectWithIdDefaultIdSchema(baseSchema: IJsonSchema): IJsonSchema {\n\t\treturn JsonSchemaBuilder.mapJsonLdObjectDefaultEitherSchema(baseSchema, \"id\", \"@id\", {\n\t\t\ttype: \"string\"\n\t\t});\n\t}\n\n\t/**\n\t * Resolve default type schema for JsonLdObjectWithType when Type argument is omitted.\n\t * @param baseSchema The base object schema.\n\t * @returns The resolved type schema.\n\t */\n\tpublic static mapJsonLdObjectWithTypeDefaultTypeSchema(baseSchema: IJsonSchema): IJsonSchema {\n\t\treturn JsonSchemaBuilder.mapJsonLdObjectDefaultEitherSchema(baseSchema, \"type\", \"@type\", {\n\t\t\tanyOf: [{ type: \"string\" }, { type: \"array\", items: { type: \"string\" } }]\n\t\t});\n\t}\n\n\t/**\n\t * Resolve default context schema for JsonLdObjectWithContext when Context argument is omitted.\n\t * @param baseSchema The base object schema.\n\t * @returns The resolved context schema.\n\t */\n\tpublic static mapJsonLdObjectWithContextDefaultContextSchema(\n\t\tbaseSchema: IJsonSchema\n\t): IJsonSchema {\n\t\treturn JsonSchemaBuilder.mapJsonLdObjectDefaultEitherSchema(\n\t\t\tbaseSchema,\n\t\t\t\"@context\",\n\t\t\t\"@context\",\n\t\t\t{\n\t\t\t\ttype: \"array\",\n\t\t\t\titems: { type: \"string\" }\n\t\t\t}\n\t\t);\n\t}\n\n\t/**\n\t * Resolve default schema from either of two source keys, with fallback when both are absent.\n\t * @param baseSchema The base object schema.\n\t * @param firstKey The primary key to resolve.\n\t * @param secondKey The secondary key to resolve.\n\t * @param fallbackSchema The fallback schema.\n\t * @returns The resolved schema.\n\t */\n\tpublic static mapJsonLdObjectDefaultEitherSchema(\n\t\tbaseSchema: IJsonSchema,\n\t\tfirstKey: string,\n\t\tsecondKey: string,\n\t\tfallbackSchema: IJsonSchema\n\t): IJsonSchema {\n\t\tconst firstSchema = ObjectTransformer.resolvePropertySchemaFromObjectSchema(\n\t\t\tbaseSchema,\n\t\t\tfirstKey\n\t\t);\n\t\tconst secondSchema = ObjectTransformer.resolvePropertySchemaFromObjectSchema(\n\t\t\tbaseSchema,\n\t\t\tsecondKey\n\t\t);\n\n\t\tif (firstSchema && secondSchema) {\n\t\t\tif (JsonHelper.canonicalize(firstSchema) === JsonHelper.canonicalize(secondSchema)) {\n\t\t\t\treturn firstSchema;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tanyOf: [firstSchema, secondSchema]\n\t\t\t};\n\t\t}\n\n\t\tif (firstSchema) {\n\t\t\treturn firstSchema;\n\t\t}\n\n\t\tif (secondSchema) {\n\t\t\treturn secondSchema;\n\t\t}\n\n\t\treturn fallbackSchema;\n\t}\n\n\t/**\n\t * Map ObjectOrArray<T> to a schema accepting T or T[].\n\t * @param context The generation context.\n\t * @param typeNode The ObjectOrArray type reference.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapObjectOrArrayUtilityType(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode\n\t): IJsonSchema | undefined {\n\t\treturn UtilityTypeSchemaMapper.mapObjectOrArrayUtilityType(context, typeNode, (ctx, node) =>\n\t\t\tJsonSchemaBuilder.mapTypeNodeToSchema(ctx, node)\n\t\t);\n\t}\n\n\t/**\n\t * Map SingleOccurrenceArray<T, U> to a non-empty array containing exactly one U.\n\t * @param context The generation context.\n\t * @param typeNode The SingleOccurrenceArray type reference.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapSingleOccurrenceArrayUtilityType(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode\n\t): IJsonSchema | undefined {\n\t\treturn UtilityTypeSchemaMapper.mapSingleOccurrenceArrayUtilityType(\n\t\t\tcontext,\n\t\t\ttypeNode,\n\t\t\t(ctx, node) => JsonSchemaBuilder.mapTypeNodeToSchema(ctx, node)\n\t\t);\n\t}\n\n\t/**\n\t * Add a comment to schemas inlined for utility type transformations.\n\t * @param schema The schema to annotate.\n\t * @param baseTypeDescription The utility base type description.\n\t * @returns The annotated schema.\n\t */\n\tpublic static annotateUtilityInlineSchema(\n\t\tschema: IJsonSchema,\n\t\tbaseTypeDescription: string\n\t): IJsonSchema {\n\t\tconst annotatedSchema = ObjectHelper.clone(schema);\n\t\tannotatedSchema.$comment ??= `Inlined utility base type ${baseTypeDescription} so utility transformations can operate on concrete properties instead of a $ref.`;\n\t\treturn annotatedSchema;\n\t}\n\n\t/**\n\t * Resolve a utility base type node to an object schema.\n\t * @param context The generation context.\n\t * @param baseTypeNode The utility base type node.\n\t * @returns The resolved object schema.\n\t * @throws GeneralError when a named type reference cannot be resolved to a schema.\n\t */\n\tpublic static resolveUtilityBaseObjectSchema(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tbaseTypeNode: ts.TypeNode\n\t): IJsonSchema | undefined {\n\t\t// Guard against recursive utility type resolution cycles\n\t\t// This prevents infinite loops when processing complex types with indexed access and keyof\n\t\tcontext.resolvingUtilityTypes ??= new Set<string>();\n\n\t\t// { prop: string } (inline type literal as the base of the utility type)\n\t\tif (ts.isTypeLiteralNode(baseTypeNode)) {\n\t\t\treturn JsonSchemaBuilder.buildTypeLiteralSchema(context, baseTypeNode);\n\t\t}\n\n\t\t// BaseType (named type reference as the base of the utility type)\n\t\tif (ts.isTypeReferenceNode(baseTypeNode)) {\n\t\t\t// BaseType (plain identifier) vs Namespace.BaseType (qualified name)\n\t\t\tconst typeName = ts.isIdentifier(baseTypeNode.typeName)\n\t\t\t\t? baseTypeNode.typeName.text\n\t\t\t\t: baseTypeNode.typeName.right.text;\n\t\t\tconst baseTypeDescription = StringHelper.stripPrefix(typeName);\n\n\t\t\t// Prevent recursive processing of the same utility base type\n\t\t\tif (context.resolvingUtilityTypes.has(typeName)) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst utilityHandler = JsonSchemaBuilder._utilityTypeHandlers[typeName];\n\t\t\tif (utilityHandler) {\n\t\t\t\tcontext.resolvingUtilityTypes.add(typeName);\n\t\t\t\ttry {\n\t\t\t\t\tconst utilitySchema = utilityHandler(context, baseTypeNode);\n\t\t\t\t\tconst resolvedUtilitySchema = utilitySchema\n\t\t\t\t\t\t? JsonSchemaBuilder.resolveMappedUtilityBaseObjectSchema(context, utilitySchema)\n\t\t\t\t\t\t: undefined;\n\t\t\t\t\tif (resolvedUtilitySchema) {\n\t\t\t\t\t\treturn JsonSchemaBuilder.annotateUtilityInlineSchema(\n\t\t\t\t\t\t\tresolvedUtilitySchema,\n\t\t\t\t\t\t\tbaseTypeDescription\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} finally {\n\t\t\t\t\tcontext.resolvingUtilityTypes.delete(typeName);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst typeParameterBinding = JsonSchemaBuilder.getTypeParameterBinding(context, typeName);\n\t\t\tif (typeParameterBinding !== undefined) {\n\t\t\t\treturn typeParameterBinding\n\t\t\t\t\t? JsonSchemaBuilder.resolveUtilityBaseObjectSchema(context, typeParameterBinding)\n\t\t\t\t\t: undefined;\n\t\t\t}\n\t\t\tconst directSchema = JsonSchemaBuilder.resolveObjectTypeSchemaForUtility(context, typeName);\n\n\t\t\tif (directSchema) {\n\t\t\t\tconst expandedSchema = JsonSchemaBuilder.expandAllOfReferences(\n\t\t\t\t\tcontext,\n\t\t\t\t\tdirectSchema,\n\t\t\t\t\tStringHelper.stripPrefix(typeName)\n\t\t\t\t);\n\t\t\t\treturn JsonSchemaBuilder.annotateUtilityInlineSchema(expandedSchema, baseTypeDescription);\n\t\t\t}\n\t\t}\n\n\t\tconst mappedSchema = JsonSchemaBuilder.mapTypeNodeToSchema(context, baseTypeNode);\n\t\tif (mappedSchema) {\n\t\t\t// If we got a $ref, try to resolve it to an actual object schema\n\t\t\tif (mappedSchema.$ref) {\n\t\t\t\tconst resolvedSchema = JsonSchemaBuilder.resolveMappedUtilityBaseObjectSchema(\n\t\t\t\t\tcontext,\n\t\t\t\t\tmappedSchema\n\t\t\t\t);\n\t\t\t\tif (resolvedSchema) {\n\t\t\t\t\treturn JsonSchemaBuilder.annotateUtilityInlineSchema(\n\t\t\t\t\t\tresolvedSchema,\n\t\t\t\t\t\tbaseTypeNode.getText()\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t// $ref exists but can't be expanded to an inline object schema (e.g. the type\n\t\t\t\t// maps to an external schema URL). Return undefined so the utility type handler\n\t\t\t\t// degrades gracefully rather than throwing; the type is known, just not inlineable.\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\t// If we got a direct schema (non-$ref), try to resolve it as an object\n\t\t\tconst resolvedSchema = JsonSchemaBuilder.resolveMappedUtilityBaseObjectSchema(\n\t\t\t\tcontext,\n\t\t\t\tmappedSchema\n\t\t\t);\n\t\t\tif (resolvedSchema) {\n\t\t\t\treturn JsonSchemaBuilder.annotateUtilityInlineSchema(\n\t\t\t\t\tresolvedSchema,\n\t\t\t\t\tbaseTypeNode.getText()\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// mapTypeNodeToSchema produced nothing at all - the type is genuinely unknown.\n\t\t// For named type references that are not part of a recursive resolution cycle, throw.\n\t\tif (ts.isTypeReferenceNode(baseTypeNode)) {\n\t\t\tconst typeName = ts.isIdentifier(baseTypeNode.typeName)\n\t\t\t\t? baseTypeNode.typeName.text\n\t\t\t\t: baseTypeNode.typeName.right.text;\n\t\t\tif (!context.resolvingUtilityTypes?.has(typeName)) {\n\t\t\t\tconst importedTypeReference = JsonSchemaBuilder.findImportedTypeReference(\n\t\t\t\t\tcontext,\n\t\t\t\t\ttypeName\n\t\t\t\t);\n\t\t\t\tconst importSource = importedTypeReference?.moduleSpecifier ?? \"\";\n\t\t\t\tthrow new GeneralError(JsonSchemaBuilder.CLASS_NAME, \"missingTypeReferenceSchema\", {\n\t\t\t\t\ttypeName,\n\t\t\t\t\timportSource: importSource ? ` from module \"${importSource}\"` : \"\"\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Resolve a mapped utility schema to an object schema when possible.\n\t * @param context The generation context.\n\t * @param mappedSchema The mapped schema.\n\t * @returns The resolved object schema.\n\t */\n\tpublic static resolveMappedUtilityBaseObjectSchema(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tmappedSchema: IJsonSchema\n\t): IJsonSchema | undefined {\n\t\tif (mappedSchema.type === \"object\" && mappedSchema.properties) {\n\t\t\treturn ObjectHelper.clone(mappedSchema);\n\t\t}\n\n\t\tif (mappedSchema.$ref) {\n\t\t\tfor (const packageSchemaEntries of Object.values(context.schemas)) {\n\t\t\t\tfor (const referencedSchema of Object.values(packageSchemaEntries)) {\n\t\t\t\t\tif (\n\t\t\t\t\t\treferencedSchema.$id === mappedSchema.$ref &&\n\t\t\t\t\t\treferencedSchema.type === \"object\" &&\n\t\t\t\t\t\treferencedSchema.properties\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn JsonSchemaBuilder.expandAllOfReferences(\n\t\t\t\t\t\t\tcontext,\n\t\t\t\t\t\t\tObjectHelper.clone(referencedSchema),\n\t\t\t\t\t\t\treferencedSchema.title\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Fall back to resolving by ref title in case a schema was registered\n\t\t\t// without a matching $id, or the ref has been normalised differently.\n\t\t\tconst refTitle = mappedSchema.$ref.split(\"/\").pop();\n\t\t\tif (refTitle) {\n\t\t\t\tconst localRefSchema = context.schemas[context.packageName]?.[refTitle];\n\t\t\t\tif (localRefSchema?.type === \"object\" && localRefSchema.properties) {\n\t\t\t\t\treturn JsonSchemaBuilder.expandAllOfReferences(\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t\tObjectHelper.clone(localRefSchema),\n\t\t\t\t\t\tlocalRefSchema.title ?? refTitle\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tfor (const packageSchemaEntries of Object.values(context.schemas)) {\n\t\t\t\t\tconst refSchema = packageSchemaEntries[refTitle];\n\t\t\t\t\tif (refSchema?.type === \"object\" && refSchema.properties) {\n\t\t\t\t\t\treturn JsonSchemaBuilder.expandAllOfReferences(\n\t\t\t\t\t\t\tcontext,\n\t\t\t\t\t\t\tObjectHelper.clone(refSchema),\n\t\t\t\t\t\t\trefSchema.title ?? refTitle\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Expand allOf references in a schema by inlining referenced schemas.\n\t * This handles inheritance cases where a type extends another type.\n\t * When applying utility operations (Omit, Pick) to types with allOf inheritance,\n\t * the referenced schemas must be expanded so properties are available for omit/pick.\n\t * @param context The generation context.\n\t * @param schema The schema potentially containing allOf with references.\n\t * @param currentSchemaTitle The title of the current schema being processed, used for $comment annotations.\n\t * @returns The schema with expanded references merged into properties.\n\t */\n\tpublic static expandAllOfReferences(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tschema: IJsonSchema,\n\t\tcurrentSchemaTitle?: string\n\t): IJsonSchema {\n\t\tif (!Is.array(schema.allOf) || schema.allOf.length === 0) {\n\t\t\treturn schema;\n\t\t}\n\n\t\tconst expandedSchema = ObjectHelper.clone(schema);\n\t\tconst mergedProperties: { [key: string]: IJsonSchema } = {};\n\t\tconst inheritedPropertySources: { [key: string]: string } = {};\n\t\tconst mergedRequired = new Set<string>();\n\t\tconst allOf = Is.array(expandedSchema.allOf) ? expandedSchema.allOf : [];\n\n\t\t// Expand all allOf branches\n\t\tfor (const branch of allOf) {\n\t\t\tif (Is.object(branch)) {\n\t\t\t\tconst branchRecord = branch as { [key: string]: unknown };\n\t\t\t\tlet branchSourceTitle: string | undefined;\n\t\t\t\tlet referencedSchema: IJsonSchema | undefined;\n\n\t\t\t\t// If the branch is a reference, resolve it\n\t\t\t\tif (Is.stringValue(branchRecord.$ref) && !branchRecord.properties) {\n\t\t\t\t\tconst refTitle = branchRecord.$ref.split(\"/\").pop();\n\t\t\t\t\tif (refTitle) {\n\t\t\t\t\t\t// Look up the referenced schema in the context\n\t\t\t\t\t\treferencedSchema =\n\t\t\t\t\t\t\tcontext.schemas[context.packageName]?.[refTitle] ??\n\t\t\t\t\t\t\tObject.values(context.schemas)\n\t\t\t\t\t\t\t\t.flatMap(entries => Object.values(entries))\n\t\t\t\t\t\t\t\t.find(s => s.$id === branchRecord.$ref || s.title === refTitle);\n\n\t\t\t\t\t\treferencedSchema ??= JsonSchemaBuilder.tryLoadExternalSchemaByTitle(context, refTitle);\n\n\t\t\t\t\t\tif (referencedSchema) {\n\t\t\t\t\t\t\tbranchSourceTitle = referencedSchema.title ?? refTitle;\n\t\t\t\t\t\t\treferencedSchema = JsonSchemaBuilder.expandAllOfReferences(\n\t\t\t\t\t\t\t\tcontext,\n\t\t\t\t\t\t\t\treferencedSchema,\n\t\t\t\t\t\t\t\tbranchSourceTitle\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t// Merge properties from the referenced schema\n\t\t\t\t\t\t\tif (Is.object(referencedSchema.properties)) {\n\t\t\t\t\t\t\t\tfor (const [propertyKey, propertySchema] of Object.entries(\n\t\t\t\t\t\t\t\t\treferencedSchema.properties\n\t\t\t\t\t\t\t\t)) {\n\t\t\t\t\t\t\t\t\tmergedProperties[propertyKey] = ObjectHelper.clone(propertySchema);\n\t\t\t\t\t\t\t\t\tif (branchSourceTitle) {\n\t\t\t\t\t\t\t\t\t\tinheritedPropertySources[propertyKey] = branchSourceTitle;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Collect required fields from the referenced schema\n\t\t\t\t\t\t\tif (Is.array(referencedSchema.required)) {\n\t\t\t\t\t\t\t\tfor (const field of referencedSchema.required) {\n\t\t\t\t\t\t\t\t\tif (Is.stringValue(field)) {\n\t\t\t\t\t\t\t\t\t\tmergedRequired.add(field);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Merge properties from direct schema in allOf\n\t\t\t\t\tif (Is.object(branchRecord.properties)) {\n\t\t\t\t\t\tfor (const [propertyKey, propertySchema] of Object.entries(branchRecord.properties)) {\n\t\t\t\t\t\t\tif (Is.object(propertySchema)) {\n\t\t\t\t\t\t\t\tmergedProperties[propertyKey] = ObjectHelper.clone(propertySchema as IJsonSchema);\n\t\t\t\t\t\t\t\tif (branchSourceTitle) {\n\t\t\t\t\t\t\t\t\tinheritedPropertySources[propertyKey] = branchSourceTitle;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// Merge required fields\n\t\t\t\t\tif (Is.array(branchRecord.required)) {\n\t\t\t\t\t\tfor (const field of branchRecord.required) {\n\t\t\t\t\t\t\tif (Is.stringValue(field)) {\n\t\t\t\t\t\t\t\tmergedRequired.add(field);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// If we expanded any references, merge them into the schema\n\t\tif (Object.keys(mergedProperties).length > 0 || mergedRequired.size > 0) {\n\t\t\tif (Object.keys(mergedProperties).length > 0) {\n\t\t\t\t// Step 1: stamp $comment on base (merged) properties that arrived via $ref expansion.\n\t\t\t\t// The guard `!propertySchema.$comment` ensures that a comment set by a deeper\n\t\t\t\t// ancestor during a recursive call is never overwritten by a shallower ancestor.\n\t\t\t\tfor (const [propertyKey, propertySchema] of Object.entries(mergedProperties)) {\n\t\t\t\t\tconst inheritedSource = inheritedPropertySources[propertyKey];\n\t\t\t\t\tif (inheritedSource && !propertySchema.$comment) {\n\t\t\t\t\t\tpropertySchema.$comment = `Inherited from ${inheritedSource}`;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Step 2: stamp $comment on the derived type's own properties so that consumers\n\t\t\t\t// of the expanded schema know which type introduced each property. The `??=`\n\t\t\t\t// guard preserves any $comment already written by a deeper recursive call.\n\t\t\t\tif (currentSchemaTitle && Is.object(expandedSchema.properties)) {\n\t\t\t\t\tfor (const [propertyKey, propertySchema] of Object.entries(expandedSchema.properties)) {\n\t\t\t\t\t\tif (Is.object(propertySchema)) {\n\t\t\t\t\t\t\tconst typedPropertySchema = propertySchema;\n\t\t\t\t\t\t\ttypedPropertySchema.$comment ??= `Inherited from ${currentSchemaTitle}`;\n\t\t\t\t\t\t\tinheritedPropertySources[propertyKey] = currentSchemaTitle;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Step 3: merge — base properties first, derived properties on top so that a\n\t\t\t\t// derived type can override a base property (key order: base insertion order,\n\t\t\t\t// values from the derived spread win for overlapping keys).\n\t\t\t\texpandedSchema.properties = {\n\t\t\t\t\t...mergedProperties,\n\t\t\t\t\t...(expandedSchema.properties ?? {})\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (mergedRequired.size > 0 || Is.array(expandedSchema.required)) {\n\t\t\t\t// Build required array in property order: first merged, then existing\n\t\t\t\tconst resultRequired: string[] = [];\n\t\t\t\tconst mergedRequiredSet = new Set(mergedRequired);\n\t\t\t\tconst existingRequired = Is.array(expandedSchema.required) ? expandedSchema.required : [];\n\n\t\t\t\t// Add merged required fields in property order\n\t\t\t\tfor (const key of Object.keys(expandedSchema.properties ?? {})) {\n\t\t\t\t\tif (mergedRequiredSet.has(key)) {\n\t\t\t\t\t\tresultRequired.push(key);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Add existing required fields that aren't in merged\n\t\t\t\tfor (const key of existingRequired) {\n\t\t\t\t\tif (Is.stringValue(key) && !mergedRequiredSet.has(key)) {\n\t\t\t\t\t\tresultRequired.push(key);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (resultRequired.length > 0) {\n\t\t\t\t\texpandedSchema.required = resultRequired;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Remove allOf since we've expanded everything\n\t\t\tdelete expandedSchema.allOf;\n\t\t}\n\n\t\treturn expandedSchema;\n\t}\n\n\t/**\n\t * Attempt to load an external schema by title from imported module declarations.\n\t * @param context The generation context.\n\t * @param schemaTitle The schema title.\n\t * @returns The loaded schema.\n\t */\n\tpublic static tryLoadExternalSchemaByTitle(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tschemaTitle: string\n\t): IJsonSchema | undefined {\n\t\tconst existingSchema = Object.values(context.schemas)\n\t\t\t.flatMap(entries => Object.values(entries))\n\t\t\t.find(schema => schema.title === schemaTitle || schema.$id?.endsWith(`/${schemaTitle}`));\n\t\tif (existingSchema) {\n\t\t\treturn ObjectHelper.clone(existingSchema);\n\t\t}\n\n\t\tconst sourceFile = context.activeSourceFile;\n\t\tif (!sourceFile) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst moduleSpecifiers = [\n\t\t\t...new Set(\n\t\t\t\tsourceFile.statements\n\t\t\t\t\t.filter((statement): statement is ts.ImportDeclaration =>\n\t\t\t\t\t\tts.isImportDeclaration(statement)\n\t\t\t\t\t)\n\t\t\t\t\t.flatMap(statement => {\n\t\t\t\t\t\tif (!ts.isStringLiteral(statement.moduleSpecifier)) {\n\t\t\t\t\t\t\treturn [];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst moduleSpecifier = statement.moduleSpecifier.text;\n\t\t\t\t\t\treturn moduleSpecifier.startsWith(\".\") ? [] : [moduleSpecifier];\n\t\t\t\t\t})\n\t\t\t)\n\t\t];\n\n\t\tconst candidateTypeNames = [`I${schemaTitle}`, schemaTitle];\n\n\t\tfor (const moduleSpecifier of moduleSpecifiers) {\n\t\t\tfor (const candidateTypeName of candidateTypeNames) {\n\t\t\t\tconst declarationResult = Resolver.resolveTypeDeclarationAst(\n\t\t\t\t\tmoduleSpecifier,\n\t\t\t\t\tcandidateTypeName\n\t\t\t\t);\n\t\t\t\tif (declarationResult) {\n\t\t\t\t\tconst mappedReference = JsonSchemaBuilder.resolveReferenceMappingTarget(\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t\tmoduleSpecifier,\n\t\t\t\t\t\tcandidateTypeName\n\t\t\t\t\t);\n\n\t\t\t\t\tconst externalContext: ITypeScriptToSchemaContext = {\n\t\t\t\t\t\tnamespace: mappedReference?.namespace ?? context.namespace,\n\t\t\t\t\t\tpackageName: moduleSpecifier,\n\t\t\t\t\t\tschemas: context.schemas,\n\t\t\t\t\t\tactiveSourceFile: context.activeSourceFile,\n\t\t\t\t\t\toptions: context.options\n\t\t\t\t\t};\n\n\t\t\t\t\tJsonSchemaBuilder.parseAllObjectSchemas(\n\t\t\t\t\t\texternalContext,\n\t\t\t\t\t\tdeclarationResult.sourceFile.fileName,\n\t\t\t\t\t\tdeclarationResult.sourceFile.getFullText(),\n\t\t\t\t\t\t[]\n\t\t\t\t\t);\n\n\t\t\t\t\tconst loadedSchema =\n\t\t\t\t\t\tcontext.schemas[moduleSpecifier]?.[schemaTitle] ??\n\t\t\t\t\t\tObject.values(context.schemas[moduleSpecifier] ?? {}).find(\n\t\t\t\t\t\t\tschema => schema.title === schemaTitle || schema.$id?.endsWith(`/${schemaTitle}`)\n\t\t\t\t\t\t);\n\n\t\t\t\t\tif (loadedSchema) {\n\t\t\t\t\t\treturn ObjectHelper.clone(loadedSchema);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Resolve an object schema for utility type application.\n\t * @param context The generation context.\n\t * @param typeName The referenced type name.\n\t * @returns The resolved object schema.\n\t */\n\tpublic static resolveObjectTypeSchemaForUtility(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeName: string\n\t): IJsonSchema | undefined {\n\t\tconst typeParameterBinding = JsonSchemaBuilder.getTypeParameterBinding(context, typeName);\n\t\tif (typeParameterBinding !== undefined) {\n\t\t\treturn typeParameterBinding\n\t\t\t\t? JsonSchemaBuilder.resolveUtilityBaseObjectSchema(context, typeParameterBinding)\n\t\t\t\t: undefined;\n\t\t}\n\n\t\tconst title = StringHelper.stripPrefix(typeName);\n\t\tconst localSchema = context.schemas[context.packageName]?.[title];\n\n\t\tif (localSchema?.type === \"object\" && localSchema.properties) {\n\t\t\treturn ObjectHelper.clone(localSchema);\n\t\t}\n\n\t\tconst declarationSchema = JsonSchemaBuilder.mapObjectTypeFromLocalDeclaration(\n\t\t\tcontext,\n\t\t\ttypeName\n\t\t);\n\t\tif (declarationSchema) {\n\t\t\treturn declarationSchema;\n\t\t}\n\n\t\tfor (const packageEntry of Object.values(context.schemas)) {\n\t\t\tconst packageSchema = packageEntry[title];\n\t\t\tif (packageSchema?.type === \"object\" && packageSchema.properties) {\n\t\t\t\treturn ObjectHelper.clone(packageSchema);\n\t\t\t}\n\t\t}\n\n\t\tconst importedTypeReference = JsonSchemaBuilder.findImportedTypeReference(context, typeName);\n\t\tif (importedTypeReference) {\n\t\t\tconst importedSchema = JsonSchemaBuilder.resolveImportedObjectTypeSchemaForUtility(\n\t\t\t\tcontext,\n\t\t\t\timportedTypeReference.moduleSpecifier,\n\t\t\t\timportedTypeReference.candidateTypeName,\n\t\t\t\ttitle\n\t\t\t);\n\t\t\tif (importedSchema) {\n\t\t\t\treturn importedSchema;\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Find an imported type reference from the active source file by local or exported symbol name.\n\t * @param context The generation context.\n\t * @param typeName The local or exported type name to find.\n\t * @returns The module specifier and exported candidate type name when found.\n\t */\n\tpublic static findImportedTypeReference(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeName: string\n\t): { moduleSpecifier: string; candidateTypeName: string } | undefined {\n\t\tif (!context.activeSourceFile) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tfor (const statement of context.activeSourceFile.statements) {\n\t\t\tif (ts.isImportDeclaration(statement) && ts.isStringLiteral(statement.moduleSpecifier)) {\n\t\t\t\tif (\n\t\t\t\t\tstatement.importClause?.namedBindings &&\n\t\t\t\t\tts.isNamedImports(statement.importClause.namedBindings)\n\t\t\t\t) {\n\t\t\t\t\tconst importedElement = Array.from(statement.importClause.namedBindings.elements).find(\n\t\t\t\t\t\te => e.name.text === typeName || (e.propertyName?.text ?? e.name.text) === typeName\n\t\t\t\t\t);\n\t\t\t\t\tif (importedElement) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tmoduleSpecifier: statement.moduleSpecifier.text,\n\t\t\t\t\t\t\tcandidateTypeName: importedElement.propertyName?.text ?? importedElement.name.text\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Resolve an imported object schema for utility type application.\n\t * @param context The generation context.\n\t * @param moduleSpecifier The module where the type is imported from.\n\t * @param candidateTypeName The exported candidate type name.\n\t * @param title The stripped title of the requested type.\n\t * @returns The resolved object schema.\n\t */\n\tpublic static resolveImportedObjectTypeSchemaForUtility(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tmoduleSpecifier: string,\n\t\tcandidateTypeName: string,\n\t\ttitle: string\n\t): IJsonSchema | undefined {\n\t\tcontext.resolvingImportedObjectSchemas ??= new Set<string>();\n\t\tconst resolvingKey = `${context.packageName}:${moduleSpecifier}:${candidateTypeName}`;\n\t\tif (context.resolvingImportedObjectSchemas.has(resolvingKey)) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tcontext.resolvingImportedObjectSchemas.add(resolvingKey);\n\t\ttry {\n\t\t\tif (moduleSpecifier.startsWith(\".\")) {\n\t\t\t\tif (!context.activeSourceFile) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\n\t\t\t\tconst resolvedImportPath = JsonSchemaBuilder.resolveImportDeclarationSourceFile(\n\t\t\t\t\tcontext.activeSourceFile.fileName,\n\t\t\t\t\tmoduleSpecifier\n\t\t\t\t);\n\t\t\t\tif (!resolvedImportPath) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\n\t\t\t\tconst importedSource = FileUtils.readFile(resolvedImportPath);\n\t\t\t\tif (!importedSource) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\n\t\t\t\tJsonSchemaBuilder.parseAllObjectSchemas(context, resolvedImportPath, importedSource, []);\n\n\t\t\t\tconst localLoadedSchema =\n\t\t\t\t\tcontext.schemas[context.packageName]?.[title] ??\n\t\t\t\t\tcontext.schemas[context.packageName]?.[StringHelper.stripPrefix(candidateTypeName)] ??\n\t\t\t\t\tObject.values(context.schemas[context.packageName] ?? {}).find(\n\t\t\t\t\t\ts =>\n\t\t\t\t\t\t\ts.title === title ||\n\t\t\t\t\t\t\ts.title === StringHelper.stripPrefix(candidateTypeName) ||\n\t\t\t\t\t\t\ts.$id?.endsWith(`/${title}`)\n\t\t\t\t\t);\n\t\t\t\tif (localLoadedSchema?.type === \"object\" && localLoadedSchema.properties) {\n\t\t\t\t\treturn ObjectHelper.clone(localLoadedSchema);\n\t\t\t\t}\n\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst declarationResult = Resolver.resolveTypeDeclarationAst(\n\t\t\t\tmoduleSpecifier,\n\t\t\t\tcandidateTypeName\n\t\t\t);\n\t\t\tif (!declarationResult) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst mappedReference = JsonSchemaBuilder.resolveReferenceMappingTarget(\n\t\t\t\tcontext,\n\t\t\t\tmoduleSpecifier,\n\t\t\t\tcandidateTypeName\n\t\t\t);\n\t\t\tconst externalContext: ITypeScriptToSchemaContext = {\n\t\t\t\tnamespace: mappedReference?.namespace ?? context.namespace,\n\t\t\t\tpackageName: moduleSpecifier,\n\t\t\t\tschemas: context.schemas,\n\t\t\t\tactiveSourceFile: context.activeSourceFile,\n\t\t\t\tresolvingImportedObjectSchemas: context.resolvingImportedObjectSchemas,\n\t\t\t\toptions: context.options\n\t\t\t};\n\t\t\tJsonSchemaBuilder.parseAllObjectSchemas(\n\t\t\t\texternalContext,\n\t\t\t\tdeclarationResult.sourceFile.fileName,\n\t\t\t\tdeclarationResult.sourceFile.getFullText(),\n\t\t\t\t[]\n\t\t\t);\n\n\t\t\tconst loadedSchema =\n\t\t\t\tcontext.schemas[moduleSpecifier]?.[title] ??\n\t\t\t\tObject.values(context.schemas[moduleSpecifier] ?? {}).find(\n\t\t\t\t\ts => s.title === title || s.$id?.endsWith(`/${title}`)\n\t\t\t\t);\n\t\t\tif (loadedSchema?.type === \"object\" && loadedSchema.properties) {\n\t\t\t\treturn ObjectHelper.clone(loadedSchema);\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t} finally {\n\t\t\tcontext.resolvingImportedObjectSchemas.delete(resolvingKey);\n\t\t}\n\t}\n\n\t/**\n\t * Map a local interface or type alias declaration to an object schema.\n\t * @param context The generation context.\n\t * @param typeName The referenced type name.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapObjectTypeFromLocalDeclaration(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeName: string\n\t): IJsonSchema | undefined {\n\t\tconst sourceFile = context.activeSourceFile;\n\t\tif (!sourceFile) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tcontext.resolvingTypeNames ??= new Set<string>();\n\t\tif (context.resolvingTypeNames.has(typeName)) {\n\t\t\treturn {};\n\t\t}\n\n\t\tconst declaration = sourceFile.statements.find(statement => {\n\t\t\tif (ts.isInterfaceDeclaration(statement) || ts.isTypeAliasDeclaration(statement)) {\n\t\t\t\treturn statement.name.text === typeName;\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\n\t\tif (!declaration) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tcontext.resolvingTypeNames.add(typeName);\n\t\ttry {\n\t\t\tif (ts.isInterfaceDeclaration(declaration)) {\n\t\t\t\tconst boundContext = JsonSchemaBuilder.withTypeParameterBindings(\n\t\t\t\t\tcontext,\n\t\t\t\t\tdeclaration.typeParameters\n\t\t\t\t);\n\t\t\t\tconst { properties, required } = JsonSchemaBuilder.buildObjectMembersSchema(\n\t\t\t\t\tboundContext,\n\t\t\t\t\tdeclaration.members\n\t\t\t\t);\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"object\",\n\t\t\t\t\tproperties: Object.keys(properties).length > 0 ? properties : undefined,\n\t\t\t\t\trequired: required.length > 0 ? required : undefined\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (ts.isTypeAliasDeclaration(declaration) && ts.isTypeLiteralNode(declaration.type)) {\n\t\t\t\tconst boundContext = JsonSchemaBuilder.withTypeParameterBindings(\n\t\t\t\t\tcontext,\n\t\t\t\t\tdeclaration.typeParameters\n\t\t\t\t);\n\t\t\t\treturn JsonSchemaBuilder.buildTypeLiteralSchema(boundContext, declaration.type);\n\t\t\t}\n\t\t} finally {\n\t\t\tcontext.resolvingTypeNames.delete(typeName);\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Extract string literal keys from a utility type key argument (e.g. Pick or Omit).\n\t * @param context The generation context.\n\t * @param keysTypeNode The keys type node.\n\t * @returns The extracted keys.\n\t */\n\tpublic static extractUtilityTypeKeys(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tkeysTypeNode: ts.TypeNode | undefined\n\t): string[] {\n\t\tif (!keysTypeNode) {\n\t\t\treturn [];\n\t\t}\n\n\t\t// readonly T[] or keyof T (type operator node)\n\t\tif (ts.isTypeOperatorNode(keysTypeNode)) {\n\t\t\tif (keysTypeNode.operator === ts.SyntaxKind.ReadonlyKeyword) {\n\t\t\t\treturn JsonSchemaBuilder.extractUtilityTypeKeys(context, keysTypeNode.type);\n\t\t\t}\n\n\t\t\tif (keysTypeNode.operator === ts.SyntaxKind.KeyOfKeyword) {\n\t\t\t\treturn JsonSchemaBuilder.extractKeyofTypeKeys(context, keysTypeNode.type);\n\t\t\t}\n\t\t}\n\n\t\t// \"key\" (string literal type as a single key)\n\t\tif (ts.isLiteralTypeNode(keysTypeNode) && ts.isStringLiteral(keysTypeNode.literal)) {\n\t\t\treturn [keysTypeNode.literal.text];\n\t\t}\n\n\t\t// \"a\" | \"b\" (union of string literal keys)\n\t\tif (ts.isUnionTypeNode(keysTypeNode)) {\n\t\t\treturn (\n\t\t\t\tkeysTypeNode.types\n\t\t\t\t\t// \"key\" (only string literal type members are supported)\n\t\t\t\t\t.filter(type => ts.isLiteralTypeNode(type) && ts.isStringLiteral(type.literal))\n\t\t\t\t\t.map(type => (type as ts.LiteralTypeNode).literal as ts.StringLiteral)\n\t\t\t\t\t.map(literal => literal.text)\n\t\t\t);\n\t\t}\n\n\t\treturn [];\n\t}\n\n\t/**\n\t * Extract property keys from an indexed access index type.\n\t * @param context The generation context.\n\t * @param indexTypeNode The index type node.\n\t * @returns The extracted keys.\n\t */\n\tpublic static extractIndexedAccessKeys(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tindexTypeNode: ts.TypeNode\n\t): string[] {\n\t\t// \"key\" or 42 (literal type index)\n\t\tif (ts.isLiteralTypeNode(indexTypeNode)) {\n\t\t\t// \"key\" (string literal index)\n\t\t\tif (ts.isStringLiteral(indexTypeNode.literal)) {\n\t\t\t\treturn [indexTypeNode.literal.text];\n\t\t\t}\n\n\t\t\t// 0 (numeric literal index)\n\t\t\tif (ts.isNumericLiteral(indexTypeNode.literal)) {\n\t\t\t\treturn [indexTypeNode.literal.text];\n\t\t\t}\n\t\t}\n\n\t\t// \"a\" | \"b\" (union of index types, recurse into each branch)\n\t\tif (ts.isUnionTypeNode(indexTypeNode)) {\n\t\t\tconst keys = indexTypeNode.types.flatMap(unionType =>\n\t\t\t\tJsonSchemaBuilder.extractIndexedAccessKeys(context, unionType)\n\t\t\t);\n\t\t\treturn [...new Set(keys)];\n\t\t}\n\n\t\treturn JsonSchemaBuilder.extractUtilityTypeKeys(context, indexTypeNode);\n\t}\n\n\t/**\n\t * Extract keys for a mapped type constraint.\n\t * @param context The generation context.\n\t * @param constraintTypeNode The mapped type constraint.\n\t * @returns The extracted keys.\n\t */\n\tpublic static extractMappedTypeKeys(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tconstraintTypeNode: ts.TypeNode | undefined\n\t): string[] {\n\t\tif (!constraintTypeNode) {\n\t\t\treturn [];\n\t\t}\n\n\t\t// `prefix-${T}` (template literal constraint, keys cannot be statically enumerated)\n\t\tif (ts.isTemplateLiteralTypeNode(constraintTypeNode)) {\n\t\t\treturn [];\n\t\t}\n\n\t\t// TypeName (type reference constraint, resolve to its declaration)\n\t\tif (ts.isTypeReferenceNode(constraintTypeNode)) {\n\t\t\tconst referencedTypeNode = JsonSchemaBuilder.resolveReferencedTypeNodeFromLocalDeclaration(\n\t\t\t\tcontext,\n\t\t\t\tconstraintTypeNode\n\t\t\t);\n\t\t\tif (referencedTypeNode) {\n\t\t\t\treturn JsonSchemaBuilder.extractMappedTypeKeys(context, referencedTypeNode);\n\t\t\t}\n\t\t}\n\n\t\treturn JsonSchemaBuilder.extractUtilityTypeKeys(context, constraintTypeNode);\n\t}\n\n\t/**\n\t * Resolve a referenced type node from a local type alias declaration.\n\t * @param context The generation context.\n\t * @param typeNode The type reference node.\n\t * @returns The referenced type node, if found locally.\n\t */\n\tpublic static resolveReferencedTypeNodeFromLocalDeclaration(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode\n\t): ts.TypeNode | undefined {\n\t\t// TypeName (plain identifier) vs Namespace.TypeName (qualified name)\n\t\tconst typeName = ts.isIdentifier(typeNode.typeName)\n\t\t\t? typeNode.typeName.text\n\t\t\t: typeNode.typeName.right.text;\n\t\tconst typeParameterBinding = JsonSchemaBuilder.getTypeParameterBinding(context, typeName);\n\t\tif (typeParameterBinding !== undefined) {\n\t\t\treturn typeParameterBinding ?? undefined;\n\t\t}\n\n\t\tconst sourceFile = context.activeSourceFile;\n\t\tif (!sourceFile) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst declaration = sourceFile.statements.find(\n\t\t\t// type TypeName = ... (type alias declaration matching the resolved name)\n\t\t\t(statement): statement is ts.TypeAliasDeclaration =>\n\t\t\t\tts.isTypeAliasDeclaration(statement) && statement.name.text === typeName\n\t\t);\n\n\t\treturn declaration?.type;\n\t}\n\n\t/**\n\t * Create a nested mapping context with generic parameters bound.\n\t * @param context The current generation context.\n\t * @param typeParameters The generic type parameters for the declaration.\n\t * @param typeArguments Explicit type arguments, when provided.\n\t * @returns The scoped mapping context.\n\t */\n\tpublic static withTypeParameterBindings(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeParameters: ts.NodeArray<ts.TypeParameterDeclaration> | undefined,\n\t\ttypeArguments?: ts.NodeArray<ts.TypeNode>\n\t): ITypeScriptToSchemaContext {\n\t\tif (!typeParameters || typeParameters.length === 0) {\n\t\t\treturn context;\n\t\t}\n\n\t\tconst typeParameterBindings = context.typeParameterBindings ?? {};\n\n\t\tfor (const [index, typeParameter] of typeParameters.entries()) {\n\t\t\ttypeParameterBindings[typeParameter.name.text] =\n\t\t\t\ttypeArguments?.[index] ?? typeParameter.default ?? typeParameter.constraint ?? null;\n\t\t}\n\n\t\treturn {\n\t\t\t...context,\n\t\t\ttypeParameterBindings\n\t\t};\n\t}\n\n\t/**\n\t * Get a bound generic type parameter for the current mapping scope.\n\t * @param context The current generation context.\n\t * @param typeName The type name to resolve.\n\t * @returns The bound type node, null for unresolved generic parameters, or undefined when not generic.\n\t */\n\tpublic static getTypeParameterBinding(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeName: string\n\t): ts.TypeNode | null | undefined {\n\t\tif (!context.typeParameterBindings) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn Object.prototype.hasOwnProperty.call(context.typeParameterBindings, typeName)\n\t\t\t? context.typeParameterBindings[typeName]\n\t\t\t: undefined;\n\t}\n\n\t/**\n\t * Determine whether a mapped type is a homomorphic source-preserving form.\n\t * @param typeNode The mapped type node.\n\t * @returns True if the mapped type mirrors an existing object shape.\n\t */\n\tpublic static isHomomorphicMappedType(typeNode: ts.MappedTypeNode): boolean {\n\t\tconst mappedTypeParameterName = typeNode.typeParameter.name.text;\n\t\tconst constraintTypeNode = typeNode.typeParameter.constraint;\n\t\tconst mappedValueType = typeNode.type;\n\n\t\t// keyof T (constraint must be a type operator for the type to be homomorphic)\n\t\tif (!constraintTypeNode || !mappedValueType || !ts.isTypeOperatorNode(constraintTypeNode)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (constraintTypeNode.operator !== ts.SyntaxKind.KeyOfKeyword) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// T[K] (mapped value must be an indexed access of the source object)\n\t\tif (!ts.isIndexedAccessTypeNode(mappedValueType)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (\n\t\t\t!JsonSchemaBuilder.isMappedTypeParameterReference(\n\t\t\t\tmappedValueType.indexType,\n\t\t\t\tmappedTypeParameterName\n\t\t\t)\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn (\n\t\t\tmappedValueType.objectType.getText() === constraintTypeNode.type.getText() &&\n\t\t\ttypeNode.nameType === undefined\n\t\t);\n\t}\n\n\t/**\n\t * Resolve a source object schema for a mapped type when one exists.\n\t * @param context The generation context.\n\t * @param typeNode The mapped type node.\n\t * @returns The resolved source object schema.\n\t */\n\tpublic static resolveMappedTypeSourceObjectSchema(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.MappedTypeNode\n\t): IJsonSchema | undefined {\n\t\tconst constraintTypeNode = typeNode.typeParameter.constraint;\n\t\tif (\n\t\t\tconstraintTypeNode &&\n\t\t\t// keyof T (homomorphic mapped type, constraint is keyof the source object)\n\t\t\tts.isTypeOperatorNode(constraintTypeNode) &&\n\t\t\tconstraintTypeNode.operator === ts.SyntaxKind.KeyOfKeyword\n\t\t) {\n\t\t\treturn JsonSchemaBuilder.resolveUtilityBaseObjectSchema(context, constraintTypeNode.type);\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Map a single mapped-type property schema.\n\t * @param context The generation context.\n\t * @param typeNode The mapped type node.\n\t * @param sourcePropertyKey The original property key from the source object, used for lookup when the mapped type is homomorphic.\n\t * @param mappedTypeParameterName The mapped type parameter name.\n\t * @param sourceObjectSchema The optional source object schema.\n\t * @returns The mapped property schema.\n\t */\n\tpublic static mapMappedTypePropertySchema(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.MappedTypeNode,\n\t\tsourcePropertyKey: string,\n\t\tmappedTypeParameterName: string,\n\t\tsourceObjectSchema?: IJsonSchema\n\t): IJsonSchema | undefined {\n\t\tif (!typeNode.type) {\n\t\t\treturn {};\n\t\t}\n\n\t\tif (\n\t\t\t// T[K] (indexed access where the index is the mapped type parameter)\n\t\t\tts.isIndexedAccessTypeNode(typeNode.type) &&\n\t\t\tJsonSchemaBuilder.isMappedTypeParameterReference(\n\t\t\t\ttypeNode.type.indexType,\n\t\t\t\tmappedTypeParameterName\n\t\t\t)\n\t\t) {\n\t\t\tconst indexedPropertySchema = JsonSchemaBuilder.resolveIndexedPropertySchema(\n\t\t\t\tcontext,\n\t\t\t\ttypeNode.type.objectType,\n\t\t\t\tsourcePropertyKey,\n\t\t\t\tsourceObjectSchema\n\t\t\t);\n\t\t\tif (indexedPropertySchema) {\n\t\t\t\treturn indexedPropertySchema;\n\t\t\t}\n\t\t}\n\n\t\treturn JsonSchemaBuilder.mapTypeNodeToSchema(context, typeNode.type);\n\t}\n\n\t/**\n\t * Resolve a concrete property schema for an indexed access object type and key.\n\t * @param context The generation context.\n\t * @param objectTypeNode The source object type node.\n\t * @param propertyKey The property key to resolve.\n\t * @param sourceObjectSchema The optional pre-resolved source object schema.\n\t * @returns The resolved property schema.\n\t */\n\tpublic static resolveIndexedPropertySchema(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tobjectTypeNode: ts.TypeNode,\n\t\tpropertyKey: string,\n\t\tsourceObjectSchema?: IJsonSchema\n\t): IJsonSchema | undefined {\n\t\tconst objectSchema =\n\t\t\tsourceObjectSchema ??\n\t\t\tJsonSchemaBuilder.resolveUtilityBaseObjectSchema(context, objectTypeNode);\n\t\tif (!objectSchema) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn ObjectTransformer.resolvePropertySchemaFromObjectSchema(objectSchema, propertyKey);\n\t}\n\n\t/**\n\t * Determine whether a type node is a reference to the mapped type parameter.\n\t * @param typeNode The type node.\n\t * @param mappedTypeParameterName The mapped type parameter name.\n\t * @returns True if the node references the mapped parameter.\n\t */\n\tpublic static isMappedTypeParameterReference(\n\t\ttypeNode: ts.TypeNode,\n\t\tmappedTypeParameterName: string\n\t): boolean {\n\t\treturn (\n\t\t\t// K (type reference to the mapped parameter, plain identifier)\n\t\t\tts.isTypeReferenceNode(typeNode) &&\n\t\t\t// K (identifier node matching the parameter name)\n\t\t\tts.isIdentifier(typeNode.typeName) &&\n\t\t\ttypeNode.typeName.text === mappedTypeParameterName\n\t\t);\n\t}\n\n\t/**\n\t * Apply mapped-type optionality to a schema cloned from a source object.\n\t * @param schema The mapped schema.\n\t * @param optionalToken The mapped type optional token.\n\t */\n\tpublic static applyMappedTypeOptionality(\n\t\tschema: IJsonSchema,\n\t\toptionalToken: ts.QuestionToken | ts.PlusToken | ts.MinusToken | undefined\n\t): void {\n\t\tif (!optionalToken) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (\n\t\t\toptionalToken.kind === ts.SyntaxKind.QuestionToken ||\n\t\t\toptionalToken.kind === ts.SyntaxKind.PlusToken\n\t\t) {\n\t\t\tdelete schema.required;\n\t\t\treturn;\n\t\t}\n\n\t\tif (optionalToken.kind === ts.SyntaxKind.MinusToken && Is.object(schema.properties)) {\n\t\t\tschema.required = Object.keys(schema.properties);\n\t\t}\n\t}\n\n\t/**\n\t * Apply mapped-type required keys for generated property sets.\n\t * @param schema The mapped schema.\n\t * @param propertyKeys The generated property keys.\n\t * @param optionalToken The mapped type optional token.\n\t */\n\tpublic static applyMappedTypeRequiredKeys(\n\t\tschema: IJsonSchema,\n\t\tpropertyKeys: string[],\n\t\toptionalToken: ts.QuestionToken | ts.PlusToken | ts.MinusToken | undefined\n\t): void {\n\t\tif (\n\t\t\toptionalToken &&\n\t\t\t(optionalToken.kind === ts.SyntaxKind.QuestionToken ||\n\t\t\t\toptionalToken.kind === ts.SyntaxKind.PlusToken)\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tschema.required = propertyKeys;\n\t}\n\n\t/**\n\t * Extract key names from a keyof operand where possible.\n\t * @param context The generation context.\n\t * @param keysOperandNode The operand used with keyof.\n\t * @returns The extracted keys.\n\t */\n\tpublic static extractKeyofTypeKeys(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tkeysOperandNode: ts.TypeNode\n\t): string[] {\n\t\t// (string | number) (parenthesised type, unwrap and recurse)\n\t\tif (ts.isParenthesizedTypeNode(keysOperandNode)) {\n\t\t\treturn JsonSchemaBuilder.extractKeyofTypeKeys(context, keysOperandNode.type);\n\t\t}\n\n\t\tif (ts.isTypeReferenceNode(keysOperandNode) && ts.isIdentifier(keysOperandNode.typeName)) {\n\t\t\tconst typeParameterBinding = JsonSchemaBuilder.getTypeParameterBinding(\n\t\t\t\tcontext,\n\t\t\t\tkeysOperandNode.typeName.text\n\t\t\t);\n\t\t\tif (typeParameterBinding !== undefined) {\n\t\t\t\treturn typeParameterBinding\n\t\t\t\t\t? JsonSchemaBuilder.extractKeyofTypeKeys(context, typeParameterBinding)\n\t\t\t\t\t: [];\n\t\t\t}\n\t\t}\n\n\t\t// { prop: string } (type literal, enumerate property names as keys)\n\t\tif (ts.isTypeLiteralNode(keysOperandNode)) {\n\t\t\tconst keyNames = keysOperandNode.members\n\t\t\t\t.filter(\n\t\t\t\t\t// prop: string (property signature with a name)\n\t\t\t\t\t(member): member is ts.PropertySignature & { name: ts.PropertyName } =>\n\t\t\t\t\t\tts.isPropertySignature(member) && member.name !== undefined\n\t\t\t\t)\n\t\t\t\t.map(member => JsonSchemaBuilder.extractPropertyName(context, member.name))\n\t\t\t\t.filter((keyName): keyName is string => Is.stringValue(keyName));\n\n\t\t\treturn [...new Set(keyNames)];\n\t\t}\n\n\t\tconst objectSchema = JsonSchemaBuilder.resolveUtilityBaseObjectSchema(context, keysOperandNode);\n\t\tif (objectSchema?.properties && Is.object(objectSchema.properties)) {\n\t\t\treturn Object.keys(objectSchema.properties);\n\t\t}\n\n\t\treturn [];\n\t}\n\n\t/**\n\t * Determine whether a keyof operand is a generic type parameter reference.\n\t * @param context The generation context.\n\t * @param keysOperandNode The operand used with keyof.\n\t * @returns True if the operand is a generic parameter.\n\t */\n\tpublic static isGenericKeyofOperand(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tkeysOperandNode: ts.TypeNode\n\t): boolean {\n\t\tif (ts.isParenthesizedTypeNode(keysOperandNode)) {\n\t\t\treturn JsonSchemaBuilder.isGenericKeyofOperand(context, keysOperandNode.type);\n\t\t}\n\n\t\tif (!ts.isTypeReferenceNode(keysOperandNode) || !ts.isIdentifier(keysOperandNode.typeName)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst typeName = keysOperandNode.typeName.text;\n\t\tif (JsonSchemaBuilder.getTypeParameterBinding(context, typeName) !== undefined) {\n\t\t\treturn true;\n\t\t}\n\n\t\tlet currentNode: ts.Node | undefined = keysOperandNode;\n\t\twhile (currentNode) {\n\t\t\tconst typedNode = currentNode as ts.Node & {\n\t\t\t\ttypeParameters?: ts.NodeArray<ts.TypeParameterDeclaration>;\n\t\t\t};\n\t\t\tif (typedNode.typeParameters?.some(typeParameter => typeParameter.name.text === typeName)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tcurrentNode = currentNode.parent;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Resolve a schema id for an external imported type reference.\n\t * @param context The generation context.\n\t * @param typeNode The type reference node.\n\t * @param typeName The referenced type name.\n\t * @returns The resolved schema id.\n\t */\n\tpublic static resolveExternalTypeReferenceSchemaId(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode,\n\t\ttypeName: string\n\t): string | undefined {\n\t\tconst activeSourceFile = context.activeSourceFile;\n\t\tif (!activeSourceFile) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst moduleSpecifier = JsonSchemaBuilder.findImportedModuleSpecifier(\n\t\t\tactiveSourceFile,\n\t\t\ttypeNode,\n\t\t\ttypeName\n\t\t);\n\t\tif (!moduleSpecifier) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (moduleSpecifier.startsWith(\".\")) {\n\t\t\treturn JsonSchemaBuilder.resolveReferenceMappingTarget(context, moduleSpecifier, typeName)\n\t\t\t\t?.schemaId;\n\t\t}\n\n\t\tconst title = StringHelper.stripPrefix(typeName);\n\t\tconst cachedSchemaId = context.schemas[moduleSpecifier]?.[title]?.$id;\n\t\tif (cachedSchemaId) {\n\t\t\treturn cachedSchemaId;\n\t\t}\n\n\t\tconst mappedReference = JsonSchemaBuilder.resolveReferenceMappingTarget(\n\t\t\tcontext,\n\t\t\tmoduleSpecifier,\n\t\t\ttypeName\n\t\t);\n\n\t\tconst declarationResult = Resolver.resolveTypeDeclarationAst(moduleSpecifier, typeName);\n\t\tif (!declarationResult) {\n\t\t\treturn mappedReference?.schemaId;\n\t\t}\n\n\t\tconst externalContext: ITypeScriptToSchemaContext = {\n\t\t\tnamespace: mappedReference?.namespace ?? context.namespace,\n\t\t\tpackageName: moduleSpecifier,\n\t\t\tschemas: context.schemas,\n\t\t\tactiveSourceFile: context.activeSourceFile,\n\t\t\toptions: context.options\n\t\t};\n\n\t\tJsonSchemaBuilder.parseAllObjectSchemas(\n\t\t\texternalContext,\n\t\t\tdeclarationResult.sourceFile.fileName,\n\t\t\tdeclarationResult.sourceFile.getFullText(),\n\t\t\t[]\n\t\t);\n\n\t\treturn context.schemas[moduleSpecifier]?.[title]?.$id ?? mappedReference?.schemaId;\n\t}\n\n\t/**\n\t * Resolve a mapped schema target for an imported reference.\n\t * @param context The generation context.\n\t * @param packageName The referenced package or module specifier.\n\t * @param typeName The imported type name.\n\t * @returns The mapped schema id and optional namespace if one matches.\n\t */\n\tpublic static resolveReferenceMappingTarget(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tpackageName: string,\n\t\ttypeName: string\n\t): { schemaId: string; namespace?: string } | undefined {\n\t\tconst externalReferences = context.options?.externalReferences;\n\t\tif (!externalReferences) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst derivedTitle = StringHelper.stripPrefix(typeName);\n\n\t\tif (externalReferences[packageName]) {\n\t\t\treturn {\n\t\t\t\tschemaId: `${externalReferences[packageName]}${derivedTitle}`,\n\t\t\t\tnamespace: externalReferences[packageName]\n\t\t\t};\n\t\t}\n\n\t\tif (externalReferences[typeName]) {\n\t\t\treturn {\n\t\t\t\tschemaId: `${externalReferences[typeName]}${derivedTitle}`,\n\t\t\t\tnamespace: externalReferences[typeName]\n\t\t\t};\n\t\t}\n\n\t\tif (externalReferences[derivedTitle]) {\n\t\t\treturn {\n\t\t\t\tschemaId: `${externalReferences[derivedTitle]}${derivedTitle}`,\n\t\t\t\tnamespace: externalReferences[derivedTitle]\n\t\t\t};\n\t\t}\n\n\t\tfor (const [pattern, mappedNamespace] of Object.entries(externalReferences)) {\n\t\t\tif (RegEx.isReferencePatternMatch(pattern, packageName, typeName, derivedTitle)) {\n\t\t\t\tif (/\\$\\d+/u.test(mappedNamespace)) {\n\t\t\t\t\tconst schemaId = RegEx.applyReferencePatternReplacement(\n\t\t\t\t\t\tpattern,\n\t\t\t\t\t\tmappedNamespace,\n\t\t\t\t\t\tpackageName,\n\t\t\t\t\t\ttypeName,\n\t\t\t\t\t\tderivedTitle\n\t\t\t\t\t);\n\t\t\t\t\tif (schemaId) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tschemaId,\n\t\t\t\t\t\t\tnamespace: schemaId.endsWith(derivedTitle)\n\t\t\t\t\t\t\t\t? schemaId.slice(0, -derivedTitle.length)\n\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tschemaId: `${mappedNamespace}${derivedTitle}`,\n\t\t\t\t\tnamespace: mappedNamespace\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Find a module specifier for a referenced type in the active source file imports.\n\t * @param sourceFile The active source file.\n\t * @param typeNode The referenced type node.\n\t * @param typeName The referenced type name.\n\t * @returns The module specifier.\n\t */\n\tpublic static findImportedModuleSpecifier(\n\t\tsourceFile: ts.SourceFile,\n\t\ttypeNode: ts.TypeReferenceNode,\n\t\ttypeName: string\n\t): string | undefined {\n\t\tfor (const statement of sourceFile.statements) {\n\t\t\t// import { ... } from \"./module.js\" (import declaration with string specifier)\n\t\t\tif (ts.isImportDeclaration(statement) && ts.isStringLiteral(statement.moduleSpecifier)) {\n\t\t\t\tconst importClause = statement.importClause;\n\t\t\t\tif (importClause) {\n\t\t\t\t\tif (importClause.name?.text === typeName) {\n\t\t\t\t\t\treturn statement.moduleSpecifier.text;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst namedBindings = importClause.namedBindings;\n\t\t\t\t\tif (namedBindings) {\n\t\t\t\t\t\t// import * as Namespace and Namespace.TypeName (namespace import + qualified usage)\n\t\t\t\t\t\tif (ts.isNamespaceImport(namedBindings) && ts.isQualifiedName(typeNode.typeName)) {\n\t\t\t\t\t\t\tif (namedBindings.name.text === typeNode.typeName.left.getText()) {\n\t\t\t\t\t\t\t\treturn statement.moduleSpecifier.text;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// import { Named, Import } (named import bindings)\n\t\t\t\t\t\tif (ts.isNamedImports(namedBindings)) {\n\t\t\t\t\t\t\tfor (const importSpecifier of namedBindings.elements) {\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\timportSpecifier.name.text === typeName ||\n\t\t\t\t\t\t\t\t\timportSpecifier.propertyName?.text === typeName\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\treturn statement.moduleSpecifier.text;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Map custom tag key names to JSON schema property names.\n\t * @param key The raw tag key.\n\t * @returns The schema key.\n\t */\n\tpublic static mapJsonSchemaTagKey(key: string): string {\n\t\tif (key === \"id\") {\n\t\t\treturn \"$id\";\n\t\t}\n\t\tif (key === \"ref\") {\n\t\t\treturn \"$ref\";\n\t\t}\n\t\tif (key === \"comment\") {\n\t\t\treturn \"$comment\";\n\t\t}\n\n\t\treturn key;\n\t}\n\n\t/**\n\t * Extract the inner type node from a named or rest tuple element.\n\t * Named tuple members and rest elements both wrap an inner type node; this unwraps them.\n\t * Plain type nodes are returned as-is.\n\t * @param element The tuple element.\n\t * @returns The inner type node.\n\t */\n\tpublic static extractTupleElementType(element: ts.TypeNode): ts.TypeNode | undefined {\n\t\t// label: string (named tuple member, e.g. [label: string, count: number])\n\t\tif (ts.isNamedTupleMember(element)) {\n\t\t\treturn element.type;\n\t\t}\n\n\t\t// ...string[] (rest element in a tuple, e.g. [first: string, ...rest: string[]])\n\t\tif (ts.isRestTypeNode(element)) {\n\t\t\treturn element.type;\n\t\t}\n\n\t\treturn element;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"jsonSchemaBuilder.js","sourceRoot":"","sources":["../../../src/utils/jsonSchemaBuilder.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2026 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport {\n\tArrayHelper,\n\tGeneralError,\n\tIs,\n\tJsonHelper,\n\tObjectHelper,\n\tStringHelper\n} from \"@twin.org/core\";\nimport { nameof } from \"@twin.org/nameof\";\nimport { type IJsonSchema, JsonSchemaTagNames } from \"@twin.org/tools-models\";\nimport * as ts from \"typescript\";\nimport { Constants } from \"./constants.js\";\nimport { DiagnosticReporter } from \"./diagnosticReporter.js\";\nimport { DisallowedTypeGuard } from \"./disallowedTypeGuard.js\";\nimport { Enum } from \"./enum.js\";\nimport { FileUtils } from \"./fileUtils.js\";\nimport { ImportTypeQuerySchemaResolver } from \"./importTypeQuerySchemaResolver.js\";\nimport { IndexSignaturePatternResolver } from \"./indexSignaturePatternResolver.js\";\nimport { IntersectionSchemaMerger } from \"./intersectionSchemaMerger.js\";\nimport { JsDoc } from \"./jsDoc.js\";\nimport { MappedTypeSchemaResolver } from \"./mappedTypeSchemaResolver.js\";\nimport { ObjectTransformer } from \"./objectTransformer.js\";\nimport { RegEx } from \"./regEx.js\";\nimport { Resolver } from \"./resolver.js\";\nimport { TemplateLiteralPatternBuilder } from \"./templateLiteralPatternBuilder.js\";\nimport { UtilityTypeSchemaMapper } from \"./utilityTypeSchemaMapper.js\";\nimport type { ITypeScriptToSchemaContext } from \"../models/ITypeScriptToSchemaContext.js\";\n\n/**\n * Builder for composing JSON schema fragments from TypeScript AST nodes.\n */\nexport class JsonSchemaBuilder {\n\t/**\n\t * The JSON Schema version used.\n\t */\n\tpublic static readonly SCHEMA_VERSION = \"https://json-schema.org/draft/2020-12/schema\";\n\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof(JsonSchemaBuilder);\n\n\t/**\n\t * Dictionary of TypeScript utility type names to their schema mapping handlers.\n\t */\n\tprivate static readonly _utilityTypeHandlers: {\n\t\t[key: string]: (\n\t\t\tcontext: ITypeScriptToSchemaContext,\n\t\t\ttypeNode: ts.TypeReferenceNode\n\t\t) => IJsonSchema | undefined;\n\t} = {\n\t\tPartial: (context, typeNode) => JsonSchemaBuilder.mapPartialUtilityType(context, typeNode),\n\t\tRequired: (context, typeNode) => JsonSchemaBuilder.mapRequiredUtilityType(context, typeNode),\n\t\tPick: (context, typeNode) => JsonSchemaBuilder.mapPickUtilityType(context, typeNode),\n\t\tOmit: (context, typeNode) => JsonSchemaBuilder.mapOmitUtilityType(context, typeNode),\n\t\tExclude: (context, typeNode) => JsonSchemaBuilder.mapExcludeUtilityType(context, typeNode),\n\t\tExtract: (context, typeNode) => JsonSchemaBuilder.mapExtractUtilityType(context, typeNode),\n\t\tNonNullable: (context, typeNode) =>\n\t\t\tJsonSchemaBuilder.mapNonNullableUtilityType(context, typeNode),\n\t\tRecord: (context, typeNode) => JsonSchemaBuilder.mapRecordUtilityType(context, typeNode),\n\t\tJsonLdObjectWithId: (context, typeNode) =>\n\t\t\tJsonSchemaBuilder.mapJsonLdObjectUtilityType(context, typeNode, {\n\t\t\t\tkeysToRemove: [\"id\", \"@id\"],\n\t\t\t\tkeyToAdd: \"id\",\n\t\t\t\tisAddedKeyRequired: true\n\t\t\t}),\n\t\tJsonLdObjectWithAtId: (context, typeNode) =>\n\t\t\tJsonSchemaBuilder.mapJsonLdObjectUtilityType(context, typeNode, {\n\t\t\t\tkeysToRemove: [\"id\", \"@id\"],\n\t\t\t\tkeyToAdd: \"@id\",\n\t\t\t\tisAddedKeyRequired: true\n\t\t\t}),\n\t\tJsonLdObjectWithOptionalId: (context, typeNode) =>\n\t\t\tJsonSchemaBuilder.mapJsonLdObjectUtilityType(context, typeNode, {\n\t\t\t\tkeysToRemove: [\"id\", \"@id\"],\n\t\t\t\tkeyToAdd: \"id\",\n\t\t\t\tisAddedKeyRequired: false\n\t\t\t}),\n\t\tJsonLdObjectWithOptionalAtId: (context, typeNode) =>\n\t\t\tJsonSchemaBuilder.mapJsonLdObjectUtilityType(context, typeNode, {\n\t\t\t\tkeysToRemove: [\"id\", \"@id\"],\n\t\t\t\tkeyToAdd: \"@id\",\n\t\t\t\tisAddedKeyRequired: false\n\t\t\t}),\n\t\tJsonLdObjectWithNoId: (context, typeNode) =>\n\t\t\tJsonSchemaBuilder.mapJsonLdObjectUtilityType(context, typeNode, {\n\t\t\t\tkeysToRemove: [\"id\"]\n\t\t\t}),\n\t\tJsonLdObjectWithNoAtId: (context, typeNode) =>\n\t\t\tJsonSchemaBuilder.mapJsonLdObjectUtilityType(context, typeNode, {\n\t\t\t\tkeysToRemove: [\"@id\"]\n\t\t\t}),\n\t\tJsonLdObjectWithType: (context, typeNode) =>\n\t\t\tJsonSchemaBuilder.mapJsonLdObjectUtilityType(context, typeNode, {\n\t\t\t\tkeysToRemove: [\"type\", \"@type\"],\n\t\t\t\tkeyToAdd: \"type\",\n\t\t\t\tisAddedKeyRequired: true\n\t\t\t}),\n\t\tJsonLdObjectWithAtType: (context, typeNode) =>\n\t\t\tJsonSchemaBuilder.mapJsonLdObjectUtilityType(context, typeNode, {\n\t\t\t\tkeysToRemove: [\"type\", \"@type\"],\n\t\t\t\tkeyToAdd: \"@type\",\n\t\t\t\tisAddedKeyRequired: true\n\t\t\t}),\n\t\tJsonLdObjectWithOptionalType: (context, typeNode) =>\n\t\t\tJsonSchemaBuilder.mapJsonLdObjectUtilityType(context, typeNode, {\n\t\t\t\tkeysToRemove: [\"type\", \"@type\"],\n\t\t\t\tkeyToAdd: \"type\",\n\t\t\t\tisAddedKeyRequired: false\n\t\t\t}),\n\t\tJsonLdObjectWithOptionalAtType: (context, typeNode) =>\n\t\t\tJsonSchemaBuilder.mapJsonLdObjectUtilityType(context, typeNode, {\n\t\t\t\tkeysToRemove: [\"type\", \"@type\"],\n\t\t\t\tkeyToAdd: \"@type\",\n\t\t\t\tisAddedKeyRequired: false\n\t\t\t}),\n\t\tJsonLdObjectWithNoType: (context, typeNode) =>\n\t\t\tJsonSchemaBuilder.mapJsonLdObjectUtilityType(context, typeNode, {\n\t\t\t\tkeysToRemove: [\"type\"]\n\t\t\t}),\n\t\tJsonLdObjectWithNoAtType: (context, typeNode) =>\n\t\t\tJsonSchemaBuilder.mapJsonLdObjectUtilityType(context, typeNode, {\n\t\t\t\tkeysToRemove: [\"@type\"]\n\t\t\t}),\n\t\tJsonLdObjectWithContext: (context, typeNode) =>\n\t\t\tJsonSchemaBuilder.mapJsonLdObjectUtilityType(context, typeNode, {\n\t\t\t\tkeysToRemove: [\"@context\"],\n\t\t\t\tkeyToAdd: \"@context\",\n\t\t\t\tisAddedKeyRequired: true\n\t\t\t}),\n\t\tJsonLdObjectWithOptionalContext: (context, typeNode) =>\n\t\t\tJsonSchemaBuilder.mapJsonLdObjectUtilityType(context, typeNode, {\n\t\t\t\tkeysToRemove: [\"@context\"],\n\t\t\t\tkeyToAdd: \"@context\",\n\t\t\t\tisAddedKeyRequired: false\n\t\t\t}),\n\t\tJsonLdObjectWithNoContext: (context, typeNode) =>\n\t\t\tJsonSchemaBuilder.mapJsonLdObjectUtilityType(context, typeNode, {\n\t\t\t\tkeysToRemove: [\"@context\"]\n\t\t\t}),\n\t\tSingleOccurrenceArray: (context, typeNode) =>\n\t\t\tJsonSchemaBuilder.mapSingleOccurrenceArrayUtilityType(context, typeNode),\n\t\tObjectOrArray: (context, typeNode) =>\n\t\t\tJsonSchemaBuilder.mapObjectOrArrayUtilityType(context, typeNode)\n\t};\n\n\t/**\n\t * Parse all object declarations from a source file.\n\t * @param context The generation context.\n\t * @param sourceFilePath The source file path.\n\t * @param source The TypeScript source.\n\t * @param visitedFiles The list of visited source files.\n\t * @returns The generated schema titles.\n\t */\n\tpublic static parseAllObjectSchemas(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tsourceFilePath: string,\n\t\tsource: string,\n\t\tvisitedFiles: string[]\n\t): string[] {\n\t\tconst absoluteSourcePath = FileUtils.normalizeFilePath(sourceFilePath);\n\t\tif (visitedFiles.includes(absoluteSourcePath)) {\n\t\t\treturn [];\n\t\t}\n\t\tvisitedFiles.push(absoluteSourcePath);\n\n\t\tconst sourceFile = ts.createSourceFile(sourceFilePath, source, ts.ScriptTarget.Latest, true);\n\t\tconst previousSourceFile = context.activeSourceFile;\n\t\tcontext.activeSourceFile = sourceFile;\n\t\tcontext.schemas[context.packageName] ??= {};\n\t\tconst packageSchemaEntries = context.schemas[context.packageName];\n\t\tconst parsedTitles: string[] = [];\n\n\t\t// Preload local imports so utility type mapping can resolve referenced\n\t\t// object schemas while processing declarations in this file.\n\t\tfor (const statement of sourceFile.statements) {\n\t\t\t// import { Foo } from \"./module.js\" (local relative import)\n\t\t\tif (ts.isImportDeclaration(statement) && ts.isStringLiteral(statement.moduleSpecifier)) {\n\t\t\t\tconst importPath = statement.moduleSpecifier.text;\n\t\t\t\tif (importPath.startsWith(\".\")) {\n\t\t\t\t\tconst resolvedImportPath = FileUtils.resolveImportSourceFilePath(\n\t\t\t\t\t\tsourceFilePath,\n\t\t\t\t\t\timportPath\n\t\t\t\t\t);\n\t\t\t\t\tif (resolvedImportPath) {\n\t\t\t\t\t\tconst importedSource = FileUtils.readFile(resolvedImportPath);\n\t\t\t\t\t\tif (importedSource) {\n\t\t\t\t\t\t\tconst importedTitles = JsonSchemaBuilder.parseAllObjectSchemas(\n\t\t\t\t\t\t\t\tcontext,\n\t\t\t\t\t\t\t\tresolvedImportPath,\n\t\t\t\t\t\t\t\timportedSource,\n\t\t\t\t\t\t\t\tvisitedFiles\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tfor (const importedTitle of importedTitles) {\n\t\t\t\t\t\t\t\tif (!parsedTitles.includes(importedTitle)) {\n\t\t\t\t\t\t\t\t\tparsedTitles.push(importedTitle);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const statement of sourceFile.statements) {\n\t\t\tlet title: string | undefined;\n\t\t\tlet schema: Partial<IJsonSchema> | undefined;\n\t\t\tcontext.activeDisallowedType = undefined;\n\n\t\t\t// interface IFoo { prop: string; } (interface declaration)\n\t\t\tif (ts.isInterfaceDeclaration(statement)) {\n\t\t\t\tconst boundContext = JsonSchemaBuilder.withTypeParameterBindings(\n\t\t\t\t\tcontext,\n\t\t\t\t\tstatement.typeParameters\n\t\t\t\t);\n\t\t\t\ttitle = StringHelper.stripPrefix(statement.name.text);\n\t\t\t\tboundContext.activeEnclosingObjectName = title;\n\t\t\t\tschema = JsonSchemaBuilder.buildBaseSchema(context.namespace, title, statement);\n\t\t\t\tJsonSchemaBuilder.buildObjectSchema(boundContext, schema, statement.members);\n\t\t\t\tJsonSchemaBuilder.applyInterfaceExtendsSchema(boundContext, schema, statement);\n\t\t\t\t// type Foo = string | number or type Foo = { prop: string } (type alias declaration)\n\t\t\t} else if (ts.isTypeAliasDeclaration(statement)) {\n\t\t\t\tconst boundContext = JsonSchemaBuilder.withTypeParameterBindings(\n\t\t\t\t\tcontext,\n\t\t\t\t\tstatement.typeParameters\n\t\t\t\t);\n\t\t\t\ttitle = StringHelper.stripPrefix(statement.name.text);\n\t\t\t\tboundContext.activeEnclosingObjectName = title;\n\n\t\t\t\t// { prop: string } (type alias whose RHS is an inline object type)\n\t\t\t\tif (ts.isTypeLiteralNode(statement.type)) {\n\t\t\t\t\tschema = JsonSchemaBuilder.buildBaseSchema(context.namespace, title, statement);\n\t\t\t\t\tJsonSchemaBuilder.buildObjectSchema(boundContext, schema, statement.type.members);\n\t\t\t\t} else {\n\t\t\t\t\t// Const-and-type enum patterns always take priority so that JsDoc descriptions\n\t\t\t\t\t// on the const object members are preserved in the generated oneOf schema.\n\t\t\t\t\tconst constValues = Enum.extractEnumValuesFromConstAndType(\n\t\t\t\t\t\tstatement.name.text,\n\t\t\t\t\t\tsourceFile\n\t\t\t\t\t);\n\t\t\t\t\tif (constValues) {\n\t\t\t\t\t\tschema = JsonSchemaBuilder.buildBaseSchema(context.namespace, title, statement);\n\t\t\t\t\t\tJsonSchemaBuilder.buildEnumSchema(schema, constValues);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst mappedType = JsonSchemaBuilder.mapTypeNodeToSchema(boundContext, statement.type);\n\t\t\t\t\t\tif (mappedType) {\n\t\t\t\t\t\t\tschema = JsonSchemaBuilder.buildBaseSchema(context.namespace, title, statement);\n\t\t\t\t\t\t\tObject.assign(schema, mappedType);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// enum Color { Red = \"red\", Blue = \"blue\" } (native enum declaration)\n\t\t\t} else if (ts.isEnumDeclaration(statement)) {\n\t\t\t\ttitle = StringHelper.stripPrefix(statement.name.text);\n\t\t\t\tconst enumValues = Enum.extractEnumValuesFromEnumDeclaration(statement);\n\t\t\t\tif (enumValues && enumValues.length > 0) {\n\t\t\t\t\tschema = JsonSchemaBuilder.buildBaseSchema(context.namespace, title, statement);\n\t\t\t\t\tJsonSchemaBuilder.buildEnumSchema(schema, enumValues);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst activeDisallowedType = context.activeDisallowedType as\n\t\t\t\t| {\n\t\t\t\t\t\tdisallowedTypeName: string;\n\t\t\t\t\t\tpropertyName: string;\n\t\t\t\t\t\tenclosingObjectName: string;\n\t\t\t\t }\n\t\t\t\t| undefined;\n\t\t\tif (activeDisallowedType) {\n\t\t\t\tDiagnosticReporter.report(\n\t\t\t\t\tcontext,\n\t\t\t\t\tstatement,\n\t\t\t\t\t\"jsonSchemaBuilder.diagnostic.excludedEnclosingObjectDisallowedType\",\n\t\t\t\t\t{\n\t\t\t\t\t\tdisallowedTypeName: activeDisallowedType.disallowedTypeName,\n\t\t\t\t\t\tenclosingObjectName: activeDisallowedType.enclosingObjectName,\n\t\t\t\t\t\tpropertyName: activeDisallowedType.propertyName\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tcontext.activeDisallowedType = undefined;\n\t\t\t} else if (title && schema) {\n\t\t\t\tconst mappedSchema = ObjectHelper.removeEmptyProperties(\n\t\t\t\t\tObjectTransformer.normalizeSchemaDescriptions(schema as IJsonSchema)\n\t\t\t\t);\n\t\t\t\tpackageSchemaEntries[title] = mappedSchema;\n\t\t\t\tif (!parsedTitles.includes(title)) {\n\t\t\t\t\tparsedTitles.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const statement of sourceFile.statements) {\n\t\t\t// import { Foo } from \"./module.js\" (re-scan imports to process any newly visible schemas)\n\t\t\tif (ts.isImportDeclaration(statement) && ts.isStringLiteral(statement.moduleSpecifier)) {\n\t\t\t\tconst importPath = statement.moduleSpecifier.text;\n\t\t\t\tif (importPath.startsWith(\".\")) {\n\t\t\t\t\tconst resolvedImportPath = FileUtils.resolveImportSourceFilePath(\n\t\t\t\t\t\tsourceFilePath,\n\t\t\t\t\t\timportPath\n\t\t\t\t\t);\n\t\t\t\t\tif (resolvedImportPath) {\n\t\t\t\t\t\tconst importedSource = FileUtils.readFile(resolvedImportPath);\n\t\t\t\t\t\tif (importedSource) {\n\t\t\t\t\t\t\tconst importedTitles = JsonSchemaBuilder.parseAllObjectSchemas(\n\t\t\t\t\t\t\t\tcontext,\n\t\t\t\t\t\t\t\tresolvedImportPath,\n\t\t\t\t\t\t\t\timportedSource,\n\t\t\t\t\t\t\t\tvisitedFiles\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tfor (const importedTitle of importedTitles) {\n\t\t\t\t\t\t\t\tif (!parsedTitles.includes(importedTitle)) {\n\t\t\t\t\t\t\t\t\tparsedTitles.push(importedTitle);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tcontext.activeSourceFile = previousSourceFile;\n\t\treturn parsedTitles;\n\t}\n\n\t/**\n\t * Apply @json-schema tags from JSDoc to a schema object.\n\t * @param schema The schema to expand.\n\t * @param node The node to inspect for tags.\n\t * @throws GeneralError Thrown when a tag key is not supported by IJsonSchema.\n\t */\n\tpublic static applyJsonSchemaTags(schema: Partial<IJsonSchema>, node: ts.Node): void {\n\t\tconst defaultTagComment = JsDoc.getNodeTagComment(node, \"default\");\n\t\tif (defaultTagComment !== undefined && schema.default === undefined) {\n\t\t\tschema.default = JsDoc.parseTagValue(defaultTagComment);\n\t\t}\n\n\t\tconst tags = JsDoc.getNodeTags(node, \"json-schema\");\n\t\tfor (const [rawKey, rawValue] of Object.entries(tags)) {\n\t\t\tconst schemaKey = JsonSchemaBuilder.mapJsonSchemaTagKey(rawKey);\n\t\t\tif (!JsonSchemaBuilder.isAllowedJsonSchemaTagKey(schemaKey)) {\n\t\t\t\tthrow new GeneralError(JsonSchemaBuilder.CLASS_NAME, \"invalidJsonSchemaTagKey\", {\n\t\t\t\t\trawKey,\n\t\t\t\t\tschemaKey\n\t\t\t\t});\n\t\t\t}\n\t\t\tJsonSchemaBuilder.validateJsonSchemaTagConstraint(schemaKey, schema.type, rawValue);\n\t\t\tconst parsedValue = JsDoc.parseTagValue(rawValue);\n\t\t\tObjectHelper.propertySet(schema, schemaKey, parsedValue);\n\t\t}\n\t}\n\n\t/**\n\t * Validate that a @json-schema constraint key is compatible with the given schema type,\n\t * and that the raw value is valid for the constraint.\n\t * @param schemaKey The mapped schema key being applied.\n\t * @param schemaType The type already set on the schema, if any.\n\t * @param rawValue The raw string value from the JSDoc tag.\n\t * @throws GeneralError Thrown when the constraint is not valid for the schema type.\n\t * @throws GeneralError Thrown when the format value is not a recognised JSON Schema format.\n\t */\n\tpublic static validateJsonSchemaTagConstraint(\n\t\tschemaKey: string,\n\t\tschemaType: string | string[] | undefined,\n\t\trawValue: string\n\t): void {\n\t\tif (schemaType !== undefined) {\n\t\t\tconst types = ArrayHelper.fromObjectOrArray(schemaType);\n\n\t\t\tconst numericConstraints = [\n\t\t\t\t\"minimum\",\n\t\t\t\t\"maximum\",\n\t\t\t\t\"multipleOf\",\n\t\t\t\t\"exclusiveMinimum\",\n\t\t\t\t\"exclusiveMaximum\"\n\t\t\t];\n\t\t\tconst stringConstraints = [\"minLength\", \"maxLength\", \"pattern\", \"format\"];\n\t\t\tconst objectConstraints = [\"minProperties\", \"maxProperties\"];\n\t\t\tconst arrayConstraints = [\"minItems\", \"maxItems\", \"uniqueItems\"];\n\n\t\t\tlet requiredType: string | undefined;\n\t\t\tif (numericConstraints.includes(schemaKey)) {\n\t\t\t\tif (!types.includes(\"number\") && !types.includes(\"integer\")) {\n\t\t\t\t\trequiredType = \"number|integer\";\n\t\t\t\t}\n\t\t\t} else if (stringConstraints.includes(schemaKey)) {\n\t\t\t\tif (!types.includes(\"string\")) {\n\t\t\t\t\trequiredType = \"string\";\n\t\t\t\t}\n\t\t\t} else if (objectConstraints.includes(schemaKey)) {\n\t\t\t\tif (!types.includes(\"object\")) {\n\t\t\t\t\trequiredType = \"object\";\n\t\t\t\t}\n\t\t\t} else if (arrayConstraints.includes(schemaKey)) {\n\t\t\t\tif (!types.includes(\"array\")) {\n\t\t\t\t\trequiredType = \"array\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (requiredType !== undefined) {\n\t\t\t\tthrow new GeneralError(JsonSchemaBuilder.CLASS_NAME, \"constraintOnIncompatibleType\", {\n\t\t\t\t\tschemaKey,\n\t\t\t\t\trequiredType,\n\t\t\t\t\tschemaType: Is.array(schemaType) ? schemaType.join(\"|\") : schemaType\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (schemaKey === \"format\") {\n\t\t\tconst validFormats = [\n\t\t\t\t\"date-time\",\n\t\t\t\t\"date\",\n\t\t\t\t\"time\",\n\t\t\t\t\"duration\",\n\t\t\t\t\"email\",\n\t\t\t\t\"idn-email\",\n\t\t\t\t\"hostname\",\n\t\t\t\t\"idn-hostname\",\n\t\t\t\t\"ipv4\",\n\t\t\t\t\"ipv6\",\n\t\t\t\t\"uri\",\n\t\t\t\t\"uri-reference\",\n\t\t\t\t\"iri\",\n\t\t\t\t\"iri-reference\",\n\t\t\t\t\"uuid\",\n\t\t\t\t\"uri-template\",\n\t\t\t\t\"json-pointer\",\n\t\t\t\t\"relative-json-pointer\",\n\t\t\t\t\"regex\"\n\t\t\t];\n\t\t\tif (!validFormats.includes(rawValue)) {\n\t\t\t\tthrow new GeneralError(JsonSchemaBuilder.CLASS_NAME, \"invalidFormatValue\", {\n\t\t\t\t\tformatValue: rawValue,\n\t\t\t\t\tvalidFormats: validFormats.join(\", \")\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Determine whether a mapped @json-schema tag key is supported.\n\t * @param key The mapped schema key.\n\t * @returns True if the key is supported.\n\t */\n\tpublic static isAllowedJsonSchemaTagKey(key: string): boolean {\n\t\treturn JsonSchemaTagNames.includes(key);\n\t}\n\n\t/**\n\t * Build the base schema with common properties.\n\t * @param namespace The namespace for generated schema id.\n\t * @param title The schema title.\n\t * @param statement The type statement node.\n\t * @returns The base schema to be expanded.\n\t */\n\tpublic static buildBaseSchema(\n\t\tnamespace: string,\n\t\ttitle: string,\n\t\tstatement: ts.Node\n\t): Partial<IJsonSchema> {\n\t\tconst schema: Partial<IJsonSchema> = {\n\t\t\t$schema: JsonSchemaBuilder.SCHEMA_VERSION,\n\t\t\t$id: `${namespace}${title}`,\n\t\t\ttitle\n\t\t};\n\n\t\tconst description = JsDoc.getNodeJsDocDescription(statement);\n\t\tif (description) {\n\t\t\tschema.description = description;\n\t\t}\n\n\t\tJsonSchemaBuilder.applyJsonSchemaTags(schema, statement);\n\t\treturn schema;\n\t}\n\n\t/**\n\t * Add enum information to a schema.\n\t * @param schema The schema to expand.\n\t * @param entries The enum entries.\n\t */\n\tpublic static buildEnumSchema(\n\t\tschema: Partial<IJsonSchema>,\n\t\tentries: { value: string | number; description?: string }[]\n\t): void {\n\t\tschema.oneOf = entries.map(entry => ({\n\t\t\tconst: entry.value,\n\t\t\tdescription: entry.description\n\t\t}));\n\t}\n\n\t/**\n\t * Build an object schema from interface or type literal members.\n\t * @param context The generation context.\n\t * @param schema The schema to expand.\n\t * @param members The members to process.\n\t */\n\tpublic static buildObjectSchema(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tschema: Partial<IJsonSchema>,\n\t\tmembers: ts.NodeArray<ts.TypeElement>\n\t): void {\n\t\tconst { properties, required, patternProperties, additionalProperties, propertyNames } =\n\t\t\tJsonSchemaBuilder.buildObjectMembersSchema(context, members);\n\t\tschema.type = \"object\";\n\t\tif (Object.keys(properties).length > 0) {\n\t\t\tschema.properties = properties;\n\t\t}\n\t\tif (patternProperties) {\n\t\t\tschema.patternProperties = patternProperties;\n\t\t}\n\t\tif (propertyNames) {\n\t\t\tschema.propertyNames = propertyNames;\n\t\t}\n\t\tif (additionalProperties) {\n\t\t\tschema.additionalProperties = additionalProperties;\n\t\t}\n\t\tif (required.length > 0) {\n\t\t\tschema.required = required;\n\t\t}\n\t}\n\n\t/**\n\t * Build property schemas and required list from type members.\n\t * @param context The generation context.\n\t * @param members The members to process.\n\t * @returns The object property schema map and required list.\n\t */\n\tpublic static buildObjectMembersSchema(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tmembers: ts.NodeArray<ts.TypeElement>\n\t): {\n\t\tproperties: { [key: string]: IJsonSchema };\n\t\trequired: string[];\n\t\tpatternProperties?: { [pattern: string]: IJsonSchema };\n\t\tadditionalProperties?: IJsonSchema;\n\t\tpropertyNames?: IJsonSchema;\n\t} {\n\t\tconst properties: { [key: string]: IJsonSchema } = {};\n\t\tconst required: string[] = [];\n\t\tconst indexSignatureSchemas: IJsonSchema[] = [];\n\t\tconst patternPropertySchemas: { pattern: string; schema: IJsonSchema }[] = [];\n\n\t\tfor (const member of members) {\n\t\t\tif (context.activeDisallowedType) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// prop: string or prop?: string (property signature member)\n\t\t\tif (ts.isPropertySignature(member) && member.type) {\n\t\t\t\tif (JsonSchemaBuilder.isSymbolTypeNode(member.type)) {\n\t\t\t\t\tDiagnosticReporter.report(\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t\tmember,\n\t\t\t\t\t\t\"jsonSchemaBuilder.diagnostic.symbolValuedProperty\",\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpropertyName: member.name.getText()\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tconst isMemberTypeAllowed = JsonSchemaBuilder.checkTypeNodeAllowed(\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t\tmember.type,\n\t\t\t\t\t\tmember.name.getText(),\n\t\t\t\t\t\tcontext.activeEnclosingObjectName\n\t\t\t\t\t);\n\t\t\t\t\tif (isMemberTypeAllowed && JsonSchemaBuilder.isFunctionPropertyType(member.type)) {\n\t\t\t\t\t\tDiagnosticReporter.report(\n\t\t\t\t\t\t\tcontext,\n\t\t\t\t\t\t\tmember,\n\t\t\t\t\t\t\t\"jsonSchemaBuilder.diagnostic.functionTypedProperty\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpropertyName: member.name.getText()\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if (isMemberTypeAllowed) {\n\t\t\t\t\t\tconst memberName = member.name\n\t\t\t\t\t\t\t? JsonSchemaBuilder.extractPropertyName(context, member.name)\n\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\t\tconst memberTypeSchema = memberName\n\t\t\t\t\t\t\t? JsonSchemaBuilder.mapMemberTypeToSchema(context, member.type)\n\t\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\t\tif (memberName && memberTypeSchema) {\n\t\t\t\t\t\t\tconst memberDescription = JsDoc.getNodeJsDocDescription(member);\n\t\t\t\t\t\t\tif (memberDescription) {\n\t\t\t\t\t\t\t\tmemberTypeSchema.description = memberDescription;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tJsonSchemaBuilder.applyJsonSchemaTags(memberTypeSchema, member);\n\t\t\t\t\t\t\tproperties[memberName] = ObjectHelper.removeEmptyProperties(memberTypeSchema);\n\t\t\t\t\t\t\tif (!member.questionToken) {\n\t\t\t\t\t\t\t\trequired.push(memberName);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// [key: string]: Value (index signature member)\n\t\t\tif (ts.isIndexSignatureDeclaration(member)) {\n\t\t\t\tconst valueTypeSchema = member.type\n\t\t\t\t\t? (JsonSchemaBuilder.mapTypeNodeToSchema(context, member.type) ?? {})\n\t\t\t\t\t: {};\n\t\t\t\tif (IndexSignaturePatternResolver.isSupportedIndexSignature(member)) {\n\t\t\t\t\tindexSignatureSchemas.push(valueTypeSchema);\n\t\t\t\t} else {\n\t\t\t\t\tconst pattern = IndexSignaturePatternResolver.extractIndexSignaturePattern(\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t\tmember,\n\t\t\t\t\t\t(boundContext, typeName) =>\n\t\t\t\t\t\t\tJsonSchemaBuilder.getTypeParameterBinding(boundContext, typeName)\n\t\t\t\t\t);\n\t\t\t\t\tif (pattern) {\n\t\t\t\t\t\tpatternPropertySchemas.push({ pattern, schema: valueTypeSchema });\n\t\t\t\t\t} else {\n\t\t\t\t\t\tDiagnosticReporter.report(\n\t\t\t\t\t\t\tcontext,\n\t\t\t\t\t\t\tmember,\n\t\t\t\t\t\t\t\"jsonSchemaBuilder.diagnostic.unsupportedIndexSignature\",\n\t\t\t\t\t\t\t{ keyType: member.parameters[0]?.type?.getText() ?? \"unknown\" }\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!ts.isPropertySignature(member) && !ts.isIndexSignatureDeclaration(member)) {\n\t\t\t\t// any other member kind (method signatures, call signatures, etc.) is reported and skipped\n\t\t\t\tDiagnosticReporter.report(\n\t\t\t\t\tcontext,\n\t\t\t\t\tmember,\n\t\t\t\t\t\"jsonSchemaBuilder.diagnostic.unsupportedTypeElementMember\",\n\t\t\t\t\t{ kind: ts.SyntaxKind[member.kind] }\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst uniqueIndexSignatureSchemas = indexSignatureSchemas.filter((schema, index, schemas) => {\n\t\t\tconst schemaKey = JsonHelper.canonicalize(schema);\n\t\t\treturn schemas.findIndex(s => JsonHelper.canonicalize(s) === schemaKey) === index;\n\t\t});\n\n\t\tlet additionalProperties: IJsonSchema | undefined;\n\t\tif (uniqueIndexSignatureSchemas.length === 1) {\n\t\t\tadditionalProperties = uniqueIndexSignatureSchemas[0];\n\t\t} else if (uniqueIndexSignatureSchemas.length > 1) {\n\t\t\tadditionalProperties = { anyOf: uniqueIndexSignatureSchemas };\n\t\t}\n\n\t\tconst patternProperties = JsonSchemaBuilder.mergePatternPropertySchemas(patternPropertySchemas);\n\n\t\tlet propertyNames: IJsonSchema | undefined;\n\t\tif (patternPropertySchemas.length > 0 && uniqueIndexSignatureSchemas.length === 0) {\n\t\t\tconst staticKeys = Object.keys(properties);\n\t\t\tconst patternSchemas: IJsonSchema[] = Object.keys(patternProperties ?? {}).map(p => ({\n\t\t\t\tpattern: p\n\t\t\t}));\n\t\t\tif (staticKeys.length === 0) {\n\t\t\t\tpropertyNames = patternSchemas.length === 1 ? patternSchemas[0] : { anyOf: patternSchemas };\n\t\t\t} else {\n\t\t\t\tpropertyNames = { anyOf: [{ enum: staticKeys }, ...patternSchemas] };\n\t\t\t}\n\t\t}\n\n\t\treturn { properties, required, patternProperties, additionalProperties, propertyNames };\n\t}\n\n\t/**\n\t * Build an object schema from a type literal node.\n\t * @param context The generation context.\n\t * @param typeNode The type literal node.\n\t * @returns The object schema.\n\t */\n\tpublic static buildTypeLiteralSchema(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeLiteralNode\n\t): IJsonSchema {\n\t\tconst { properties, required, patternProperties, additionalProperties, propertyNames } =\n\t\t\tJsonSchemaBuilder.buildObjectMembersSchema(context, typeNode.members);\n\t\treturn {\n\t\t\ttype: \"object\",\n\t\t\tproperties: Object.keys(properties).length > 0 ? properties : undefined,\n\t\t\trequired: required.length > 0 ? required : undefined,\n\t\t\tpatternProperties,\n\t\t\tpropertyNames,\n\t\t\tadditionalProperties\n\t\t};\n\t}\n\n\t/**\n\t * Merge pattern property schemas by pattern, deduplicating equivalent branches.\n\t * @param patternPropertySchemas Pattern and schema entries to merge.\n\t * @returns Merged patternProperties map.\n\t */\n\tpublic static mergePatternPropertySchemas(\n\t\tpatternPropertySchemas: { pattern: string; schema: IJsonSchema }[]\n\t): { [pattern: string]: IJsonSchema } | undefined {\n\t\tif (patternPropertySchemas.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst groupedSchemas: { [pattern: string]: IJsonSchema[] } = {};\n\t\tfor (const patternPropertySchema of patternPropertySchemas) {\n\t\t\tgroupedSchemas[patternPropertySchema.pattern] ??= [];\n\t\t\tgroupedSchemas[patternPropertySchema.pattern].push(patternPropertySchema.schema);\n\t\t}\n\n\t\tconst mergedPatternProperties: { [pattern: string]: IJsonSchema } = {};\n\t\tfor (const [pattern, schemas] of Object.entries(groupedSchemas)) {\n\t\t\tconst uniqueSchemas = schemas.filter((schema, index, allSchemas) => {\n\t\t\t\tconst schemaKey = JsonHelper.canonicalize(schema);\n\t\t\t\treturn allSchemas.findIndex(s => JsonHelper.canonicalize(s) === schemaKey) === index;\n\t\t\t});\n\n\t\t\tmergedPatternProperties[pattern] =\n\t\t\t\tuniqueSchemas.length === 1 ? uniqueSchemas[0] : { anyOf: uniqueSchemas };\n\t\t}\n\n\t\treturn mergedPatternProperties;\n\t}\n\n\t/**\n\t * Map a property type node to schema.\n\t * @param context The generation context.\n\t * @param typeNode The member type node.\n\t * @returns The mapped member schema.\n\t */\n\tpublic static mapMemberTypeToSchema(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeNode\n\t): IJsonSchema | undefined {\n\t\t// [string, number] or [label: string, ...rest: string[]] (tuple type)\n\t\tif (ts.isTupleTypeNode(typeNode)) {\n\t\t\treturn JsonSchemaBuilder.mapTupleTypeToSchema(context, typeNode);\n\t\t}\n\n\t\t// typeof variable (type query, resolves the type of a declared value)\n\t\tif (ts.isTypeQueryNode(typeNode)) {\n\t\t\treturn ImportTypeQuerySchemaResolver.mapTypeQueryNodeToSchema(context, typeNode);\n\t\t}\n\n\t\t// { prop: string } (inline object type literal as a member type)\n\t\tif (ts.isTypeLiteralNode(typeNode)) {\n\t\t\treturn JsonSchemaBuilder.buildTypeLiteralSchema(context, typeNode);\n\t\t}\n\n\t\treturn JsonSchemaBuilder.mapTypeNodeToSchema(context, typeNode);\n\t}\n\n\t/**\n\t * Map TypeScript type nodes to JSON schema.\n\t * @param context The generation context.\n\t * @param typeNode The node to process.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapTypeNodeToSchema(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeNode\n\t): IJsonSchema | undefined {\n\t\tif (\n\t\t\t!JsonSchemaBuilder.checkTypeNodeAllowed(\n\t\t\t\tcontext,\n\t\t\t\ttypeNode,\n\t\t\t\tundefined,\n\t\t\t\tcontext.activeEnclosingObjectName\n\t\t\t)\n\t\t) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// readonly T[] or keyof T (type operator node)\n\t\tif (ts.isTypeOperatorNode(typeNode)) {\n\t\t\tif (typeNode.operator === ts.SyntaxKind.ReadonlyKeyword) {\n\t\t\t\treturn JsonSchemaBuilder.mapTypeNodeToSchema(context, typeNode.type);\n\t\t\t}\n\n\t\t\tif (typeNode.operator === ts.SyntaxKind.KeyOfKeyword) {\n\t\t\t\tconst keyofKeys = JsonSchemaBuilder.extractKeyofTypeKeys(context, typeNode.type);\n\t\t\t\tif (keyofKeys.length > 0) {\n\t\t\t\t\treturn { enum: keyofKeys };\n\t\t\t\t}\n\t\t\t\tif (JsonSchemaBuilder.isGenericKeyofOperand(context, typeNode.type)) {\n\t\t\t\t\treturn {};\n\t\t\t\t}\n\t\t\t\tDiagnosticReporter.report(\n\t\t\t\t\tcontext,\n\t\t\t\t\ttypeNode,\n\t\t\t\t\t\"jsonSchemaBuilder.diagnostic.unresolvedKeyofOperand\",\n\t\t\t\t\t{\n\t\t\t\t\t\toperand: typeNode.type.getText()\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\treturn {};\n\t\t\t}\n\t\t}\n\n\t\t// T[\"key\"] (indexed access type)\n\t\tif (ts.isIndexedAccessTypeNode(typeNode)) {\n\t\t\treturn JsonSchemaBuilder.mapIndexedAccessTypeToSchema(context, typeNode);\n\t\t}\n\n\t\t// `prefix-${T}` (template literal type)\n\t\tif (ts.isTemplateLiteralTypeNode(typeNode)) {\n\t\t\treturn JsonSchemaBuilder.mapTemplateLiteralTypeToSchema(context, typeNode);\n\t\t}\n\n\t\t// { [K in keyof T]: T[K] } (mapped type)\n\t\tif (ts.isMappedTypeNode(typeNode)) {\n\t\t\treturn JsonSchemaBuilder.mapMappedTypeToSchema(context, typeNode);\n\t\t}\n\n\t\t// T extends U ? X : Y (conditional type)\n\t\tif (ts.isConditionalTypeNode(typeNode)) {\n\t\t\treturn JsonSchemaBuilder.mapConditionalTypeToSchema(context, typeNode);\n\t\t}\n\n\t\t// (string | number) (parenthesised type, unwrap and recurse)\n\t\tif (ts.isParenthesizedTypeNode(typeNode)) {\n\t\t\treturn JsonSchemaBuilder.mapTypeNodeToSchema(context, typeNode.type);\n\t\t}\n\n\t\t// [string, number] or [label: string, ...rest: string[]] (tuple type)\n\t\tif (ts.isTupleTypeNode(typeNode)) {\n\t\t\treturn JsonSchemaBuilder.mapTupleTypeToSchema(context, typeNode);\n\t\t}\n\n\t\t// unknown (open schema, accepts any value)\n\t\tif (typeNode.kind === ts.SyntaxKind.UnknownKeyword) {\n\t\t\treturn {};\n\t\t}\n\t\t// any (open schema, accepts any value)\n\t\tif (typeNode.kind === ts.SyntaxKind.AnyKeyword) {\n\t\t\treturn {};\n\t\t}\n\t\t// never (empty schema that rejects all values)\n\t\tif (typeNode.kind === ts.SyntaxKind.NeverKeyword) {\n\t\t\treturn { not: {} };\n\t\t}\n\t\tif (typeNode.kind === ts.SyntaxKind.UndefinedKeyword) {\n\t\t\treturn undefined;\n\t\t}\n\t\tif (typeNode.kind === ts.SyntaxKind.VoidKeyword) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// string (string keyword type)\n\t\tif (typeNode.kind === ts.SyntaxKind.StringKeyword) {\n\t\t\treturn { type: \"string\" };\n\t\t}\n\t\t// number (number keyword type)\n\t\tif (typeNode.kind === ts.SyntaxKind.NumberKeyword) {\n\t\t\treturn { type: \"number\" };\n\t\t}\n\t\t// boolean (boolean keyword type)\n\t\tif (typeNode.kind === ts.SyntaxKind.BooleanKeyword) {\n\t\t\treturn { type: \"boolean\" };\n\t\t}\n\t\t// object (object keyword type)\n\t\tif (typeNode.kind === ts.SyntaxKind.ObjectKeyword) {\n\t\t\treturn { type: \"object\" };\n\t\t}\n\t\t// null (null keyword type)\n\t\tif (typeNode.kind === ts.SyntaxKind.NullKeyword) {\n\t\t\treturn { type: \"null\" };\n\t\t}\n\n\t\t// string[] or Foo[] (array type)\n\t\tif (ts.isArrayTypeNode(typeNode)) {\n\t\t\tconst elementType = JsonSchemaBuilder.mapTypeNodeToSchema(context, typeNode.elementType);\n\t\t\tif (elementType) {\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"array\",\n\t\t\t\t\titems: elementType\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\t// MyType<T> or Namespace.MyType (named type reference, possibly with type arguments)\n\t\tif (ts.isTypeReferenceNode(typeNode)) {\n\t\t\tconst typeName = ts.isIdentifier(typeNode.typeName)\n\t\t\t\t? typeNode.typeName.text\n\t\t\t\t: typeNode.typeName.right.text;\n\t\t\tconst typeParameterBinding = JsonSchemaBuilder.getTypeParameterBinding(context, typeName);\n\t\t\tif (typeParameterBinding !== undefined) {\n\t\t\t\treturn typeParameterBinding\n\t\t\t\t\t? JsonSchemaBuilder.mapTypeNodeToSchema(context, typeParameterBinding)\n\t\t\t\t\t: {};\n\t\t\t}\n\t\t\tif (typeName === \"undefined\") {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tif (typeName === \"Boolean\") {\n\t\t\t\treturn { type: \"boolean\" };\n\t\t\t}\n\t\t\tif (typeName === \"Object\") {\n\t\t\t\treturn { type: \"object\" };\n\t\t\t}\n\t\t\tif (typeName === \"Map\") {\n\t\t\t\tconst mapValueType = typeNode.typeArguments?.[1];\n\t\t\t\tconst additionalProperties = mapValueType\n\t\t\t\t\t? (JsonSchemaBuilder.mapTypeNodeToSchema(context, mapValueType) ?? {})\n\t\t\t\t\t: {};\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"object\",\n\t\t\t\t\tadditionalProperties\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (typeName === \"Set\") {\n\t\t\t\tconst setItemType = typeNode.typeArguments?.[0];\n\t\t\t\tconst items = setItemType\n\t\t\t\t\t? (JsonSchemaBuilder.mapTypeNodeToSchema(context, setItemType) ?? {})\n\t\t\t\t\t: {};\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"array\",\n\t\t\t\t\titems,\n\t\t\t\t\tuniqueItems: true\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (typeName === \"ReadonlyArray\") {\n\t\t\t\tconst arrayItemType = typeNode.typeArguments?.[0];\n\t\t\t\tconst items = arrayItemType\n\t\t\t\t\t? (JsonSchemaBuilder.mapTypeNodeToSchema(context, arrayItemType) ?? {})\n\t\t\t\t\t: {};\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"array\",\n\t\t\t\t\titems\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (Constants.ARRAY_NUMBER_TYPE_NAMES.includes(typeName)) {\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"array\",\n\t\t\t\t\titems: { type: \"number\" }\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst utilityHandler = JsonSchemaBuilder._utilityTypeHandlers[typeName];\n\t\t\tif (utilityHandler) {\n\t\t\t\treturn utilityHandler(context, typeNode);\n\t\t\t}\n\n\t\t\tif (Constants.UNSUPPORTED_UTILITY_TYPE_NAMES.includes(typeName)) {\n\t\t\t\tDiagnosticReporter.report(\n\t\t\t\t\tcontext,\n\t\t\t\t\ttypeNode,\n\t\t\t\t\t\"jsonSchemaBuilder.diagnostic.unsupportedUtilityType\",\n\t\t\t\t\t{ utilityType: typeName }\n\t\t\t\t);\n\t\t\t\treturn {};\n\t\t\t}\n\n\t\t\tconst title = StringHelper.stripPrefix(typeName);\n\t\t\tconst importedModuleSpecifier = context.activeSourceFile\n\t\t\t\t? JsonSchemaBuilder.findImportedModuleSpecifier(\n\t\t\t\t\t\tcontext.activeSourceFile,\n\t\t\t\t\t\ttypeNode,\n\t\t\t\t\t\ttypeName\n\t\t\t\t\t)\n\t\t\t\t: undefined;\n\t\t\tif (!importedModuleSpecifier || importedModuleSpecifier.startsWith(\".\")) {\n\t\t\t\tconst mappedReference = JsonSchemaBuilder.resolveReferenceMappingTarget(\n\t\t\t\t\tcontext,\n\t\t\t\t\t\"\",\n\t\t\t\t\ttypeName\n\t\t\t\t);\n\t\t\t\tif (mappedReference?.schemaId) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t$ref: mappedReference.schemaId\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst resolvedImportedSchemaId = JsonSchemaBuilder.resolveExternalTypeReferenceSchemaId(\n\t\t\t\tcontext,\n\t\t\t\ttypeNode,\n\t\t\t\ttypeName\n\t\t\t);\n\t\t\tconst existingSchemaId = resolvedImportedSchemaId\n\t\t\t\t? undefined\n\t\t\t\t: JsonSchemaBuilder.findExistingSchemaIdByTitle(context, title);\n\t\t\treturn {\n\t\t\t\t$ref: resolvedImportedSchemaId ?? existingSchemaId ?? `${context.namespace}${title}`\n\t\t\t};\n\t\t}\n\n\t\t// import(\"./module.js\").TypeName (import type node)\n\t\tif (ts.isImportTypeNode(typeNode)) {\n\t\t\treturn ImportTypeQuerySchemaResolver.mapImportTypeNodeToSchema(context, typeNode);\n\t\t}\n\n\t\t// { prop: string } (inline object type literal)\n\t\tif (ts.isTypeLiteralNode(typeNode)) {\n\t\t\treturn JsonSchemaBuilder.buildTypeLiteralSchema(context, typeNode);\n\t\t}\n\n\t\t// \"hello\" or 42 or true or false (literal type node wrapping a literal keyword or value)\n\t\tif (ts.isLiteralTypeNode(typeNode)) {\n\t\t\t// \"hello\" (string literal type)\n\t\t\tif (ts.isStringLiteral(typeNode.literal)) {\n\t\t\t\treturn { const: typeNode.literal.text };\n\t\t\t}\n\t\t\t// 42 (numeric literal type)\n\t\t\tif (ts.isNumericLiteral(typeNode.literal)) {\n\t\t\t\treturn { const: Number(typeNode.literal.text) };\n\t\t\t}\n\t\t\tif (typeNode.literal.kind === ts.SyntaxKind.NullKeyword) {\n\t\t\t\t// null (null keyword inside a literal type node)\n\t\t\t\treturn { type: \"null\" };\n\t\t\t}\n\t\t\tif (typeNode.literal.kind === ts.SyntaxKind.TrueKeyword) {\n\t\t\t\t// true (boolean true literal type — distinct from the boolean keyword type)\n\t\t\t\treturn { const: true };\n\t\t\t}\n\t\t\tif (typeNode.literal.kind === ts.SyntaxKind.FalseKeyword) {\n\t\t\t\t// false (boolean false literal type — distinct from the boolean keyword type)\n\t\t\t\treturn { const: false };\n\t\t\t}\n\t\t}\n\n\t\t// string | number | null (union type)\n\t\tif (ts.isUnionTypeNode(typeNode)) {\n\t\t\tconst mappedUnionTypes = typeNode.types\n\t\t\t\t.map(unionType => JsonSchemaBuilder.mapTypeNodeToSchema(context, unionType))\n\t\t\t\t.filter((mappedType): mappedType is IJsonSchema => mappedType !== undefined);\n\n\t\t\tif (mappedUnionTypes.length > 0) {\n\t\t\t\tif (mappedUnionTypes.length === 1) {\n\t\t\t\t\treturn mappedUnionTypes[0];\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\tJsonSchemaBuilder.isNeverDiscriminatedObjectUnion(\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t\ttypeNode.types,\n\t\t\t\t\t\tmappedUnionTypes\n\t\t\t\t\t) ||\n\t\t\t\t\tJsonSchemaBuilder.isLiteralTagDiscriminatedObjectUnion(context, mappedUnionTypes) ||\n\t\t\t\t\tJsonSchemaBuilder.isDisjointPrimitiveKeywordUnion(\n\t\t\t\t\t\ttypeNode,\n\t\t\t\t\t\ttypeNode.types,\n\t\t\t\t\t\tmappedUnionTypes\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\toneOf: mappedUnionTypes\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tanyOf: mappedUnionTypes\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\t// TypeA & TypeB (intersection type, try to merge into a single object schema)\n\t\tif (ts.isIntersectionTypeNode(typeNode)) {\n\t\t\tconst mappedIntersectionTypes = typeNode.types\n\t\t\t\t.map(intersectionType => JsonSchemaBuilder.mapTypeNodeToSchema(context, intersectionType))\n\t\t\t\t.filter((mappedType): mappedType is IJsonSchema => mappedType !== undefined);\n\n\t\t\tif (mappedIntersectionTypes.length > 0) {\n\t\t\t\tconst mergedIntersectionObjectSchema =\n\t\t\t\t\tIntersectionSchemaMerger.mergeIntersectionObjectSchemas(\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t\tmappedIntersectionTypes,\n\t\t\t\t\t\tschema => ObjectTransformer.toInlineUtilityObjectSchema(schema)\n\t\t\t\t\t);\n\t\t\t\tif (mergedIntersectionObjectSchema) {\n\t\t\t\t\treturn mergedIntersectionObjectSchema;\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tallOf: mappedIntersectionTypes\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\t// typeof variable (type query, treated as an open schema)\n\t\tif (ts.isTypeQueryNode(typeNode)) {\n\t\t\treturn ImportTypeQuerySchemaResolver.mapTypeQueryNodeToSchema(context, typeNode);\n\t\t}\n\n\t\tDiagnosticReporter.report(context, typeNode, \"jsonSchemaBuilder.diagnostic.unmappedTypeNode\", {\n\t\t\tkind: ts.SyntaxKind[typeNode.kind]\n\t\t});\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Determine whether a union of primitive keyword branches is pairwise disjoint.\n\t * @param unionTypeNode The union node being mapped.\n\t * @param unionTypeNodes The original union branch type nodes.\n\t * @param unionSchemas The mapped union branch schemas.\n\t * @returns True if every branch is a primitive keyword schema and no branches overlap.\n\t */\n\tpublic static isDisjointPrimitiveKeywordUnion(\n\t\tunionTypeNode: ts.UnionTypeNode,\n\t\tunionTypeNodes: ts.NodeArray<ts.TypeNode>,\n\t\tunionSchemas: IJsonSchema[]\n\t): boolean {\n\t\tif (unionSchemas.length < 2 || unionSchemas.length !== unionTypeNodes.length) {\n\t\t\treturn false;\n\t\t}\n\n\t\tlet unionContainer: ts.Node = unionTypeNode;\n\t\twhile (ts.isParenthesizedTypeNode(unionContainer.parent)) {\n\t\t\tunionContainer = unionContainer.parent;\n\t\t}\n\n\t\tif (\n\t\t\t!ts.isTypeAliasDeclaration(unionContainer.parent) ||\n\t\t\tunionContainer.parent.type !== unionContainer\n\t\t) {\n\t\t\t// Keep nested/property unions as anyOf; only top-level alias unions are promoted.\n\t\t\treturn false;\n\t\t}\n\n\t\tconst primitiveKinds = new Set<ts.SyntaxKind>([\n\t\t\tts.SyntaxKind.StringKeyword,\n\t\t\tts.SyntaxKind.NumberKeyword,\n\t\t\tts.SyntaxKind.BooleanKeyword,\n\t\t\tts.SyntaxKind.NullKeyword\n\t\t]);\n\n\t\tif (!unionTypeNodes.every(unionBranchType => primitiveKinds.has(unionBranchType.kind))) {\n\t\t\t// Mixed or non-primitive unions can overlap in value space.\n\t\t\treturn false;\n\t\t}\n\n\t\tconst schemaTypeDomains = unionSchemas.map(schema => {\n\t\t\tif (schema.type === \"integer\") {\n\t\t\t\treturn \"number\";\n\t\t\t}\n\n\t\t\treturn Is.stringValue(schema.type) ? schema.type : undefined;\n\t\t});\n\n\t\tif (\n\t\t\tschemaTypeDomains.some(\n\t\t\t\tschemaType =>\n\t\t\t\t\tschemaType !== \"string\" &&\n\t\t\t\t\tschemaType !== \"number\" &&\n\t\t\t\t\tschemaType !== \"boolean\" &&\n\t\t\t\t\tschemaType !== \"null\"\n\t\t\t)\n\t\t) {\n\t\t\t// Only primitive keyword domains are considered disjoint enough for oneOf.\n\t\t\treturn false;\n\t\t}\n\n\t\t// oneOf is safe when every branch maps to a unique primitive domain.\n\t\treturn new Set(schemaTypeDomains).size === unionSchemas.length;\n\t}\n\n\t/**\n\t * Determine whether a union of schemas represents mutually exclusive object branches.\n\t * @param context The generation context.\n\t * @param unionTypeNodes The union branch type nodes for cross-checking with the mapped schemas.\n\t * @param unionSchemas The mapped union branch schemas.\n\t * @returns True if each branch is an object schema with a unique required key set.\n\t */\n\tpublic static isNeverDiscriminatedObjectUnion(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tunionTypeNodes: ts.NodeArray<ts.TypeNode>,\n\t\tunionSchemas: IJsonSchema[]\n\t): boolean {\n\t\tif (unionSchemas.length < 2 || unionSchemas.length !== unionTypeNodes.length) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst branchInfos: {\n\t\t\trequiredKeys: Set<string>;\n\t\t\tforbiddenKeys: Set<string>;\n\t\t}[] = [];\n\t\tlet hasNeverDiscriminator = false;\n\n\t\tfor (const unionTypeNode of unionTypeNodes) {\n\t\t\tconst branchMembers = JsonSchemaBuilder.resolveNeverDiscriminatorMembers(\n\t\t\t\tcontext,\n\t\t\t\tunionTypeNode\n\t\t\t);\n\t\t\tif (!branchMembers) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst branchInfo: {\n\t\t\t\trequiredKeys: Set<string>;\n\t\t\t\tforbiddenKeys: Set<string>;\n\t\t\t} = {\n\t\t\t\trequiredKeys: new Set<string>(),\n\t\t\t\tforbiddenKeys: new Set<string>()\n\t\t\t};\n\n\t\t\tfor (const member of branchMembers) {\n\t\t\t\tif (ts.isPropertySignature(member) && member.type && member.name) {\n\t\t\t\t\tconst propertyName = JsonSchemaBuilder.extractPropertyName(context, member.name);\n\t\t\t\t\tif (propertyName) {\n\t\t\t\t\t\tif (member.type.kind === ts.SyntaxKind.NeverKeyword) {\n\t\t\t\t\t\t\t// never marks a property as impossible in this branch.\n\t\t\t\t\t\t\tbranchInfo.forbiddenKeys.add(propertyName);\n\t\t\t\t\t\t\thasNeverDiscriminator = true;\n\t\t\t\t\t\t} else if (!member.questionToken) {\n\t\t\t\t\t\t\t// Required non-never keys are the positive branch signals.\n\t\t\t\t\t\t\tbranchInfo.requiredKeys.add(propertyName);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tbranchInfos.push(branchInfo);\n\t\t}\n\n\t\tif (!hasNeverDiscriminator) {\n\t\t\treturn false;\n\t\t}\n\n\t\tfor (const branchInfo of branchInfos) {\n\t\t\tif (branchInfo.requiredKeys.size === 0 && branchInfo.forbiddenKeys.size === 0) {\n\t\t\t\t// Require each branch to contribute at least one discriminating signal.\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tfor (let i = 0; i < branchInfos.length; i++) {\n\t\t\tfor (let j = i + 1; j < branchInfos.length; j++) {\n\t\t\t\tconst firstBranch = branchInfos[i];\n\t\t\t\tconst secondBranch = branchInfos[j];\n\n\t\t\t\tconst firstExcludesSecond = [...firstBranch.requiredKeys].some(requiredKey =>\n\t\t\t\t\tsecondBranch.forbiddenKeys.has(requiredKey)\n\t\t\t\t);\n\t\t\t\tconst secondExcludesFirst = [...secondBranch.requiredKeys].some(requiredKey =>\n\t\t\t\t\tfirstBranch.forbiddenKeys.has(requiredKey)\n\t\t\t\t);\n\n\t\t\t\tif (!firstExcludesSecond && !secondExcludesFirst) {\n\t\t\t\t\t// Branch pairs must be mutually exclusive in at least one direction.\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Determine whether object union branches are discriminated by a shared required literal tag.\n\t * @param context The generation context.\n\t * @param unionSchemas The mapped union branch schemas.\n\t * @returns True if the union can be safely represented as oneOf.\n\t */\n\tpublic static isLiteralTagDiscriminatedObjectUnion(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tunionSchemas: IJsonSchema[]\n\t): boolean {\n\t\tif (unionSchemas.length < 2) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst resolvedObjectSchemas = unionSchemas\n\t\t\t.map(schema => JsonSchemaBuilder.resolveLocalSchemaReference(context, schema) ?? schema)\n\t\t\t.filter(\n\t\t\t\t(\n\t\t\t\t\tschema\n\t\t\t\t): schema is IJsonSchema & {\n\t\t\t\t\tproperties: { [key: string]: IJsonSchema };\n\t\t\t\t\trequired: string[];\n\t\t\t\t} =>\n\t\t\t\t\tschema.type === \"object\" &&\n\t\t\t\t\tIs.object(schema.properties) &&\n\t\t\t\t\tIs.array<string>(schema.required)\n\t\t\t);\n\n\t\tif (resolvedObjectSchemas.length !== unionSchemas.length) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst requiredDiscriminatorKeys = resolvedObjectSchemas.map(objectSchema => {\n\t\t\tconst discriminators = new Map<string, unknown>();\n\n\t\t\tfor (const requiredKey of objectSchema.required) {\n\t\t\t\tconst propertySchema = objectSchema.properties[requiredKey];\n\t\t\t\tif (\n\t\t\t\t\tIs.object(propertySchema) &&\n\t\t\t\t\tObject.prototype.hasOwnProperty.call(propertySchema, \"const\")\n\t\t\t\t) {\n\t\t\t\t\tdiscriminators.set(requiredKey, propertySchema.const);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn discriminators;\n\t\t});\n\n\t\tconst candidateKeys = new Set<string>(requiredDiscriminatorKeys[0].keys());\n\t\tfor (const discriminatorMap of requiredDiscriminatorKeys.slice(1)) {\n\t\t\tfor (const candidateKey of [...candidateKeys]) {\n\t\t\t\tif (!discriminatorMap.has(candidateKey)) {\n\t\t\t\t\tcandidateKeys.delete(candidateKey);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const candidateKey of candidateKeys) {\n\t\t\tconst discriminatorValues = requiredDiscriminatorKeys.map(discriminatorMap =>\n\t\t\t\tJsonHelper.canonicalize(discriminatorMap.get(candidateKey))\n\t\t\t);\n\n\t\t\tif (new Set(discriminatorValues).size === unionSchemas.length) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Resolve branch members that can encode never-based discriminators.\n\t * @param context The generation context.\n\t * @param unionTypeNode The union branch type node.\n\t * @returns Type members for the branch when resolvable.\n\t */\n\tpublic static resolveNeverDiscriminatorMembers(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tunionTypeNode: ts.TypeNode\n\t): ts.NodeArray<ts.TypeElement> | undefined {\n\t\tconst findTypeMembersInSourceFile = (\n\t\t\tsourceFile: ts.SourceFile,\n\t\t\ttypeName: string\n\t\t): ts.NodeArray<ts.TypeElement> | undefined => {\n\t\t\tfor (const statement of sourceFile.statements) {\n\t\t\t\tif (ts.isInterfaceDeclaration(statement) && statement.name.text === typeName) {\n\t\t\t\t\treturn statement.members;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\tts.isTypeAliasDeclaration(statement) &&\n\t\t\t\t\tstatement.name.text === typeName &&\n\t\t\t\t\tts.isTypeLiteralNode(statement.type)\n\t\t\t\t) {\n\t\t\t\t\treturn statement.type.members;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t};\n\n\t\t// { discriminator: \"a\"; other: string } (inline type literal as union branch)\n\t\tif (ts.isTypeLiteralNode(unionTypeNode)) {\n\t\t\treturn unionTypeNode.members;\n\t\t}\n\n\t\t// BranchType (named type reference resolves to its declaration)\n\t\tif (!ts.isTypeReferenceNode(unionTypeNode)) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst sourceFile = context.activeSourceFile;\n\t\tif (!sourceFile) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// BranchType (plain identifier type name)\n\t\tconst typeName = ts.isIdentifier(unionTypeNode.typeName)\n\t\t\t? unionTypeNode.typeName.text\n\t\t\t: unionTypeNode.typeName.right.text;\n\n\t\tconst localMembers = findTypeMembersInSourceFile(sourceFile, typeName);\n\t\tif (localMembers) {\n\t\t\treturn localMembers;\n\t\t}\n\n\t\tconst importedTypeReference = JsonSchemaBuilder.findImportedTypeReference(context, typeName);\n\t\tif (!importedTypeReference?.moduleSpecifier.startsWith(\".\")) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst resolvedImportPath = JsonSchemaBuilder.resolveImportDeclarationSourceFile(\n\t\t\tsourceFile.fileName,\n\t\t\timportedTypeReference.moduleSpecifier\n\t\t);\n\t\tif (!resolvedImportPath) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst importedSource = FileUtils.readFile(resolvedImportPath);\n\t\tif (!importedSource) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst importedSourceFile = ts.createSourceFile(\n\t\t\tresolvedImportPath,\n\t\t\timportedSource,\n\t\t\tts.ScriptTarget.Latest,\n\t\t\ttrue\n\t\t);\n\n\t\treturn findTypeMembersInSourceFile(importedSourceFile, importedTypeReference.candidateTypeName);\n\t}\n\n\t/**\n\t * Resolve a local $ref schema to its stored schema definition.\n\t * @param context The generation context.\n\t * @param schema The schema that may contain a local reference.\n\t * @returns The resolved schema when available.\n\t */\n\tpublic static resolveLocalSchemaReference(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tschema: IJsonSchema\n\t): IJsonSchema | undefined {\n\t\tif (!schema.$ref?.startsWith(context.namespace)) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst schemaTitle = schema.$ref.slice(context.namespace.length);\n\t\treturn context.schemas[context.packageName]?.[schemaTitle];\n\t}\n\n\t/**\n\t * Resolve a property value from a const object declaration in an imported source file.\n\t * @param context The generation context.\n\t * @param objectName The name of the const object.\n\t * @param propertyName The name of the property to resolve.\n\t * @returns The resolved string or number value, or undefined if unresolvable.\n\t */\n\tpublic static resolveConstObjectProperty(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tobjectName: string,\n\t\tpropertyName: string\n\t): string | number | undefined {\n\t\tif (!context.activeSourceFile) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst importReference = JsonSchemaBuilder.findImportedValueReference(\n\t\t\tcontext.activeSourceFile,\n\t\t\tobjectName\n\t\t);\n\t\tif (!importReference) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst resolvedPath = JsonSchemaBuilder.resolveImportDeclarationSourceFile(\n\t\t\tcontext.activeSourceFile.fileName,\n\t\t\timportReference.moduleSpecifier\n\t\t);\n\t\tif (!resolvedPath) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst importedSource = FileUtils.readFile(resolvedPath);\n\t\tif (!importedSource) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst importedSourceFile = ts.createSourceFile(\n\t\t\tresolvedPath,\n\t\t\timportedSource,\n\t\t\tts.ScriptTarget.Latest,\n\t\t\ttrue\n\t\t);\n\n\t\tlet objDecl = importedSourceFile.statements\n\t\t\t// export const FOO = { ... } as const (variable statement)\n\t\t\t.filter((stmt): stmt is ts.VariableStatement => ts.isVariableStatement(stmt))\n\t\t\t.flatMap(stmt => [...stmt.declarationList.declarations])\n\t\t\t// FOO (plain identifier binding name)\n\t\t\t.find(decl => ts.isIdentifier(decl.name) && decl.name.text === importReference.importedName);\n\n\t\tobjDecl ??= JsonSchemaBuilder.findVariableDeclarationInModuleGraph(\n\t\t\tresolvedPath,\n\t\t\timportReference.importedName,\n\t\t\tnew Set<string>()\n\t\t);\n\n\t\tif (!objDecl) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst valueFromInitializer =\n\t\t\tJsonSchemaBuilder.extractConstObjectPropertyFromDeclarationInitializer(objDecl, propertyName);\n\t\tif (valueFromInitializer !== undefined) {\n\t\t\treturn valueFromInitializer;\n\t\t}\n\n\t\tif (objDecl.type) {\n\t\t\treturn JsonSchemaBuilder.extractConstObjectPropertyFromDeclarationType(\n\t\t\t\tobjDecl.type,\n\t\t\t\tpropertyName\n\t\t\t);\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Find a variable declaration by traversing import and export chains.\n\t * @param sourceFilePath The source file path to start from.\n\t * @param variableName The variable declaration name to find.\n\t * @param visitedFiles The file set already visited.\n\t * @returns The variable declaration when found.\n\t */\n\tpublic static findVariableDeclarationInModuleGraph(\n\t\tsourceFilePath: string,\n\t\tvariableName: string,\n\t\tvisitedFiles: Set<string>\n\t): ts.VariableDeclaration | undefined {\n\t\tconst normalizedSourceFilePath = FileUtils.normalizeFilePath(sourceFilePath);\n\t\tif (visitedFiles.has(normalizedSourceFilePath)) {\n\t\t\treturn undefined;\n\t\t}\n\t\tvisitedFiles.add(normalizedSourceFilePath);\n\n\t\tconst source = FileUtils.readFile(sourceFilePath);\n\t\tif (!source) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst sourceFile = ts.createSourceFile(sourceFilePath, source, ts.ScriptTarget.Latest, true);\n\n\t\tconst declaration = sourceFile.statements\n\t\t\t.filter((stmt): stmt is ts.VariableStatement => ts.isVariableStatement(stmt))\n\t\t\t.flatMap(stmt => [...stmt.declarationList.declarations])\n\t\t\t.find(decl => ts.isIdentifier(decl.name) && decl.name.text === variableName);\n\t\tif (declaration) {\n\t\t\treturn declaration;\n\t\t}\n\n\t\tconst compilerOptions: ts.CompilerOptions = {\n\t\t\tmodule: ts.ModuleKind.NodeNext,\n\t\t\tmoduleResolution: ts.ModuleResolutionKind.NodeNext,\n\t\t\ttarget: ts.ScriptTarget.ESNext,\n\t\t\tskipLibCheck: true\n\t\t};\n\n\t\tconst moduleSpecifiers = sourceFile.statements\n\t\t\t.filter(statement => ts.isExportDeclaration(statement) || ts.isImportDeclaration(statement))\n\t\t\t.flatMap(statement => {\n\t\t\t\tconst moduleSpecifier = statement.moduleSpecifier;\n\t\t\t\treturn moduleSpecifier && ts.isStringLiteral(moduleSpecifier) ? [moduleSpecifier.text] : [];\n\t\t\t});\n\n\t\tfor (const moduleSpecifier of moduleSpecifiers) {\n\t\t\tconst resolvedModulePath = ts.resolveModuleName(\n\t\t\t\tmoduleSpecifier,\n\t\t\t\tsourceFilePath,\n\t\t\t\tcompilerOptions,\n\t\t\t\tts.sys\n\t\t\t).resolvedModule?.resolvedFileName;\n\n\t\t\tif (resolvedModulePath) {\n\t\t\t\tconst declarationInModule = JsonSchemaBuilder.findVariableDeclarationInModuleGraph(\n\t\t\t\t\tresolvedModulePath,\n\t\t\t\t\tvariableName,\n\t\t\t\t\tvisitedFiles\n\t\t\t\t);\n\t\t\t\tif (declarationInModule) {\n\t\t\t\t\treturn declarationInModule;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Find an imported symbol reference by local identifier name.\n\t * @param sourceFile The source file to inspect.\n\t * @param localName The local identifier name.\n\t * @returns The module specifier and imported symbol name.\n\t */\n\tpublic static findImportedValueReference(\n\t\tsourceFile: ts.SourceFile,\n\t\tlocalName: string\n\t):\n\t\t| {\n\t\t\t\tmoduleSpecifier: string;\n\t\t\t\timportedName: string;\n\t\t }\n\t\t| undefined {\n\t\tfor (const statement of sourceFile.statements) {\n\t\t\tif (ts.isImportDeclaration(statement) && ts.isStringLiteral(statement.moduleSpecifier)) {\n\t\t\t\tconst bindings = statement.importClause?.namedBindings;\n\t\t\t\tif (bindings && ts.isNamedImports(bindings)) {\n\t\t\t\t\tconst importElement = bindings.elements.find(el => el.name.text === localName);\n\t\t\t\t\tif (importElement) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tmoduleSpecifier: statement.moduleSpecifier.text,\n\t\t\t\t\t\t\timportedName: importElement.propertyName?.text ?? importElement.name.text\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Resolve an import declaration module specifier to a source file.\n\t * @param containingSourceFilePath The containing source file path.\n\t * @param moduleSpecifier The module specifier text.\n\t * @returns The resolved source file path.\n\t */\n\tpublic static resolveImportDeclarationSourceFile(\n\t\tcontainingSourceFilePath: string,\n\t\tmoduleSpecifier: string\n\t): string | undefined {\n\t\tconst resolvedContainingSourceFilePath = FileUtils.resolvePath(containingSourceFilePath);\n\n\t\tif (moduleSpecifier.startsWith(\".\")) {\n\t\t\treturn (\n\t\t\t\tFileUtils.resolveImportSourceFilePath(resolvedContainingSourceFilePath, moduleSpecifier) ??\n\t\t\t\t(moduleSpecifier.endsWith(\".js\")\n\t\t\t\t\t? FileUtils.resolveImportSourceFilePath(\n\t\t\t\t\t\t\tresolvedContainingSourceFilePath,\n\t\t\t\t\t\t\t`${moduleSpecifier.slice(0, -3)}.ts`\n\t\t\t\t\t\t)\n\t\t\t\t\t: undefined)\n\t\t\t);\n\t\t}\n\n\t\tconst compilerOptions: ts.CompilerOptions = {\n\t\t\tmodule: ts.ModuleKind.NodeNext,\n\t\t\tmoduleResolution: ts.ModuleResolutionKind.NodeNext,\n\t\t\ttarget: ts.ScriptTarget.ESNext,\n\t\t\tskipLibCheck: true\n\t\t};\n\n\t\treturn ts.resolveModuleName(\n\t\t\tmoduleSpecifier,\n\t\t\tresolvedContainingSourceFilePath,\n\t\t\tcompilerOptions,\n\t\t\tts.sys\n\t\t).resolvedModule?.resolvedFileName;\n\t}\n\n\t/**\n\t * Extract a const-object property value from a declaration initializer.\n\t * @param objectDeclaration The variable declaration.\n\t * @param propertyName The property to resolve.\n\t * @returns The resolved value.\n\t */\n\tpublic static extractConstObjectPropertyFromDeclarationInitializer(\n\t\tobjectDeclaration: ts.VariableDeclaration,\n\t\tpropertyName: string\n\t): string | number | undefined {\n\t\tif (!objectDeclaration.initializer) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tlet objLiteral: ts.ObjectLiteralExpression | undefined;\n\t\t// { key: \"value\" } (plain object literal initializer)\n\t\tif (ts.isObjectLiteralExpression(objectDeclaration.initializer)) {\n\t\t\tobjLiteral = objectDeclaration.initializer;\n\t\t} else if (\n\t\t\t// { key: \"value\" } as const (object literal wrapped in as-expression)\n\t\t\tts.isAsExpression(objectDeclaration.initializer) &&\n\t\t\t// { key: \"value\" } (unwrap the as-expression to get the literal)\n\t\t\tts.isObjectLiteralExpression(objectDeclaration.initializer.expression)\n\t\t) {\n\t\t\tobjLiteral = objectDeclaration.initializer.expression;\n\t\t}\n\n\t\tif (!objLiteral) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst prop = objLiteral.properties\n\t\t\t// key: \"value\" (named property assignment)\n\t\t\t.filter((p): p is ts.PropertyAssignment => ts.isPropertyAssignment(p))\n\t\t\t// myProp (plain identifier property name)\n\t\t\t.find(p => ts.isIdentifier(p.name) && p.name.text === propertyName);\n\n\t\tif (!prop) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// \"value\" (string literal property value)\n\t\tif (ts.isStringLiteral(prop.initializer)) {\n\t\t\treturn prop.initializer.text;\n\t\t}\n\t\t// 42 (numeric literal property value)\n\t\tif (ts.isNumericLiteral(prop.initializer)) {\n\t\t\treturn Number(prop.initializer.text);\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Extract a const-object property value from a declaration type annotation.\n\t * @param declarationTypeNode The declaration type annotation.\n\t * @param propertyName The property to resolve.\n\t * @returns The resolved value.\n\t */\n\tpublic static extractConstObjectPropertyFromDeclarationType(\n\t\tdeclarationTypeNode: ts.TypeNode,\n\t\tpropertyName: string\n\t): string | number | undefined {\n\t\tif (ts.isParenthesizedTypeNode(declarationTypeNode)) {\n\t\t\treturn JsonSchemaBuilder.extractConstObjectPropertyFromDeclarationType(\n\t\t\t\tdeclarationTypeNode.type,\n\t\t\t\tpropertyName\n\t\t\t);\n\t\t}\n\n\t\tif (\n\t\t\tts.isTypeOperatorNode(declarationTypeNode) &&\n\t\t\tdeclarationTypeNode.operator === ts.SyntaxKind.ReadonlyKeyword\n\t\t) {\n\t\t\treturn JsonSchemaBuilder.extractConstObjectPropertyFromDeclarationType(\n\t\t\t\tdeclarationTypeNode.type,\n\t\t\t\tpropertyName\n\t\t\t);\n\t\t}\n\n\t\tif (\n\t\t\tts.isTypeReferenceNode(declarationTypeNode) &&\n\t\t\tts.isIdentifier(declarationTypeNode.typeName) &&\n\t\t\tdeclarationTypeNode.typeName.text === \"Readonly\" &&\n\t\t\tIs.arrayValue(declarationTypeNode.typeArguments)\n\t\t) {\n\t\t\treturn JsonSchemaBuilder.extractConstObjectPropertyFromDeclarationType(\n\t\t\t\tdeclarationTypeNode.typeArguments[0],\n\t\t\t\tpropertyName\n\t\t\t);\n\t\t}\n\n\t\tif (ts.isTypeLiteralNode(declarationTypeNode)) {\n\t\t\tconst propertySignature = declarationTypeNode.members.find(\n\t\t\t\t(member): member is ts.PropertySignature => {\n\t\t\t\t\tif (!ts.isPropertySignature(member) || !member.name) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t(ts.isIdentifier(member.name) && member.name.text === propertyName) ||\n\t\t\t\t\t\t(ts.isStringLiteral(member.name) && member.name.text === propertyName) ||\n\t\t\t\t\t\t(ts.isNumericLiteral(member.name) && member.name.text === propertyName)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t);\n\n\t\t\tif (propertySignature?.type) {\n\t\t\t\treturn JsonSchemaBuilder.extractLiteralValueFromTypeNode(propertySignature.type);\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Extract a literal value from a type node when possible.\n\t * @param typeNode The type node.\n\t * @returns The literal value.\n\t */\n\tpublic static extractLiteralValueFromTypeNode(\n\t\ttypeNode: ts.TypeNode\n\t): string | number | undefined {\n\t\tif (ts.isLiteralTypeNode(typeNode)) {\n\t\t\tif (ts.isStringLiteral(typeNode.literal)) {\n\t\t\t\treturn typeNode.literal.text;\n\t\t\t}\n\n\t\t\tif (ts.isNumericLiteral(typeNode.literal)) {\n\t\t\t\treturn Number(typeNode.literal.text);\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Extract a referenced type name from an import type qualifier.\n\t * @param qualifier The import type qualifier.\n\t * @returns The resolved type name.\n\t */\n\tpublic static extractImportTypeName(qualifier: ts.EntityName | undefined): string | undefined {\n\t\tif (!qualifier) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// TypeName (plain identifier, e.g. import(\"pkg\").TypeName)\n\t\tif (ts.isIdentifier(qualifier)) {\n\t\t\treturn qualifier.text;\n\t\t}\n\n\t\t// Namespace.TypeName (qualified name, e.g. import(\"pkg\").Namespace.TypeName)\n\t\treturn qualifier.right.text;\n\t}\n\n\t/**\n\t * Resolve import-type references to local or external schema ids.\n\t * @param context The generation context.\n\t * @param moduleSpecifier The import module specifier.\n\t * @param typeName The imported type name.\n\t * @param title The derived schema title.\n\t * @returns The resolved schema id.\n\t */\n\tpublic static resolveImportTypeReferenceSchemaId(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tmoduleSpecifier: string,\n\t\ttypeName: string,\n\t\ttitle: string\n\t): string | undefined {\n\t\tconst mappedReference = JsonSchemaBuilder.resolveReferenceMappingTarget(\n\t\t\tcontext,\n\t\t\tmoduleSpecifier,\n\t\t\ttypeName\n\t\t);\n\n\t\tif (moduleSpecifier.startsWith(\".\")) {\n\t\t\tif (mappedReference?.schemaId) {\n\t\t\t\treturn mappedReference.schemaId;\n\t\t\t}\n\n\t\t\tconst activeFilePath = context.activeSourceFile?.fileName;\n\t\t\tif (!activeFilePath) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst resolvedImportPath = FileUtils.resolveImportSourceFilePath(\n\t\t\t\tactiveFilePath,\n\t\t\t\tmoduleSpecifier\n\t\t\t);\n\t\t\tif (!resolvedImportPath) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst importedSource = FileUtils.readFile(resolvedImportPath);\n\t\t\tif (!importedSource) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tJsonSchemaBuilder.parseAllObjectSchemas(context, resolvedImportPath, importedSource, []);\n\t\t\treturn context.schemas[context.packageName]?.[title]?.$id;\n\t\t}\n\n\t\tconst cachedSchemaId = context.schemas[moduleSpecifier]?.[title]?.$id;\n\t\tif (cachedSchemaId) {\n\t\t\treturn cachedSchemaId;\n\t\t}\n\n\t\tconst declarationResult = Resolver.resolveTypeDeclarationAst(moduleSpecifier, typeName);\n\t\tif (!declarationResult) {\n\t\t\treturn mappedReference?.schemaId;\n\t\t}\n\n\t\tconst externalContext: ITypeScriptToSchemaContext = {\n\t\t\tnamespace: mappedReference?.namespace ?? context.namespace,\n\t\t\tpackageName: moduleSpecifier,\n\t\t\tschemas: context.schemas,\n\t\t\tactiveSourceFile: context.activeSourceFile,\n\t\t\toptions: context.options\n\t\t};\n\n\t\tJsonSchemaBuilder.parseAllObjectSchemas(\n\t\t\texternalContext,\n\t\t\tdeclarationResult.sourceFile.fileName,\n\t\t\tdeclarationResult.sourceFile.getFullText(),\n\t\t\t[]\n\t\t);\n\n\t\treturn context.schemas[moduleSpecifier]?.[title]?.$id ?? mappedReference?.schemaId;\n\t}\n\n\t/**\n\t * Infer a primitive JSON schema from a literal expression.\n\t * @param context The generation context.\n\t * @param expr The expression to inspect.\n\t * @param asConst Whether to produce exact const schemas matching an as-const assertion.\n\t * @returns The inferred schema.\n\t */\n\tpublic static inferSchemaFromExpression(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\texpr: ts.Expression,\n\t\tasConst: boolean = false\n\t): IJsonSchema {\n\t\t// expr satisfies Type (satisfies operator, unwrap and recurse)\n\t\tif (ts.isSatisfiesExpression(expr)) {\n\t\t\treturn JsonSchemaBuilder.inferSchemaFromExpression(context, expr.expression, asConst);\n\t\t}\n\n\t\t// expr as const or expr as Type (as-expression, detect const assertion)\n\t\t// TypeScript does not have a dedicated SyntaxKind for `as const`. Instead the\n\t\t// compiler represents it as an AsExpression whose type child is a TypeReferenceNode\n\t\t// whose typeName identifier text is literally \"const\". Checking for that string is\n\t\t// the only reliable way to distinguish `as const` from `as SomeNamedType`.\n\t\tif (ts.isAsExpression(expr)) {\n\t\t\tconst isConstAssertion =\n\t\t\t\t// expr as Type (type reference in the as clause)\n\t\t\t\tts.isTypeReferenceNode(expr.type) &&\n\t\t\t\t// const (the identifier must be \"const\")\n\t\t\t\tts.isIdentifier(expr.type.typeName) &&\n\t\t\t\texpr.type.typeName.text === \"const\";\n\t\t\treturn JsonSchemaBuilder.inferSchemaFromExpression(\n\t\t\t\tcontext,\n\t\t\t\texpr.expression,\n\t\t\t\tisConstAssertion\n\t\t\t);\n\t\t}\n\n\t\tif (\n\t\t\t// -42 (prefix unary minus applied to a numeric literal)\n\t\t\tts.isPrefixUnaryExpression(expr) &&\n\t\t\texpr.operator === ts.SyntaxKind.MinusToken &&\n\t\t\t// 42 (the operand must be a bare numeric literal)\n\t\t\tts.isNumericLiteral(expr.operand)\n\t\t) {\n\t\t\treturn asConst ? { const: -Number(expr.operand.text) } : { type: \"number\" };\n\t\t}\n\n\t\t// \"hello\" or `hello` (plain string or no-substitution template literal)\n\t\tif (ts.isStringLiteral(expr) || ts.isNoSubstitutionTemplateLiteral(expr)) {\n\t\t\treturn asConst ? { const: expr.text } : { type: \"string\" };\n\t\t}\n\t\t// 42 (numeric literal)\n\t\tif (ts.isNumericLiteral(expr)) {\n\t\t\treturn asConst ? { const: Number(expr.text) } : { type: \"number\" };\n\t\t}\n\t\tif (expr.kind === ts.SyntaxKind.TrueKeyword) {\n\t\t\treturn asConst ? { const: true } : { type: \"boolean\" };\n\t\t}\n\t\tif (expr.kind === ts.SyntaxKind.FalseKeyword) {\n\t\t\treturn asConst ? { const: false } : { type: \"boolean\" };\n\t\t}\n\t\tif (expr.kind === ts.SyntaxKind.NullKeyword) {\n\t\t\treturn asConst ? { const: null } : { type: \"null\" };\n\t\t}\n\t\t// { key: \"value\" } (object literal expression)\n\t\tif (ts.isObjectLiteralExpression(expr)) {\n\t\t\treturn JsonSchemaBuilder.inferObjectLiteralSchema(context, expr, asConst);\n\t\t}\n\t\t// [\"a\", \"b\"] (array literal expression)\n\t\tif (ts.isArrayLiteralExpression(expr)) {\n\t\t\treturn JsonSchemaBuilder.inferArrayLiteralSchema(context, expr, asConst);\n\t\t}\n\n\t\tDiagnosticReporter.report(\n\t\t\tcontext,\n\t\t\texpr,\n\t\t\t\"jsonSchemaBuilder.diagnostic.unsupportedInferredExpressionKind\",\n\t\t\t{ kind: ts.SyntaxKind[expr.kind] }\n\t\t);\n\t\treturn {};\n\t}\n\n\t/**\n\t * Infer an object schema from an object literal expression, using const or widened types.\n\t * @param context The generation context.\n\t * @param expr The object literal expression.\n\t * @param asConst Whether property value schemas should be exact const types.\n\t * @returns The inferred object schema.\n\t */\n\tpublic static inferObjectLiteralSchema(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\texpr: ts.ObjectLiteralExpression,\n\t\tasConst: boolean\n\t): IJsonSchema {\n\t\tconst properties: { [key: string]: IJsonSchema } = {};\n\t\tconst required: string[] = [];\n\t\tfor (const property of expr.properties) {\n\t\t\t// key: \"value\" (named property assignment)\n\t\t\tif (ts.isPropertyAssignment(property)) {\n\t\t\t\tif (ts.isComputedPropertyName(property.name)) {\n\t\t\t\t\tDiagnosticReporter.report(\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t\tproperty.name,\n\t\t\t\t\t\t\"jsonSchemaBuilder.diagnostic.unsupportedInferredObjectComputedKey\",\n\t\t\t\t\t\t{ propertyName: property.name.getText() }\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tlet key: string | undefined;\n\t\t\t\t\t// myProp or \"my-prop\" (identifier or quoted string key)\n\t\t\t\t\tif (ts.isIdentifier(property.name) || ts.isStringLiteral(property.name)) {\n\t\t\t\t\t\tkey = property.name.text;\n\t\t\t\t\t}\n\t\t\t\t\tif (key !== undefined) {\n\t\t\t\t\t\tproperties[key] = JsonSchemaBuilder.inferSchemaFromExpression(\n\t\t\t\t\t\t\tcontext,\n\t\t\t\t\t\t\tproperty.initializer,\n\t\t\t\t\t\t\tasConst\n\t\t\t\t\t\t);\n\t\t\t\t\t\trequired.push(key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// { shorthand } (shorthand property, resolves the variable's type/value)\n\t\t\t} else if (ts.isShorthandPropertyAssignment(property)) {\n\t\t\t\tconst shorthandDeclaration = JsonSchemaBuilder.findVariableDeclaration(\n\t\t\t\t\tcontext.activeSourceFile,\n\t\t\t\t\tproperty.name.text\n\t\t\t\t);\n\t\t\t\tif (shorthandDeclaration?.type) {\n\t\t\t\t\tproperties[property.name.text] =\n\t\t\t\t\t\tJsonSchemaBuilder.mapTypeNodeToSchema(context, shorthandDeclaration.type) ?? {};\n\t\t\t\t\trequired.push(property.name.text);\n\t\t\t\t} else if (shorthandDeclaration?.initializer) {\n\t\t\t\t\tproperties[property.name.text] = JsonSchemaBuilder.inferSchemaFromExpression(\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t\tshorthandDeclaration.initializer,\n\t\t\t\t\t\tasConst\n\t\t\t\t\t);\n\t\t\t\t\trequired.push(property.name.text);\n\t\t\t\t} else {\n\t\t\t\t\tDiagnosticReporter.report(\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t\tproperty,\n\t\t\t\t\t\t\"jsonSchemaBuilder.diagnostic.unsupportedInferredObjectMemberKind\",\n\t\t\t\t\t\t{ kind: \"ShorthandPropertyAssignment\", memberName: property.name.text }\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t// { ...spread } (spread assignment, not supported for inference)\n\t\t\t} else if (ts.isSpreadAssignment(property)) {\n\t\t\t\tDiagnosticReporter.report(\n\t\t\t\t\tcontext,\n\t\t\t\t\tproperty,\n\t\t\t\t\t\"jsonSchemaBuilder.diagnostic.unsupportedInferredObjectSpread\",\n\t\t\t\t\t{ expression: property.expression.getText() }\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tDiagnosticReporter.report(\n\t\t\t\t\tcontext,\n\t\t\t\t\tproperty,\n\t\t\t\t\t\"jsonSchemaBuilder.diagnostic.unsupportedInferredObjectMemberKind\",\n\t\t\t\t\t{ kind: ts.SyntaxKind[property.kind] }\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tif (Object.keys(properties).length === 0) {\n\t\t\treturn { type: \"object\" };\n\t\t}\n\t\treturn { type: \"object\", properties, required };\n\t}\n\n\t/**\n\t * Infer an array schema from an array literal expression.\n\t * For as-const arrays a fixed-length tuple schema is produced; otherwise a plain array schema.\n\t * @param context The generation context.\n\t * @param expr The array literal expression.\n\t * @param asConst Whether to produce a const-exact tuple schema.\n\t * @returns The inferred array schema.\n\t */\n\tpublic static inferArrayLiteralSchema(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\texpr: ts.ArrayLiteralExpression,\n\t\tasConst: boolean\n\t): IJsonSchema {\n\t\tif (!asConst || expr.elements.length === 0) {\n\t\t\treturn { type: \"array\" };\n\t\t}\n\t\tconst prefixItems: IJsonSchema[] = [];\n\t\tfor (const element of expr.elements) {\n\t\t\t// [...items] or a hole in [1,, 3] (spread or omitted element, not supported)\n\t\t\tif (ts.isSpreadElement(element) || ts.isOmittedExpression(element)) {\n\t\t\t\tDiagnosticReporter.report(\n\t\t\t\t\tcontext,\n\t\t\t\t\telement,\n\t\t\t\t\t\"jsonSchemaBuilder.diagnostic.unsupportedInferredTupleElement\",\n\t\t\t\t\t{ kind: ts.SyntaxKind[element.kind] }\n\t\t\t\t);\n\t\t\t\treturn { type: \"array\" };\n\t\t\t}\n\n\t\t\tprefixItems.push(JsonSchemaBuilder.inferSchemaFromExpression(context, element, true));\n\t\t}\n\t\treturn {\n\t\t\ttype: \"array\",\n\t\t\tprefixItems,\n\t\t\titems: false,\n\t\t\tminItems: prefixItems.length,\n\t\t\tmaxItems: prefixItems.length\n\t\t};\n\t}\n\n\t/**\n\t * Map conditional type nodes (e.g. T extends U ? X : Y) to schema.\n\t * @param context The generation context.\n\t * @param typeNode The conditional type node.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapConditionalTypeToSchema(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.ConditionalTypeNode\n\t): IJsonSchema | undefined {\n\t\tconst trueSchema = JsonSchemaBuilder.mapTypeNodeToSchema(context, typeNode.trueType);\n\t\tconst falseSchema = JsonSchemaBuilder.mapTypeNodeToSchema(context, typeNode.falseType);\n\n\t\tif (!trueSchema && !falseSchema) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (trueSchema && falseSchema) {\n\t\t\tif (JsonHelper.canonicalize(trueSchema) === JsonHelper.canonicalize(falseSchema)) {\n\t\t\t\treturn trueSchema;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tanyOf: [trueSchema, falseSchema]\n\t\t\t};\n\t\t}\n\n\t\treturn trueSchema ?? falseSchema;\n\t}\n\n\t/**\n\t * Map indexed access type nodes (e.g. T[\"id\"]) to schema.\n\t * @param context The generation context.\n\t * @param typeNode The indexed access type node.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapIndexedAccessTypeToSchema(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.IndexedAccessTypeNode\n\t): IJsonSchema | undefined {\n\t\tconst baseSchema =\n\t\t\tJsonSchemaBuilder.resolveUtilityBaseObjectSchema(context, typeNode.objectType) ??\n\t\t\tJsonSchemaBuilder.mapTypeNodeToSchema(context, typeNode.objectType);\n\t\tif (!baseSchema) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst indexKeys = JsonSchemaBuilder.extractIndexedAccessKeys(context, typeNode.indexType);\n\t\tif (indexKeys.length === 0) {\n\t\t\tif (\n\t\t\t\ttypeNode.indexType.kind === ts.SyntaxKind.NumberKeyword &&\n\t\t\t\tbaseSchema.type === \"array\" &&\n\t\t\t\tIs.object(baseSchema.items)\n\t\t\t) {\n\t\t\t\treturn ObjectHelper.clone(baseSchema.items);\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\ttypeNode.indexType.kind === ts.SyntaxKind.NumberKeyword &&\n\t\t\t\tbaseSchema.type === \"array\" &&\n\t\t\t\tIs.array(baseSchema.prefixItems)\n\t\t\t) {\n\t\t\t\tconst uniquePrefixSchemas = baseSchema.prefixItems.filter((schema, index, allSchemas) => {\n\t\t\t\t\tconst schemaKey = JsonHelper.canonicalize(schema);\n\t\t\t\t\treturn allSchemas.findIndex(s => JsonHelper.canonicalize(s) === schemaKey) === index;\n\t\t\t\t});\n\n\t\t\t\tif (uniquePrefixSchemas.length === 1) {\n\t\t\t\t\treturn ObjectHelper.clone(uniquePrefixSchemas[0]);\n\t\t\t\t}\n\n\t\t\t\tif (uniquePrefixSchemas.length > 1) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tanyOf: uniquePrefixSchemas.map(schema => ObjectHelper.clone(schema))\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t(typeNode.indexType.kind === ts.SyntaxKind.StringKeyword ||\n\t\t\t\t\ttypeNode.indexType.kind === ts.SyntaxKind.NumberKeyword) &&\n\t\t\t\tIs.object(baseSchema.additionalProperties)\n\t\t\t) {\n\t\t\t\treturn ObjectHelper.clone(baseSchema.additionalProperties);\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst resolvedPropertySchemas = indexKeys\n\t\t\t.map(indexKey =>\n\t\t\t\tObjectTransformer.resolvePropertySchemaFromObjectSchema(baseSchema, indexKey)\n\t\t\t)\n\t\t\t.filter((schema): schema is IJsonSchema => schema !== undefined);\n\n\t\tif (resolvedPropertySchemas.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst uniqueSchemas = resolvedPropertySchemas.filter((schema, index, allSchemas) => {\n\t\t\tconst schemaKey = JsonHelper.canonicalize(schema);\n\t\t\treturn allSchemas.findIndex(s => JsonHelper.canonicalize(s) === schemaKey) === index;\n\t\t});\n\n\t\tif (uniqueSchemas.length === 1) {\n\t\t\treturn uniqueSchemas[0];\n\t\t}\n\n\t\treturn {\n\t\t\tanyOf: uniqueSchemas\n\t\t};\n\t}\n\n\t/**\n\t * Map template literal type nodes to string schemas.\n\t * @param context The generation context.\n\t * @param typeNode The template literal type node.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapTemplateLiteralTypeToSchema(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TemplateLiteralTypeNode\n\t): IJsonSchema {\n\t\tconst templatePattern = TemplateLiteralPatternBuilder.buildTemplateLiteralPattern(typeNode);\n\t\tif (!templatePattern) {\n\t\t\tDiagnosticReporter.report(\n\t\t\t\tcontext,\n\t\t\t\ttypeNode,\n\t\t\t\t\"jsonSchemaBuilder.diagnostic.unsupportedTemplateLiteralSpan\",\n\t\t\t\t{ type: typeNode.getText() }\n\t\t\t);\n\t\t}\n\n\t\treturn templatePattern\n\t\t\t? {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tpattern: templatePattern\n\t\t\t\t}\n\t\t\t: {\n\t\t\t\t\ttype: \"string\"\n\t\t\t\t};\n\t}\n\n\t/**\n\t * Map mapped type nodes to object schemas.\n\t * @param context The generation context.\n\t * @param typeNode The mapped type node.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapMappedTypeToSchema(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.MappedTypeNode\n\t): IJsonSchema | undefined {\n\t\tconst mappedTypeParameterName = typeNode.typeParameter.name.text;\n\t\tconst mappedKeys = JsonSchemaBuilder.extractMappedTypeKeys(\n\t\t\tcontext,\n\t\t\ttypeNode.typeParameter.constraint\n\t\t);\n\t\tconst sourceObjectSchema = JsonSchemaBuilder.resolveMappedTypeSourceObjectSchema(\n\t\t\tcontext,\n\t\t\ttypeNode\n\t\t);\n\t\tconst mappedEntries = MappedTypeSchemaResolver.resolveMappedTypePropertyEntries(\n\t\t\tcontext,\n\t\t\ttypeNode,\n\t\t\tmappedKeys,\n\t\t\tmappedTypeParameterName\n\t\t);\n\n\t\tif (mappedEntries === undefined) {\n\t\t\tDiagnosticReporter.report(\n\t\t\t\tcontext,\n\t\t\t\ttypeNode,\n\t\t\t\t\"jsonSchemaBuilder.diagnostic.unresolvedMappedTypeRemap\",\n\t\t\t\t{\n\t\t\t\t\ttypeName: typeNode.typeParameter.name.text\n\t\t\t\t}\n\t\t\t);\n\t\t\treturn MappedTypeSchemaResolver.buildMappedTypeFallbackSchema(\n\t\t\t\tcontext,\n\t\t\t\ttypeNode,\n\t\t\t\tmappedKeys,\n\t\t\t\tmappedTypeParameterName,\n\t\t\t\tsourceObjectSchema\n\t\t\t);\n\t\t}\n\n\t\tif (sourceObjectSchema && JsonSchemaBuilder.isHomomorphicMappedType(typeNode)) {\n\t\t\tconst mappedSchema = ObjectTransformer.toInlineUtilityObjectSchema(sourceObjectSchema);\n\t\t\tJsonSchemaBuilder.applyMappedTypeOptionality(mappedSchema, typeNode.questionToken);\n\t\t\treturn mappedSchema;\n\t\t}\n\n\t\tconst properties: { [key: string]: IJsonSchema } = {};\n\t\tfor (const mappedEntry of mappedEntries) {\n\t\t\tconst propertySchema = JsonSchemaBuilder.mapMappedTypePropertySchema(\n\t\t\t\tcontext,\n\t\t\t\ttypeNode,\n\t\t\t\tmappedEntry.sourceKey,\n\t\t\t\tmappedTypeParameterName,\n\t\t\t\tsourceObjectSchema\n\t\t\t);\n\t\t\tif (propertySchema) {\n\t\t\t\tconst existingPropertySchema = properties[mappedEntry.mappedKey];\n\t\t\t\tproperties[mappedEntry.mappedKey] = existingPropertySchema\n\t\t\t\t\t? MappedTypeSchemaResolver.mergeMappedTypePropertySchemas(\n\t\t\t\t\t\t\texistingPropertySchema,\n\t\t\t\t\t\t\tpropertySchema\n\t\t\t\t\t\t)\n\t\t\t\t\t: propertySchema;\n\t\t\t}\n\t\t}\n\n\t\tif (mappedKeys.length > 0 && mappedEntries.length === 0) {\n\t\t\treturn {\n\t\t\t\ttype: \"object\"\n\t\t\t};\n\t\t}\n\n\t\tif (Object.keys(properties).length > 0) {\n\t\t\tlet requiredPropertyKeys = Object.keys(properties);\n\t\t\tif (\n\t\t\t\ttypeNode.questionToken === undefined &&\n\t\t\t\tsourceObjectSchema &&\n\t\t\t\tJsonSchemaBuilder.isMappedTypeIndexedValueByTypeParameter(typeNode, mappedTypeParameterName)\n\t\t\t) {\n\t\t\t\tconst sourceRequiredKeys =\n\t\t\t\t\tMappedTypeSchemaResolver.resolveMappedTypeSourceRequiredPropertyKeys(\n\t\t\t\t\t\tmappedEntries,\n\t\t\t\t\t\tsourceObjectSchema\n\t\t\t\t\t);\n\t\t\t\tif (sourceRequiredKeys) {\n\t\t\t\t\trequiredPropertyKeys = sourceRequiredKeys;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst mappedSchema: IJsonSchema = {\n\t\t\t\ttype: \"object\",\n\t\t\t\tproperties\n\t\t\t};\n\t\t\tJsonSchemaBuilder.applyMappedTypeRequiredKeys(\n\t\t\t\tmappedSchema,\n\t\t\t\trequiredPropertyKeys,\n\t\t\t\ttypeNode.questionToken\n\t\t\t);\n\t\t\treturn mappedSchema;\n\t\t}\n\n\t\tconst additionalProperties = typeNode.type\n\t\t\t? (JsonSchemaBuilder.mapTypeNodeToSchema(context, typeNode.type) ?? {})\n\t\t\t: {};\n\n\t\treturn {\n\t\t\ttype: \"object\",\n\t\t\tadditionalProperties\n\t\t};\n\t}\n\n\t/**\n\t * Determine whether a mapped type value uses indexed access with the mapped key parameter.\n\t * @param typeNode The mapped type node.\n\t * @param mappedTypeParameterName The mapped type parameter name.\n\t * @returns True if the value shape is based on source indexed access.\n\t */\n\tpublic static isMappedTypeIndexedValueByTypeParameter(\n\t\ttypeNode: ts.MappedTypeNode,\n\t\tmappedTypeParameterName: string\n\t): boolean {\n\t\treturn (\n\t\t\ttypeNode.type !== undefined &&\n\t\t\t// T[K] (value type is an indexed access)\n\t\t\tts.isIndexedAccessTypeNode(typeNode.type) &&\n\t\t\tJsonSchemaBuilder.isMappedTypeParameterReference(\n\t\t\t\ttypeNode.type.indexType,\n\t\t\t\tmappedTypeParameterName\n\t\t\t)\n\t\t);\n\t}\n\n\t/**\n\t * Check whether a type node is allowed for schema generation.\n\t * @param context The generation context.\n\t * @param typeNode The type node to inspect.\n\t * @param propertyName The optional property name when the type is a property type.\n\t * @param enclosingObjectName The optional enclosing object name when the type is a property type.\n\t * @returns True when the type is allowed.\n\t */\n\tpublic static checkTypeNodeAllowed(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeNode,\n\t\tpropertyName?: string,\n\t\tenclosingObjectName?: string\n\t): boolean {\n\t\tconst disallowedTypeName = DisallowedTypeGuard.getDisallowedTypeName(typeNode);\n\t\tif (disallowedTypeName) {\n\t\t\tif (Is.stringValue(propertyName) && Is.stringValue(enclosingObjectName)) {\n\t\t\t\tcontext.activeDisallowedType = {\n\t\t\t\t\tdisallowedTypeName,\n\t\t\t\t\tpropertyName,\n\t\t\t\t\tenclosingObjectName\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Determine whether a property type should be treated as a function and skipped.\n\t * @param typeNode The property type node.\n\t * @returns True if the property type is function-like.\n\t */\n\tpublic static isFunctionPropertyType(typeNode: ts.TypeNode): boolean {\n\t\tif (ts.isParenthesizedTypeNode(typeNode)) {\n\t\t\treturn JsonSchemaBuilder.isFunctionPropertyType(typeNode.type);\n\t\t}\n\n\t\tif (ts.isFunctionTypeNode(typeNode) || ts.isConstructorTypeNode(typeNode)) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (ts.isTypeReferenceNode(typeNode)) {\n\t\t\tconst typeName = ts.isIdentifier(typeNode.typeName)\n\t\t\t\t? typeNode.typeName.text\n\t\t\t\t: typeNode.typeName.right.text;\n\t\t\treturn typeName === \"Function\";\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Determine whether a type node represents symbol or unique symbol.\n\t * @param typeNode The type node to inspect.\n\t * @returns True when the type is symbol or unique symbol.\n\t */\n\tpublic static isSymbolTypeNode(typeNode: ts.TypeNode): boolean {\n\t\t// (symbol) (parenthesised type, unwrap and recurse)\n\t\tif (ts.isParenthesizedTypeNode(typeNode)) {\n\t\t\treturn JsonSchemaBuilder.isSymbolTypeNode(typeNode.type);\n\t\t}\n\n\t\tif (typeNode.kind === ts.SyntaxKind.SymbolKeyword) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// unique symbol (unique symbol type operator)\n\t\tif (\n\t\t\tts.isTypeOperatorNode(typeNode) &&\n\t\t\ttypeNode.operator === ts.SyntaxKind.UniqueKeyword &&\n\t\t\ttypeNode.type.kind === ts.SyntaxKind.SymbolKeyword\n\t\t) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Determine whether a computed property expression references a symbol.\n\t * Covers well-known symbols (Symbol.iterator, etc.) and const variables\n\t * declared with a unique symbol type annotation.\n\t * @param context The generation context.\n\t * @param expression The computed property expression.\n\t * @returns True when the key is symbol-based.\n\t */\n\tpublic static isSymbolKeyedComputedExpression(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\texpression: ts.Expression\n\t): boolean {\n\t\tif (\n\t\t\t// Symbol.iterator (property access on the Symbol object)\n\t\t\tts.isPropertyAccessExpression(expression) &&\n\t\t\t// Symbol (the object must be the bare \"Symbol\" identifier)\n\t\t\tts.isIdentifier(expression.expression) &&\n\t\t\texpression.expression.text === \"Symbol\"\n\t\t) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// mySymbol (identifier whose const declaration has a Symbol type)\n\t\tif (ts.isIdentifier(expression)) {\n\t\t\tconst decl = JsonSchemaBuilder.findConstVariableDeclaration(context, expression.text);\n\t\t\tif (decl?.type && JsonSchemaBuilder.isSymbolTypeNode(decl.type)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Extract a property name from TypeScript property syntax.\n\t * Computed names are resolved when they evaluate to concrete literals.\n\t * @param context The generation context.\n\t * @param propertyName The property name node.\n\t * @returns The normalized property name.\n\t */\n\tpublic static extractPropertyName(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tpropertyName: ts.PropertyName\n\t): string | undefined {\n\t\t// myProp or #privateField (identifier or private-identifier property name)\n\t\tif (ts.isIdentifier(propertyName) || ts.isPrivateIdentifier(propertyName)) {\n\t\t\treturn propertyName.text;\n\t\t}\n\n\t\t// \"my-prop\" or 0 (string or numeric literal property name)\n\t\tif (ts.isStringLiteral(propertyName) || ts.isNumericLiteral(propertyName)) {\n\t\t\treturn propertyName.text;\n\t\t}\n\n\t\t// [computedKey] (computed property name)\n\t\tif (ts.isComputedPropertyName(propertyName)) {\n\t\t\tif (JsonSchemaBuilder.isSymbolKeyedComputedExpression(context, propertyName.expression)) {\n\t\t\t\tDiagnosticReporter.report(\n\t\t\t\t\tcontext,\n\t\t\t\t\tpropertyName,\n\t\t\t\t\t\"jsonSchemaBuilder.diagnostic.symbolKeyedMember\",\n\t\t\t\t\t{\n\t\t\t\t\t\tmemberName: propertyName.getText()\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tconst computedPropertyName = JsonSchemaBuilder.resolveComputedPropertyNameExpression(\n\t\t\t\t\tcontext,\n\t\t\t\t\tpropertyName.expression,\n\t\t\t\t\tnew Set<string>()\n\t\t\t\t);\n\t\t\t\tif (Is.stringValue(computedPropertyName)) {\n\t\t\t\t\treturn computedPropertyName;\n\t\t\t\t}\n\n\t\t\t\tDiagnosticReporter.report(\n\t\t\t\t\tcontext,\n\t\t\t\t\tpropertyName,\n\t\t\t\t\t\"jsonSchemaBuilder.diagnostic.unsupportedComputedPropertyName\",\n\t\t\t\t\t{\n\t\t\t\t\t\tpropertyName: propertyName.getText()\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Find a variable declaration by name in a source file.\n\t * @param sourceFile The source file to search.\n\t * @param variableName The variable name.\n\t * @returns The declaration if found.\n\t */\n\tpublic static findVariableDeclaration(\n\t\tsourceFile: ts.SourceFile | undefined,\n\t\tvariableName: string\n\t): ts.VariableDeclaration | undefined {\n\t\tif (!sourceFile) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tfor (const statement of sourceFile.statements) {\n\t\t\t// const foo = ... or let foo = ... (any variable statement)\n\t\t\tif (ts.isVariableStatement(statement)) {\n\t\t\t\tfor (const declaration of statement.declarationList.declarations) {\n\t\t\t\t\t// foo (plain identifier binding matching the requested name)\n\t\t\t\t\tif (ts.isIdentifier(declaration.name) && declaration.name.text === variableName) {\n\t\t\t\t\t\treturn declaration;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Resolve a schema for an imported identifier used in a type query.\n\t * @param context The generation context.\n\t * @param localName The local imported symbol name.\n\t * @returns The mapped schema if resolvable.\n\t */\n\tpublic static resolveImportedTypeQuerySchema(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tlocalName: string\n\t): IJsonSchema | undefined {\n\t\tconst sourceFile = context.activeSourceFile;\n\t\tif (!sourceFile) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tfor (const statement of sourceFile.statements) {\n\t\t\t// import { localName } from \"./module.js\" (relative named import)\n\t\t\tif (ts.isImportDeclaration(statement) && ts.isStringLiteral(statement.moduleSpecifier)) {\n\t\t\t\tif (statement.moduleSpecifier.text.startsWith(\".\")) {\n\t\t\t\t\tconst bindings = statement.importClause?.namedBindings;\n\t\t\t\t\t// { Named, Import } (named import bindings)\n\t\t\t\t\tif (bindings && ts.isNamedImports(bindings)) {\n\t\t\t\t\t\tconst importElement = bindings.elements.find(el => el.name.text === localName);\n\t\t\t\t\t\tif (importElement) {\n\t\t\t\t\t\t\tconst importedName = importElement.propertyName?.text ?? importElement.name.text;\n\t\t\t\t\t\t\tconst resolvedPath = FileUtils.resolveImportSourceFilePath(\n\t\t\t\t\t\t\t\tsourceFile.fileName,\n\t\t\t\t\t\t\t\tstatement.moduleSpecifier.text\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (!resolvedPath) {\n\t\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst importedSource = FileUtils.readFile(resolvedPath);\n\t\t\t\t\t\t\tif (!importedSource) {\n\t\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst importedSourceFile = ts.createSourceFile(\n\t\t\t\t\t\t\t\tresolvedPath,\n\t\t\t\t\t\t\t\timportedSource,\n\t\t\t\t\t\t\t\tts.ScriptTarget.Latest,\n\t\t\t\t\t\t\t\ttrue\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst importedDeclaration = JsonSchemaBuilder.findVariableDeclaration(\n\t\t\t\t\t\t\t\timportedSourceFile,\n\t\t\t\t\t\t\t\timportedName\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (!importedDeclaration) {\n\t\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst importedContext: ITypeScriptToSchemaContext = {\n\t\t\t\t\t\t\t\t...context,\n\t\t\t\t\t\t\t\tactiveSourceFile: importedSourceFile\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tif (importedDeclaration.type) {\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\tJsonSchemaBuilder.mapTypeNodeToSchema(\n\t\t\t\t\t\t\t\t\t\timportedContext,\n\t\t\t\t\t\t\t\t\t\timportedDeclaration.type\n\t\t\t\t\t\t\t\t\t) ?? {}\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (importedDeclaration.initializer) {\n\t\t\t\t\t\t\t\treturn JsonSchemaBuilder.inferSchemaFromExpression(\n\t\t\t\t\t\t\t\t\timportedContext,\n\t\t\t\t\t\t\t\t\timportedDeclaration.initializer\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Resolve computed property name expressions when they can be evaluated to concrete keys.\n\t * @param context The generation context.\n\t * @param expression The computed property expression.\n\t * @param resolvingIdentifiers Identifier names currently being resolved.\n\t * @returns The resolved property key.\n\t */\n\tpublic static resolveComputedPropertyNameExpression(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\texpression: ts.Expression,\n\t\tresolvingIdentifiers: Set<string>\n\t): string | undefined {\n\t\tif (\n\t\t\t// \"key\" or `key` or 42 (literal expressions resolve directly)\n\t\t\tts.isStringLiteral(expression) ||\n\t\t\tts.isNoSubstitutionTemplateLiteral(expression) ||\n\t\t\tts.isNumericLiteral(expression)\n\t\t) {\n\t\t\treturn expression.text;\n\t\t}\n\n\t\t// (\"key\") (parenthesised expression, unwrap and recurse)\n\t\tif (ts.isParenthesizedExpression(expression)) {\n\t\t\treturn JsonSchemaBuilder.resolveComputedPropertyNameExpression(\n\t\t\t\tcontext,\n\t\t\t\texpression.expression,\n\t\t\t\tresolvingIdentifiers\n\t\t\t);\n\t\t}\n\n\t\t// expr as Type or <Type>expr (cast expression, unwrap and recurse)\n\t\tif (ts.isAsExpression(expression) || ts.isTypeAssertionExpression(expression)) {\n\t\t\treturn JsonSchemaBuilder.resolveComputedPropertyNameExpression(\n\t\t\t\tcontext,\n\t\t\t\texpression.expression,\n\t\t\t\tresolvingIdentifiers\n\t\t\t);\n\t\t}\n\n\t\t// expr satisfies Type (satisfies operator, unwrap and recurse)\n\t\tif (ts.isSatisfiesExpression(expression)) {\n\t\t\treturn JsonSchemaBuilder.resolveComputedPropertyNameExpression(\n\t\t\t\tcontext,\n\t\t\t\texpression.expression,\n\t\t\t\tresolvingIdentifiers\n\t\t\t);\n\t\t}\n\n\t\tif (\n\t\t\t// -42 or +42 (prefix unary numeric expression)\n\t\t\tts.isPrefixUnaryExpression(expression) &&\n\t\t\t(expression.operator === ts.SyntaxKind.MinusToken ||\n\t\t\t\texpression.operator === ts.SyntaxKind.PlusToken)\n\t\t) {\n\t\t\tconst operandValue = JsonSchemaBuilder.resolveComputedPropertyNameExpression(\n\t\t\t\tcontext,\n\t\t\t\texpression.operand,\n\t\t\t\tresolvingIdentifiers\n\t\t\t);\n\t\t\tif (Is.stringValue(operandValue) && /^\\d+(?:\\.\\d+)?$/.test(operandValue)) {\n\t\t\t\treturn expression.operator === ts.SyntaxKind.MinusToken ? `-${operandValue}` : operandValue;\n\t\t\t}\n\t\t}\n\n\t\t// `prefix-${expr}` (template expression, resolve spans recursively)\n\t\tif (ts.isTemplateExpression(expression)) {\n\t\t\tlet resolvedKey = expression.head.text;\n\t\t\tfor (const span of expression.templateSpans) {\n\t\t\t\tconst spanValue = JsonSchemaBuilder.resolveComputedPropertyNameExpression(\n\t\t\t\t\tcontext,\n\t\t\t\t\tspan.expression,\n\t\t\t\t\tresolvingIdentifiers\n\t\t\t\t);\n\t\t\t\tif (!Is.stringValue(spanValue)) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t\tresolvedKey += `${spanValue}${span.literal.text}`;\n\t\t\t}\n\n\t\t\treturn resolvedKey;\n\t\t}\n\n\t\t// myConst (identifier, resolve via const variable declaration)\n\t\tif (ts.isIdentifier(expression)) {\n\t\t\tif (resolvingIdentifiers.has(expression.text)) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst constDeclaration = JsonSchemaBuilder.findConstVariableDeclaration(\n\t\t\t\tcontext,\n\t\t\t\texpression.text\n\t\t\t);\n\t\t\tif (constDeclaration?.initializer) {\n\t\t\t\tresolvingIdentifiers.add(expression.text);\n\t\t\t\tconst identifierValue = JsonSchemaBuilder.resolveComputedPropertyNameExpression(\n\t\t\t\t\tcontext,\n\t\t\t\t\tconstDeclaration.initializer,\n\t\t\t\t\tresolvingIdentifiers\n\t\t\t\t);\n\t\t\t\tresolvingIdentifiers.delete(expression.text);\n\t\t\t\treturn identifierValue;\n\t\t\t}\n\t\t}\n\n\t\t// OBJ.property (property access on a known identifier, resolve via const object)\n\t\tif (ts.isPropertyAccessExpression(expression) && ts.isIdentifier(expression.expression)) {\n\t\t\tconst objectName = expression.expression.text;\n\t\t\tconst propertyName = expression.name.text;\n\n\t\t\tconst importedValue = JsonSchemaBuilder.resolveConstObjectProperty(\n\t\t\t\tcontext,\n\t\t\t\tobjectName,\n\t\t\t\tpropertyName\n\t\t\t);\n\t\t\tif (importedValue !== undefined) {\n\t\t\t\treturn `${importedValue}`;\n\t\t\t}\n\n\t\t\tconst localValue = JsonSchemaBuilder.resolveLocalConstObjectProperty(\n\t\t\t\tcontext,\n\t\t\t\tobjectName,\n\t\t\t\tpropertyName\n\t\t\t);\n\t\t\tif (localValue !== undefined) {\n\t\t\t\treturn `${localValue}`;\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Find a local const variable declaration in the active source file.\n\t * @param context The generation context.\n\t * @param variableName The variable name.\n\t * @returns The declaration when found.\n\t */\n\tpublic static findConstVariableDeclaration(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tvariableName: string\n\t): ts.VariableDeclaration | undefined {\n\t\tconst sourceFile = context.activeSourceFile;\n\t\tif (!sourceFile) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tfor (const statement of sourceFile.statements) {\n\t\t\tif (\n\t\t\t\t// const myVar = ... (const variable statement)\n\t\t\t\tts.isVariableStatement(statement) &&\n\t\t\t\tstatement.declarationList.flags === ts.NodeFlags.Const\n\t\t\t) {\n\t\t\t\tfor (const declaration of statement.declarationList.declarations) {\n\t\t\t\t\t// myVar (plain identifier binding matching the requested name)\n\t\t\t\t\tif (ts.isIdentifier(declaration.name) && declaration.name.text === variableName) {\n\t\t\t\t\t\treturn declaration;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Resolve a property value from a local const object declaration.\n\t * @param context The generation context.\n\t * @param objectName The const object name.\n\t * @param propertyName The property to resolve.\n\t * @returns The resolved value when available.\n\t */\n\tpublic static resolveLocalConstObjectProperty(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tobjectName: string,\n\t\tpropertyName: string\n\t): string | number | undefined {\n\t\tconst objectDeclaration = JsonSchemaBuilder.findConstVariableDeclaration(context, objectName);\n\t\tif (!objectDeclaration) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst valueFromInitializer =\n\t\t\tJsonSchemaBuilder.extractConstObjectPropertyFromDeclarationInitializer(\n\t\t\t\tobjectDeclaration,\n\t\t\t\tpropertyName\n\t\t\t);\n\t\tif (valueFromInitializer !== undefined) {\n\t\t\treturn valueFromInitializer;\n\t\t}\n\n\t\tif (objectDeclaration.type) {\n\t\t\treturn JsonSchemaBuilder.extractConstObjectPropertyFromDeclarationType(\n\t\t\t\tobjectDeclaration.type,\n\t\t\t\tpropertyName\n\t\t\t);\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Map a tuple type node to schema.\n\t * @param context The generation context.\n\t * @param tupleTypeNode The tuple type node.\n\t * @returns The mapped tuple schema.\n\t */\n\tpublic static mapTupleTypeToSchema(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttupleTypeNode: ts.TupleTypeNode\n\t): IJsonSchema | undefined {\n\t\tconst fixedSchemas: IJsonSchema[] = [];\n\t\tlet restSchema: IJsonSchema | undefined;\n\t\tlet restIndex = -1;\n\n\t\tfor (const [index, element] of tupleTypeNode.elements.entries()) {\n\t\t\tconst tupleElementType = JsonSchemaBuilder.extractTupleElementType(element);\n\t\t\tif (!tupleElementType) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst mappedSchema = JsonSchemaBuilder.mapTypeNodeToSchema(context, tupleElementType);\n\t\t\tif (!mappedSchema) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\t// ...string[] (rest element in tuple)\n\t\t\tif (ts.isRestTypeNode(element)) {\n\t\t\t\trestSchema = JsonSchemaBuilder.extractRestElementSchema(context, element.type);\n\t\t\t\trestIndex = index;\n\t\t\t\tif (!restSchema) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfixedSchemas.push(mappedSchema);\n\t\t\t}\n\t\t}\n\n\t\tif (!restSchema) {\n\t\t\treturn {\n\t\t\t\ttype: \"array\",\n\t\t\t\tprefixItems: fixedSchemas,\n\t\t\t\titems: false,\n\t\t\t\tminItems: fixedSchemas.length,\n\t\t\t\tmaxItems: fixedSchemas.length\n\t\t\t};\n\t\t}\n\n\t\tconst prefixCount = restIndex > -1 ? restIndex : fixedSchemas.length;\n\t\tconst prefixItems = fixedSchemas.slice(0, prefixCount);\n\t\tconst suffixItems = restIndex > -1 ? fixedSchemas.slice(prefixCount) : [];\n\n\t\tif (suffixItems.length === 0) {\n\t\t\treturn {\n\t\t\t\ttype: \"array\",\n\t\t\t\tprefixItems: prefixItems.length > 0 ? prefixItems : undefined,\n\t\t\t\titems: restSchema,\n\t\t\t\tminItems: prefixItems.length\n\t\t\t};\n\t\t}\n\n\t\tconst anyOfItemSchemas = [restSchema, ...suffixItems];\n\t\tconst uniqueAnyOfSchemas = anyOfItemSchemas.filter((schema, index, allSchemas) => {\n\t\t\tconst schemaKey = JsonHelper.canonicalize(schema);\n\t\t\treturn allSchemas.findIndex(s => JsonHelper.canonicalize(s) === schemaKey) === index;\n\t\t});\n\n\t\tconst effectivePrefixItems = prefixItems;\n\t\tconst restSchemaKey = JsonHelper.canonicalize(restSchema);\n\n\t\tconst uniqueSuffixCandidate = suffixItems.find(\n\t\t\tschema => JsonHelper.canonicalize(schema) !== restSchemaKey\n\t\t);\n\t\tconst exactSingleUniqueSuffixConstraint =\n\t\t\trestIndex === 0 &&\n\t\t\tsuffixItems.length > 1 &&\n\t\t\tuniqueSuffixCandidate &&\n\t\t\tsuffixItems.filter(\n\t\t\t\tschema => JsonHelper.canonicalize(schema) === JsonHelper.canonicalize(uniqueSuffixCandidate)\n\t\t\t).length === 1\n\t\t\t\t? {\n\t\t\t\t\t\tcontains: uniqueSuffixCandidate,\n\t\t\t\t\t\tminContains: 1,\n\t\t\t\t\t\tmaxContains: 1\n\t\t\t\t\t}\n\t\t\t\t: {};\n\n\t\treturn {\n\t\t\ttype: \"array\",\n\t\t\tprefixItems: effectivePrefixItems.length > 0 ? effectivePrefixItems : undefined,\n\t\t\titems:\n\t\t\t\tuniqueAnyOfSchemas.length === 1 ? uniqueAnyOfSchemas[0] : { anyOf: uniqueAnyOfSchemas },\n\t\t\tminItems: effectivePrefixItems.length + suffixItems.length,\n\t\t\t...exactSingleUniqueSuffixConstraint\n\t\t};\n\t}\n\n\t/**\n\t * Extract schema for a tuple rest element.\n\t * @param context The generation context.\n\t * @param restElementType The rest element type.\n\t * @returns The mapped rest element schema.\n\t */\n\tpublic static extractRestElementSchema(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\trestElementType: ts.TypeNode\n\t): IJsonSchema | undefined {\n\t\t// string[] (array form of rest element type, e.g. ...string[])\n\t\tif (ts.isArrayTypeNode(restElementType)) {\n\t\t\treturn JsonSchemaBuilder.mapTypeNodeToSchema(context, restElementType.elementType);\n\t\t}\n\n\t\treturn JsonSchemaBuilder.mapTypeNodeToSchema(context, restElementType);\n\t}\n\n\t/**\n\t * Find an existing schema id by title in known package schemas.\n\t * @param context The generation context.\n\t * @param schemaTitle The schema title to find.\n\t * @returns The existing schema id if found.\n\t */\n\tpublic static findExistingSchemaIdByTitle(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tschemaTitle: string\n\t): string | undefined {\n\t\tfor (const packageSchemaEntries of Object.values(context.schemas)) {\n\t\t\tconst existingSchema = packageSchemaEntries[schemaTitle];\n\t\t\tif (existingSchema?.$id) {\n\t\t\t\treturn existingSchema.$id;\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Apply interface inheritance (`extends`) as `allOf` references.\n\t * @param context The generation context.\n\t * @param schema The schema to expand.\n\t * @param declaration The interface declaration.\n\t */\n\tpublic static applyInterfaceExtendsSchema(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tschema: Partial<IJsonSchema>,\n\t\tdeclaration: ts.InterfaceDeclaration\n\t): void {\n\t\tconst extendsClause = declaration.heritageClauses?.find(\n\t\t\tclause => clause.token === ts.SyntaxKind.ExtendsKeyword\n\t\t);\n\t\tif (!extendsClause) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst allOfRefs: IJsonSchema[] = [];\n\t\tfor (const extendedType of extendsClause.types) {\n\t\t\tconst expression = extendedType.expression;\n\t\t\tlet typeName: string | undefined;\n\t\t\t// interface IFoo extends BaseType (plain identifier in extends clause)\n\t\t\tif (ts.isIdentifier(expression)) {\n\t\t\t\ttypeName = expression.text;\n\t\t\t\t// interface IFoo extends Namespace.BaseType (qualified extends expression)\n\t\t\t} else if (ts.isPropertyAccessExpression(expression)) {\n\t\t\t\ttypeName = expression.name.text;\n\t\t\t}\n\n\t\t\tif (typeName) {\n\t\t\t\t// interface IFoo extends Partial<T> (utility type in extends, identifier guard)\n\t\t\t\t// A heritage clause expression is an Identifier node, not a TypeReferenceNode,\n\t\t\t\t// so it cannot be passed directly to mapTypeNodeToSchema. A synthetic\n\t\t\t\t// TypeReferenceNode is constructed here using the same expression + type\n\t\t\t\t// arguments so the utility handler receives exactly the AST shape it expects.\n\t\t\t\tif (JsonSchemaBuilder._utilityTypeHandlers[typeName] && ts.isIdentifier(expression)) {\n\t\t\t\t\tconst syntheticTypeNode = ts.factory.createTypeReferenceNode(\n\t\t\t\t\t\texpression,\n\t\t\t\t\t\textendedType.typeArguments\n\t\t\t\t\t);\n\t\t\t\t\tconst mappedSchema = JsonSchemaBuilder.mapTypeNodeToSchema(context, syntheticTypeNode);\n\t\t\t\t\tif (mappedSchema) {\n\t\t\t\t\t\tallOfRefs.push(mappedSchema);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst title = StringHelper.stripPrefix(typeName);\n\t\t\t\t\tconst existingSchemaId = JsonSchemaBuilder.findExistingSchemaIdByTitle(context, title);\n\t\t\t\t\tallOfRefs.push({\n\t\t\t\t\t\t$ref: existingSchemaId ?? `${context.namespace}${title}`\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (allOfRefs.length > 0) {\n\t\t\tschema.allOf = allOfRefs;\n\t\t}\n\t}\n\n\t/**\n\t * Map Partial<T> to an object schema with no required properties.\n\t * @param context The generation context.\n\t * @param typeNode The Partial type reference.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapPartialUtilityType(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode\n\t): IJsonSchema | undefined {\n\t\treturn UtilityTypeSchemaMapper.mapPartialUtilityType(context, typeNode, (ctx, baseTypeNode) =>\n\t\t\tJsonSchemaBuilder.resolveUtilityBaseObjectSchema(ctx, baseTypeNode)\n\t\t);\n\t}\n\n\t/**\n\t * Map Required<T> to an object schema with all properties required.\n\t * @param context The generation context.\n\t * @param typeNode The Required type reference.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapRequiredUtilityType(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode\n\t): IJsonSchema | undefined {\n\t\treturn UtilityTypeSchemaMapper.mapRequiredUtilityType(context, typeNode, (ctx, baseTypeNode) =>\n\t\t\tJsonSchemaBuilder.resolveUtilityBaseObjectSchema(ctx, baseTypeNode)\n\t\t);\n\t}\n\n\t/**\n\t * Map Pick<T, K> to an object schema with selected keys preserved.\n\t * @param context The generation context.\n\t * @param typeNode The Pick type reference.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapPickUtilityType(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode\n\t): IJsonSchema | undefined {\n\t\treturn UtilityTypeSchemaMapper.mapPickUtilityType(\n\t\t\tcontext,\n\t\t\ttypeNode,\n\t\t\t(ctx, baseTypeNode) => JsonSchemaBuilder.resolveUtilityBaseObjectSchema(ctx, baseTypeNode),\n\t\t\t(ctx, keysNode) => JsonSchemaBuilder.extractUtilityTypeKeys(ctx, keysNode)\n\t\t);\n\t}\n\n\t/**\n\t * Map Omit<T, K> to an object schema with selected keys removed.\n\t * @param context The generation context.\n\t * @param typeNode The Omit type reference.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapOmitUtilityType(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode\n\t): IJsonSchema | undefined {\n\t\treturn UtilityTypeSchemaMapper.mapOmitUtilityType(\n\t\t\tcontext,\n\t\t\ttypeNode,\n\t\t\t(ctx, baseTypeNode) => JsonSchemaBuilder.resolveUtilityBaseObjectSchema(ctx, baseTypeNode),\n\t\t\t(ctx, keysNode) => JsonSchemaBuilder.extractUtilityTypeKeys(ctx, keysNode)\n\t\t);\n\t}\n\n\t/**\n\t * Map Exclude<T, U> to a schema that removes U members from T.\n\t * @param context The generation context.\n\t * @param typeNode The Exclude type reference.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapExcludeUtilityType(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode\n\t): IJsonSchema | undefined {\n\t\treturn UtilityTypeSchemaMapper.mapExcludeUtilityType(context, typeNode, (ctx, node) =>\n\t\t\tJsonSchemaBuilder.mapTypeNodeToSchema(ctx, node)\n\t\t);\n\t}\n\n\t/**\n\t * Map Extract<T, U> to a schema that keeps U members from T.\n\t * @param context The generation context.\n\t * @param typeNode The Extract type reference.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapExtractUtilityType(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode\n\t): IJsonSchema | undefined {\n\t\treturn UtilityTypeSchemaMapper.mapExtractUtilityType(context, typeNode, (ctx, node) =>\n\t\t\tJsonSchemaBuilder.mapTypeNodeToSchema(ctx, node)\n\t\t);\n\t}\n\n\t/**\n\t * Map NonNullable<T> by removing null and undefined branches from T.\n\t * @param context The generation context.\n\t * @param typeNode The NonNullable type reference.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapNonNullableUtilityType(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode\n\t): IJsonSchema | undefined {\n\t\treturn UtilityTypeSchemaMapper.mapNonNullableUtilityType(context, typeNode, (ctx, node) =>\n\t\t\tJsonSchemaBuilder.mapTypeNodeToSchema(ctx, node)\n\t\t);\n\t}\n\n\t/**\n\t * Map Record<K, V> to an object schema with key constraints where possible.\n\t * @param context The generation context.\n\t * @param typeNode The Record type reference.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapRecordUtilityType(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode\n\t): IJsonSchema | undefined {\n\t\treturn UtilityTypeSchemaMapper.mapRecordUtilityType(context, typeNode, (ctx, node) =>\n\t\t\tJsonSchemaBuilder.mapTypeNodeToSchema(ctx, node)\n\t\t);\n\t}\n\n\t/**\n\t * Determine whether a type node represents null or undefined.\n\t * @param typeNode The type node.\n\t * @returns True if the node is null or undefined.\n\t */\n\tpublic static isNullOrUndefinedTypeNode(typeNode: ts.TypeNode): boolean {\n\t\tif (\n\t\t\t// null or undefined (keyword type nodes)\n\t\t\ttypeNode.kind === ts.SyntaxKind.NullKeyword ||\n\t\t\ttypeNode.kind === ts.SyntaxKind.UndefinedKeyword\n\t\t) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// null (literal type wrapping the null keyword, e.g. from union members)\n\t\tif (ts.isLiteralTypeNode(typeNode)) {\n\t\t\treturn typeNode.literal.kind === ts.SyntaxKind.NullKeyword;\n\t\t}\n\n\t\t// undefined (type reference whose name is the identifier \"undefined\")\n\t\tif (ts.isTypeReferenceNode(typeNode) && ts.isIdentifier(typeNode.typeName)) {\n\t\t\treturn typeNode.typeName.text === \"undefined\";\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Extract literal keys from a Record key type argument.\n\t * @param keyTypeNode The key type argument node.\n\t * @returns The extracted literal keys.\n\t */\n\tpublic static extractRecordLiteralKeys(keyTypeNode: ts.TypeNode): string[] {\n\t\t// \"key\" (single string literal key type, e.g. Record<\"key\", V>)\n\t\tif (ts.isLiteralTypeNode(keyTypeNode) && ts.isStringLiteral(keyTypeNode.literal)) {\n\t\t\treturn [keyTypeNode.literal.text];\n\t\t}\n\n\t\t// \"a\" | \"b\" | \"c\" (union of string literal key types)\n\t\tif (ts.isUnionTypeNode(keyTypeNode)) {\n\t\t\tconst keys = keyTypeNode.types\n\t\t\t\t// \"key\" (each member must be a string literal type)\n\t\t\t\t.filter(type => ts.isLiteralTypeNode(type) && ts.isStringLiteral(type.literal))\n\t\t\t\t.map(type => (type as ts.LiteralTypeNode).literal as ts.StringLiteral)\n\t\t\t\t.map(literal => literal.text);\n\t\t\treturn keys.length === keyTypeNode.types.length ? keys : [];\n\t\t}\n\n\t\treturn [];\n\t}\n\n\t/**\n\t * Map JsonLdObject utility types using key-removal and optional key-addition rules.\n\t * @param context The generation context.\n\t * @param typeNode The JsonLdObject utility type reference.\n\t * @param options Mapping options.\n\t * @param options.keysToRemove Keys to remove from the base schema.\n\t * @param options.keyToAdd Optional key to add to the base schema.\n\t * @param options.isAddedKeyRequired Whether the added key should be required.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapJsonLdObjectUtilityType(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode,\n\t\toptions: {\n\t\t\tkeysToRemove: string[];\n\t\t\tkeyToAdd?: \"id\" | \"@id\" | \"type\" | \"@type\" | \"@context\";\n\t\t\tisAddedKeyRequired?: boolean;\n\t\t}\n\t): IJsonSchema | undefined {\n\t\treturn UtilityTypeSchemaMapper.mapJsonLdObjectUtilityType(\n\t\t\tcontext,\n\t\t\ttypeNode,\n\t\t\toptions,\n\t\t\t(ctx, baseTypeNode) => JsonSchemaBuilder.resolveUtilityBaseObjectSchema(ctx, baseTypeNode),\n\t\t\t(ctx, node) => JsonSchemaBuilder.mapTypeNodeToSchema(ctx, node)\n\t\t);\n\t}\n\n\t/**\n\t * Resolve a default schema for JsonLdObject utility key additions when the type argument is omitted.\n\t * @param baseSchema The base object schema.\n\t * @param keyToAdd The key being added by the utility.\n\t * @returns The resolved schema.\n\t */\n\tpublic static mapJsonLdObjectDefaultSchemaByKey(\n\t\tbaseSchema: IJsonSchema,\n\t\tkeyToAdd: \"id\" | \"@id\" | \"type\" | \"@type\" | \"@context\"\n\t): IJsonSchema {\n\t\tif (keyToAdd === \"id\" || keyToAdd === \"@id\") {\n\t\t\treturn JsonSchemaBuilder.mapJsonLdObjectWithIdDefaultIdSchema(baseSchema);\n\t\t}\n\n\t\tif (keyToAdd === \"@context\") {\n\t\t\treturn JsonSchemaBuilder.mapJsonLdObjectWithContextDefaultContextSchema(baseSchema);\n\t\t}\n\n\t\treturn JsonSchemaBuilder.mapJsonLdObjectWithTypeDefaultTypeSchema(baseSchema);\n\t}\n\n\t/**\n\t * Resolve default id schema for JsonLdObjectWithId when Id type argument is omitted.\n\t * @param baseSchema The base object schema.\n\t * @returns The resolved id schema.\n\t */\n\tpublic static mapJsonLdObjectWithIdDefaultIdSchema(baseSchema: IJsonSchema): IJsonSchema {\n\t\treturn JsonSchemaBuilder.mapJsonLdObjectDefaultEitherSchema(baseSchema, \"id\", \"@id\", {\n\t\t\ttype: \"string\"\n\t\t});\n\t}\n\n\t/**\n\t * Resolve default type schema for JsonLdObjectWithType when Type argument is omitted.\n\t * @param baseSchema The base object schema.\n\t * @returns The resolved type schema.\n\t */\n\tpublic static mapJsonLdObjectWithTypeDefaultTypeSchema(baseSchema: IJsonSchema): IJsonSchema {\n\t\treturn JsonSchemaBuilder.mapJsonLdObjectDefaultEitherSchema(baseSchema, \"type\", \"@type\", {\n\t\t\tanyOf: [{ type: \"string\" }, { type: \"array\", items: { type: \"string\" } }]\n\t\t});\n\t}\n\n\t/**\n\t * Resolve default context schema for JsonLdObjectWithContext when Context argument is omitted.\n\t * @param baseSchema The base object schema.\n\t * @returns The resolved context schema.\n\t */\n\tpublic static mapJsonLdObjectWithContextDefaultContextSchema(\n\t\tbaseSchema: IJsonSchema\n\t): IJsonSchema {\n\t\treturn JsonSchemaBuilder.mapJsonLdObjectDefaultEitherSchema(\n\t\t\tbaseSchema,\n\t\t\t\"@context\",\n\t\t\t\"@context\",\n\t\t\t{\n\t\t\t\ttype: \"array\",\n\t\t\t\titems: { type: \"string\" }\n\t\t\t}\n\t\t);\n\t}\n\n\t/**\n\t * Resolve default schema from either of two source keys, with fallback when both are absent.\n\t * @param baseSchema The base object schema.\n\t * @param firstKey The primary key to resolve.\n\t * @param secondKey The secondary key to resolve.\n\t * @param fallbackSchema The fallback schema.\n\t * @returns The resolved schema.\n\t */\n\tpublic static mapJsonLdObjectDefaultEitherSchema(\n\t\tbaseSchema: IJsonSchema,\n\t\tfirstKey: string,\n\t\tsecondKey: string,\n\t\tfallbackSchema: IJsonSchema\n\t): IJsonSchema {\n\t\tconst firstSchema = ObjectTransformer.resolvePropertySchemaFromObjectSchema(\n\t\t\tbaseSchema,\n\t\t\tfirstKey\n\t\t);\n\t\tconst secondSchema = ObjectTransformer.resolvePropertySchemaFromObjectSchema(\n\t\t\tbaseSchema,\n\t\t\tsecondKey\n\t\t);\n\n\t\tif (firstSchema && secondSchema) {\n\t\t\tif (JsonHelper.canonicalize(firstSchema) === JsonHelper.canonicalize(secondSchema)) {\n\t\t\t\treturn firstSchema;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tanyOf: [firstSchema, secondSchema]\n\t\t\t};\n\t\t}\n\n\t\tif (firstSchema) {\n\t\t\treturn firstSchema;\n\t\t}\n\n\t\tif (secondSchema) {\n\t\t\treturn secondSchema;\n\t\t}\n\n\t\treturn fallbackSchema;\n\t}\n\n\t/**\n\t * Map ObjectOrArray<T> to a schema accepting T or T[].\n\t * @param context The generation context.\n\t * @param typeNode The ObjectOrArray type reference.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapObjectOrArrayUtilityType(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode\n\t): IJsonSchema | undefined {\n\t\treturn UtilityTypeSchemaMapper.mapObjectOrArrayUtilityType(context, typeNode, (ctx, node) =>\n\t\t\tJsonSchemaBuilder.mapTypeNodeToSchema(ctx, node)\n\t\t);\n\t}\n\n\t/**\n\t * Map SingleOccurrenceArray<T, U> to a non-empty array containing exactly one U.\n\t * @param context The generation context.\n\t * @param typeNode The SingleOccurrenceArray type reference.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapSingleOccurrenceArrayUtilityType(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode\n\t): IJsonSchema | undefined {\n\t\treturn UtilityTypeSchemaMapper.mapSingleOccurrenceArrayUtilityType(\n\t\t\tcontext,\n\t\t\ttypeNode,\n\t\t\t(ctx, node) => JsonSchemaBuilder.mapTypeNodeToSchema(ctx, node)\n\t\t);\n\t}\n\n\t/**\n\t * Add a comment to schemas inlined for utility type transformations.\n\t * @param schema The schema to annotate.\n\t * @param baseTypeDescription The utility base type description.\n\t * @returns The annotated schema.\n\t */\n\tpublic static annotateUtilityInlineSchema(\n\t\tschema: IJsonSchema,\n\t\tbaseTypeDescription: string\n\t): IJsonSchema {\n\t\tconst annotatedSchema = ObjectHelper.clone(schema);\n\t\tannotatedSchema.$comment ??= `Inlined utility base type ${baseTypeDescription} so utility transformations can operate on concrete properties instead of a $ref.`;\n\t\treturn annotatedSchema;\n\t}\n\n\t/**\n\t * Resolve a utility base type node to an object schema.\n\t * @param context The generation context.\n\t * @param baseTypeNode The utility base type node.\n\t * @returns The resolved object schema.\n\t * @throws GeneralError when a named type reference cannot be resolved to a schema.\n\t */\n\tpublic static resolveUtilityBaseObjectSchema(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tbaseTypeNode: ts.TypeNode\n\t): IJsonSchema | undefined {\n\t\t// Guard against recursive utility type resolution cycles\n\t\t// This prevents infinite loops when processing complex types with indexed access and keyof\n\t\tcontext.resolvingUtilityTypes ??= new Set<string>();\n\n\t\t// { prop: string } (inline type literal as the base of the utility type)\n\t\tif (ts.isTypeLiteralNode(baseTypeNode)) {\n\t\t\treturn JsonSchemaBuilder.buildTypeLiteralSchema(context, baseTypeNode);\n\t\t}\n\n\t\t// BaseType (named type reference as the base of the utility type)\n\t\tif (ts.isTypeReferenceNode(baseTypeNode)) {\n\t\t\t// BaseType (plain identifier) vs Namespace.BaseType (qualified name)\n\t\t\tconst typeName = ts.isIdentifier(baseTypeNode.typeName)\n\t\t\t\t? baseTypeNode.typeName.text\n\t\t\t\t: baseTypeNode.typeName.right.text;\n\t\t\tconst baseTypeDescription = StringHelper.stripPrefix(typeName);\n\n\t\t\t// Prevent recursive processing of the same utility base type\n\t\t\tif (context.resolvingUtilityTypes.has(typeName)) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst utilityHandler = JsonSchemaBuilder._utilityTypeHandlers[typeName];\n\t\t\tif (utilityHandler) {\n\t\t\t\tcontext.resolvingUtilityTypes.add(typeName);\n\t\t\t\ttry {\n\t\t\t\t\tconst utilitySchema = utilityHandler(context, baseTypeNode);\n\t\t\t\t\tconst resolvedUtilitySchema = utilitySchema\n\t\t\t\t\t\t? JsonSchemaBuilder.resolveMappedUtilityBaseObjectSchema(context, utilitySchema)\n\t\t\t\t\t\t: undefined;\n\t\t\t\t\tif (resolvedUtilitySchema) {\n\t\t\t\t\t\treturn JsonSchemaBuilder.annotateUtilityInlineSchema(\n\t\t\t\t\t\t\tresolvedUtilitySchema,\n\t\t\t\t\t\t\tbaseTypeDescription\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} finally {\n\t\t\t\t\tcontext.resolvingUtilityTypes.delete(typeName);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst typeParameterBinding = JsonSchemaBuilder.getTypeParameterBinding(context, typeName);\n\t\t\tif (typeParameterBinding !== undefined) {\n\t\t\t\treturn typeParameterBinding\n\t\t\t\t\t? JsonSchemaBuilder.resolveUtilityBaseObjectSchema(context, typeParameterBinding)\n\t\t\t\t\t: undefined;\n\t\t\t}\n\t\t\tconst directSchema = JsonSchemaBuilder.resolveObjectTypeSchemaForUtility(context, typeName);\n\n\t\t\tif (directSchema) {\n\t\t\t\tconst expandedSchema = JsonSchemaBuilder.expandAllOfReferences(\n\t\t\t\t\tcontext,\n\t\t\t\t\tdirectSchema,\n\t\t\t\t\tStringHelper.stripPrefix(typeName)\n\t\t\t\t);\n\t\t\t\treturn JsonSchemaBuilder.annotateUtilityInlineSchema(expandedSchema, baseTypeDescription);\n\t\t\t}\n\t\t}\n\n\t\tconst mappedSchema = JsonSchemaBuilder.mapTypeNodeToSchema(context, baseTypeNode);\n\t\tif (mappedSchema) {\n\t\t\t// If we got a $ref, try to resolve it to an actual object schema\n\t\t\tif (mappedSchema.$ref) {\n\t\t\t\tconst resolvedSchema = JsonSchemaBuilder.resolveMappedUtilityBaseObjectSchema(\n\t\t\t\t\tcontext,\n\t\t\t\t\tmappedSchema\n\t\t\t\t);\n\t\t\t\tif (resolvedSchema) {\n\t\t\t\t\treturn JsonSchemaBuilder.annotateUtilityInlineSchema(\n\t\t\t\t\t\tresolvedSchema,\n\t\t\t\t\t\tbaseTypeNode.getText()\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t// $ref exists but can't be expanded to an inline object schema (e.g. the type\n\t\t\t\t// maps to an external schema URL). Return undefined so the utility type handler\n\t\t\t\t// degrades gracefully rather than throwing; the type is known, just not inlineable.\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\t// If we got a direct schema (non-$ref), try to resolve it as an object\n\t\t\tconst resolvedSchema = JsonSchemaBuilder.resolveMappedUtilityBaseObjectSchema(\n\t\t\t\tcontext,\n\t\t\t\tmappedSchema\n\t\t\t);\n\t\t\tif (resolvedSchema) {\n\t\t\t\treturn JsonSchemaBuilder.annotateUtilityInlineSchema(\n\t\t\t\t\tresolvedSchema,\n\t\t\t\t\tbaseTypeNode.getText()\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// mapTypeNodeToSchema produced nothing at all - the type is genuinely unknown.\n\t\t// For named type references that are not part of a recursive resolution cycle, throw.\n\t\tif (ts.isTypeReferenceNode(baseTypeNode)) {\n\t\t\tconst typeName = ts.isIdentifier(baseTypeNode.typeName)\n\t\t\t\t? baseTypeNode.typeName.text\n\t\t\t\t: baseTypeNode.typeName.right.text;\n\t\t\tif (!context.resolvingUtilityTypes?.has(typeName)) {\n\t\t\t\tconst importedTypeReference = JsonSchemaBuilder.findImportedTypeReference(\n\t\t\t\t\tcontext,\n\t\t\t\t\ttypeName\n\t\t\t\t);\n\t\t\t\tconst importSource = importedTypeReference?.moduleSpecifier ?? \"\";\n\t\t\t\tthrow new GeneralError(JsonSchemaBuilder.CLASS_NAME, \"missingTypeReferenceSchema\", {\n\t\t\t\t\ttypeName,\n\t\t\t\t\timportSource: importSource ? ` from module \"${importSource}\"` : \"\"\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Resolve a mapped utility schema to an object schema when possible.\n\t * @param context The generation context.\n\t * @param mappedSchema The mapped schema.\n\t * @returns The resolved object schema.\n\t */\n\tpublic static resolveMappedUtilityBaseObjectSchema(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tmappedSchema: IJsonSchema\n\t): IJsonSchema | undefined {\n\t\tif (mappedSchema.type === \"object\" && mappedSchema.properties) {\n\t\t\treturn ObjectHelper.clone(mappedSchema);\n\t\t}\n\n\t\tif (mappedSchema.$ref) {\n\t\t\tfor (const packageSchemaEntries of Object.values(context.schemas)) {\n\t\t\t\tfor (const referencedSchema of Object.values(packageSchemaEntries)) {\n\t\t\t\t\tif (\n\t\t\t\t\t\treferencedSchema.$id === mappedSchema.$ref &&\n\t\t\t\t\t\treferencedSchema.type === \"object\" &&\n\t\t\t\t\t\treferencedSchema.properties\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn JsonSchemaBuilder.expandAllOfReferences(\n\t\t\t\t\t\t\tcontext,\n\t\t\t\t\t\t\tObjectHelper.clone(referencedSchema),\n\t\t\t\t\t\t\treferencedSchema.title\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Fall back to resolving by ref title in case a schema was registered\n\t\t\t// without a matching $id, or the ref has been normalised differently.\n\t\t\tconst refTitle = mappedSchema.$ref.split(\"/\").pop();\n\t\t\tif (refTitle) {\n\t\t\t\tconst localRefSchema = context.schemas[context.packageName]?.[refTitle];\n\t\t\t\tif (localRefSchema?.type === \"object\" && localRefSchema.properties) {\n\t\t\t\t\treturn JsonSchemaBuilder.expandAllOfReferences(\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t\tObjectHelper.clone(localRefSchema),\n\t\t\t\t\t\tlocalRefSchema.title ?? refTitle\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tfor (const packageSchemaEntries of Object.values(context.schemas)) {\n\t\t\t\t\tconst refSchema = packageSchemaEntries[refTitle];\n\t\t\t\t\tif (refSchema?.type === \"object\" && refSchema.properties) {\n\t\t\t\t\t\treturn JsonSchemaBuilder.expandAllOfReferences(\n\t\t\t\t\t\t\tcontext,\n\t\t\t\t\t\t\tObjectHelper.clone(refSchema),\n\t\t\t\t\t\t\trefSchema.title ?? refTitle\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Expand allOf references in a schema by inlining referenced schemas.\n\t * This handles inheritance cases where a type extends another type.\n\t * When applying utility operations (Omit, Pick) to types with allOf inheritance,\n\t * the referenced schemas must be expanded so properties are available for omit/pick.\n\t * @param context The generation context.\n\t * @param schema The schema potentially containing allOf with references.\n\t * @param currentSchemaTitle The title of the current schema being processed, used for $comment annotations.\n\t * @returns The schema with expanded references merged into properties.\n\t */\n\tpublic static expandAllOfReferences(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tschema: IJsonSchema,\n\t\tcurrentSchemaTitle?: string\n\t): IJsonSchema {\n\t\tif (!Is.array(schema.allOf) || schema.allOf.length === 0) {\n\t\t\treturn schema;\n\t\t}\n\n\t\tconst expandedSchema = ObjectHelper.clone(schema);\n\t\tconst mergedProperties: { [key: string]: IJsonSchema } = {};\n\t\tconst inheritedPropertySources: { [key: string]: string } = {};\n\t\tconst mergedRequired = new Set<string>();\n\t\tconst allOf = Is.array(expandedSchema.allOf) ? expandedSchema.allOf : [];\n\n\t\t// Expand all allOf branches\n\t\tfor (const branch of allOf) {\n\t\t\tif (Is.object(branch)) {\n\t\t\t\tconst branchRecord = branch as { [key: string]: unknown };\n\t\t\t\tlet branchSourceTitle: string | undefined;\n\t\t\t\tlet referencedSchema: IJsonSchema | undefined;\n\n\t\t\t\t// If the branch is a reference, resolve it\n\t\t\t\tif (Is.stringValue(branchRecord.$ref) && !branchRecord.properties) {\n\t\t\t\t\tconst refTitle = branchRecord.$ref.split(\"/\").pop();\n\t\t\t\t\tif (refTitle) {\n\t\t\t\t\t\t// Look up the referenced schema in the context\n\t\t\t\t\t\treferencedSchema =\n\t\t\t\t\t\t\tcontext.schemas[context.packageName]?.[refTitle] ??\n\t\t\t\t\t\t\tObject.values(context.schemas)\n\t\t\t\t\t\t\t\t.flatMap(entries => Object.values(entries))\n\t\t\t\t\t\t\t\t.find(s => s.$id === branchRecord.$ref || s.title === refTitle);\n\n\t\t\t\t\t\treferencedSchema ??= JsonSchemaBuilder.tryLoadExternalSchemaByTitle(context, refTitle);\n\n\t\t\t\t\t\tif (referencedSchema) {\n\t\t\t\t\t\t\tbranchSourceTitle = referencedSchema.title ?? refTitle;\n\t\t\t\t\t\t\treferencedSchema = JsonSchemaBuilder.expandAllOfReferences(\n\t\t\t\t\t\t\t\tcontext,\n\t\t\t\t\t\t\t\treferencedSchema,\n\t\t\t\t\t\t\t\tbranchSourceTitle\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t// Merge properties from the referenced schema\n\t\t\t\t\t\t\tif (Is.object(referencedSchema.properties)) {\n\t\t\t\t\t\t\t\tfor (const [propertyKey, propertySchema] of Object.entries(\n\t\t\t\t\t\t\t\t\treferencedSchema.properties\n\t\t\t\t\t\t\t\t)) {\n\t\t\t\t\t\t\t\t\tmergedProperties[propertyKey] = ObjectHelper.clone(propertySchema);\n\t\t\t\t\t\t\t\t\tif (branchSourceTitle) {\n\t\t\t\t\t\t\t\t\t\tinheritedPropertySources[propertyKey] = branchSourceTitle;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Collect required fields from the referenced schema\n\t\t\t\t\t\t\tif (Is.array(referencedSchema.required)) {\n\t\t\t\t\t\t\t\tfor (const field of referencedSchema.required) {\n\t\t\t\t\t\t\t\t\tif (Is.stringValue(field)) {\n\t\t\t\t\t\t\t\t\t\tmergedRequired.add(field);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Merge properties from direct schema in allOf\n\t\t\t\t\tif (Is.object(branchRecord.properties)) {\n\t\t\t\t\t\tfor (const [propertyKey, propertySchema] of Object.entries(branchRecord.properties)) {\n\t\t\t\t\t\t\tif (Is.object(propertySchema)) {\n\t\t\t\t\t\t\t\tmergedProperties[propertyKey] = ObjectHelper.clone(propertySchema as IJsonSchema);\n\t\t\t\t\t\t\t\tif (branchSourceTitle) {\n\t\t\t\t\t\t\t\t\tinheritedPropertySources[propertyKey] = branchSourceTitle;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// Merge required fields\n\t\t\t\t\tif (Is.array(branchRecord.required)) {\n\t\t\t\t\t\tfor (const field of branchRecord.required) {\n\t\t\t\t\t\t\tif (Is.stringValue(field)) {\n\t\t\t\t\t\t\t\tmergedRequired.add(field);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// If we expanded any references, merge them into the schema\n\t\tif (Object.keys(mergedProperties).length > 0 || mergedRequired.size > 0) {\n\t\t\tif (Object.keys(mergedProperties).length > 0) {\n\t\t\t\t// Step 1: stamp $comment on base (merged) properties that arrived via $ref expansion.\n\t\t\t\t// The guard `!propertySchema.$comment` ensures that a comment set by a deeper\n\t\t\t\t// ancestor during a recursive call is never overwritten by a shallower ancestor.\n\t\t\t\tfor (const [propertyKey, propertySchema] of Object.entries(mergedProperties)) {\n\t\t\t\t\tconst inheritedSource = inheritedPropertySources[propertyKey];\n\t\t\t\t\tif (inheritedSource && !propertySchema.$comment) {\n\t\t\t\t\t\tpropertySchema.$comment = `Inherited from ${inheritedSource}`;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Step 2: stamp $comment on the derived type's own properties so that consumers\n\t\t\t\t// of the expanded schema know which type introduced each property. The `??=`\n\t\t\t\t// guard preserves any $comment already written by a deeper recursive call.\n\t\t\t\tif (currentSchemaTitle && Is.object(expandedSchema.properties)) {\n\t\t\t\t\tfor (const [propertyKey, propertySchema] of Object.entries(expandedSchema.properties)) {\n\t\t\t\t\t\tif (Is.object(propertySchema)) {\n\t\t\t\t\t\t\tconst typedPropertySchema = propertySchema;\n\t\t\t\t\t\t\ttypedPropertySchema.$comment ??= `Inherited from ${currentSchemaTitle}`;\n\t\t\t\t\t\t\tinheritedPropertySources[propertyKey] = currentSchemaTitle;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Step 3: merge — base properties first, derived properties on top so that a\n\t\t\t\t// derived type can override a base property (key order: base insertion order,\n\t\t\t\t// values from the derived spread win for overlapping keys).\n\t\t\t\texpandedSchema.properties = {\n\t\t\t\t\t...mergedProperties,\n\t\t\t\t\t...(expandedSchema.properties ?? {})\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (mergedRequired.size > 0 || Is.array(expandedSchema.required)) {\n\t\t\t\t// Build required array in property order: first merged, then existing\n\t\t\t\tconst resultRequired: string[] = [];\n\t\t\t\tconst mergedRequiredSet = new Set(mergedRequired);\n\t\t\t\tconst existingRequired = Is.array(expandedSchema.required) ? expandedSchema.required : [];\n\n\t\t\t\t// Add merged required fields in property order\n\t\t\t\tfor (const key of Object.keys(expandedSchema.properties ?? {})) {\n\t\t\t\t\tif (mergedRequiredSet.has(key)) {\n\t\t\t\t\t\tresultRequired.push(key);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Add existing required fields that aren't in merged\n\t\t\t\tfor (const key of existingRequired) {\n\t\t\t\t\tif (Is.stringValue(key) && !mergedRequiredSet.has(key)) {\n\t\t\t\t\t\tresultRequired.push(key);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (resultRequired.length > 0) {\n\t\t\t\t\texpandedSchema.required = resultRequired;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Remove allOf since we've expanded everything\n\t\t\tdelete expandedSchema.allOf;\n\t\t}\n\n\t\treturn expandedSchema;\n\t}\n\n\t/**\n\t * Attempt to load an external schema by title from imported module declarations.\n\t * @param context The generation context.\n\t * @param schemaTitle The schema title.\n\t * @returns The loaded schema.\n\t */\n\tpublic static tryLoadExternalSchemaByTitle(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tschemaTitle: string\n\t): IJsonSchema | undefined {\n\t\tconst existingSchema = Object.values(context.schemas)\n\t\t\t.flatMap(entries => Object.values(entries))\n\t\t\t.find(schema => schema.title === schemaTitle || schema.$id?.endsWith(`/${schemaTitle}`));\n\t\tif (existingSchema) {\n\t\t\treturn ObjectHelper.clone(existingSchema);\n\t\t}\n\n\t\tconst sourceFile = context.activeSourceFile;\n\t\tif (!sourceFile) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst moduleSpecifiers = [\n\t\t\t...new Set(\n\t\t\t\tsourceFile.statements\n\t\t\t\t\t.filter((statement): statement is ts.ImportDeclaration =>\n\t\t\t\t\t\tts.isImportDeclaration(statement)\n\t\t\t\t\t)\n\t\t\t\t\t.flatMap(statement => {\n\t\t\t\t\t\tif (!ts.isStringLiteral(statement.moduleSpecifier)) {\n\t\t\t\t\t\t\treturn [];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst moduleSpecifier = statement.moduleSpecifier.text;\n\t\t\t\t\t\treturn moduleSpecifier.startsWith(\".\") ? [] : [moduleSpecifier];\n\t\t\t\t\t})\n\t\t\t)\n\t\t];\n\n\t\tconst candidateTypeNames = [`I${schemaTitle}`, schemaTitle];\n\n\t\tfor (const moduleSpecifier of moduleSpecifiers) {\n\t\t\tfor (const candidateTypeName of candidateTypeNames) {\n\t\t\t\tconst declarationResult = Resolver.resolveTypeDeclarationAst(\n\t\t\t\t\tmoduleSpecifier,\n\t\t\t\t\tcandidateTypeName\n\t\t\t\t);\n\t\t\t\tif (declarationResult) {\n\t\t\t\t\tconst mappedReference = JsonSchemaBuilder.resolveReferenceMappingTarget(\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t\tmoduleSpecifier,\n\t\t\t\t\t\tcandidateTypeName\n\t\t\t\t\t);\n\n\t\t\t\t\tconst externalContext: ITypeScriptToSchemaContext = {\n\t\t\t\t\t\tnamespace: mappedReference?.namespace ?? context.namespace,\n\t\t\t\t\t\tpackageName: moduleSpecifier,\n\t\t\t\t\t\tschemas: context.schemas,\n\t\t\t\t\t\tactiveSourceFile: context.activeSourceFile,\n\t\t\t\t\t\toptions: context.options\n\t\t\t\t\t};\n\n\t\t\t\t\tJsonSchemaBuilder.parseAllObjectSchemas(\n\t\t\t\t\t\texternalContext,\n\t\t\t\t\t\tdeclarationResult.sourceFile.fileName,\n\t\t\t\t\t\tdeclarationResult.sourceFile.getFullText(),\n\t\t\t\t\t\t[]\n\t\t\t\t\t);\n\n\t\t\t\t\tconst loadedSchema =\n\t\t\t\t\t\tcontext.schemas[moduleSpecifier]?.[schemaTitle] ??\n\t\t\t\t\t\tObject.values(context.schemas[moduleSpecifier] ?? {}).find(\n\t\t\t\t\t\t\tschema => schema.title === schemaTitle || schema.$id?.endsWith(`/${schemaTitle}`)\n\t\t\t\t\t\t);\n\n\t\t\t\t\tif (loadedSchema) {\n\t\t\t\t\t\treturn ObjectHelper.clone(loadedSchema);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Resolve an object schema for utility type application.\n\t * @param context The generation context.\n\t * @param typeName The referenced type name.\n\t * @returns The resolved object schema.\n\t */\n\tpublic static resolveObjectTypeSchemaForUtility(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeName: string\n\t): IJsonSchema | undefined {\n\t\tconst typeParameterBinding = JsonSchemaBuilder.getTypeParameterBinding(context, typeName);\n\t\tif (typeParameterBinding !== undefined) {\n\t\t\treturn typeParameterBinding\n\t\t\t\t? JsonSchemaBuilder.resolveUtilityBaseObjectSchema(context, typeParameterBinding)\n\t\t\t\t: undefined;\n\t\t}\n\n\t\tconst title = StringHelper.stripPrefix(typeName);\n\t\tconst localSchema = context.schemas[context.packageName]?.[title];\n\n\t\tif (localSchema?.type === \"object\" && localSchema.properties) {\n\t\t\treturn ObjectHelper.clone(localSchema);\n\t\t}\n\n\t\tconst declarationSchema = JsonSchemaBuilder.mapObjectTypeFromLocalDeclaration(\n\t\t\tcontext,\n\t\t\ttypeName\n\t\t);\n\t\tif (declarationSchema) {\n\t\t\treturn declarationSchema;\n\t\t}\n\n\t\tfor (const packageEntry of Object.values(context.schemas)) {\n\t\t\tconst packageSchema = packageEntry[title];\n\t\t\tif (packageSchema?.type === \"object\" && packageSchema.properties) {\n\t\t\t\treturn ObjectHelper.clone(packageSchema);\n\t\t\t}\n\t\t}\n\n\t\tconst importedTypeReference = JsonSchemaBuilder.findImportedTypeReference(context, typeName);\n\t\tif (importedTypeReference) {\n\t\t\tconst importedSchema = JsonSchemaBuilder.resolveImportedObjectTypeSchemaForUtility(\n\t\t\t\tcontext,\n\t\t\t\timportedTypeReference.moduleSpecifier,\n\t\t\t\timportedTypeReference.candidateTypeName,\n\t\t\t\ttitle\n\t\t\t);\n\t\t\tif (importedSchema) {\n\t\t\t\treturn importedSchema;\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Find an imported type reference from the active source file by local or exported symbol name.\n\t * @param context The generation context.\n\t * @param typeName The local or exported type name to find.\n\t * @returns The module specifier and exported candidate type name when found.\n\t */\n\tpublic static findImportedTypeReference(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeName: string\n\t): { moduleSpecifier: string; candidateTypeName: string } | undefined {\n\t\tif (!context.activeSourceFile) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tfor (const statement of context.activeSourceFile.statements) {\n\t\t\tif (ts.isImportDeclaration(statement) && ts.isStringLiteral(statement.moduleSpecifier)) {\n\t\t\t\tif (\n\t\t\t\t\tstatement.importClause?.namedBindings &&\n\t\t\t\t\tts.isNamedImports(statement.importClause.namedBindings)\n\t\t\t\t) {\n\t\t\t\t\tconst importedElement = Array.from(statement.importClause.namedBindings.elements).find(\n\t\t\t\t\t\te => e.name.text === typeName || (e.propertyName?.text ?? e.name.text) === typeName\n\t\t\t\t\t);\n\t\t\t\t\tif (importedElement) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tmoduleSpecifier: statement.moduleSpecifier.text,\n\t\t\t\t\t\t\tcandidateTypeName: importedElement.propertyName?.text ?? importedElement.name.text\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Resolve an imported object schema for utility type application.\n\t * @param context The generation context.\n\t * @param moduleSpecifier The module where the type is imported from.\n\t * @param candidateTypeName The exported candidate type name.\n\t * @param title The stripped title of the requested type.\n\t * @returns The resolved object schema.\n\t */\n\tpublic static resolveImportedObjectTypeSchemaForUtility(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tmoduleSpecifier: string,\n\t\tcandidateTypeName: string,\n\t\ttitle: string\n\t): IJsonSchema | undefined {\n\t\tcontext.resolvingImportedObjectSchemas ??= new Set<string>();\n\t\tconst resolvingKey = `${context.packageName}:${moduleSpecifier}:${candidateTypeName}`;\n\t\tif (context.resolvingImportedObjectSchemas.has(resolvingKey)) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tcontext.resolvingImportedObjectSchemas.add(resolvingKey);\n\t\ttry {\n\t\t\tif (moduleSpecifier.startsWith(\".\")) {\n\t\t\t\tif (!context.activeSourceFile) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\n\t\t\t\tconst resolvedImportPath = JsonSchemaBuilder.resolveImportDeclarationSourceFile(\n\t\t\t\t\tcontext.activeSourceFile.fileName,\n\t\t\t\t\tmoduleSpecifier\n\t\t\t\t);\n\t\t\t\tif (!resolvedImportPath) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\n\t\t\t\tconst importedSource = FileUtils.readFile(resolvedImportPath);\n\t\t\t\tif (!importedSource) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\n\t\t\t\tJsonSchemaBuilder.parseAllObjectSchemas(context, resolvedImportPath, importedSource, []);\n\n\t\t\t\tconst localLoadedSchema =\n\t\t\t\t\tcontext.schemas[context.packageName]?.[title] ??\n\t\t\t\t\tcontext.schemas[context.packageName]?.[StringHelper.stripPrefix(candidateTypeName)] ??\n\t\t\t\t\tObject.values(context.schemas[context.packageName] ?? {}).find(\n\t\t\t\t\t\ts =>\n\t\t\t\t\t\t\ts.title === title ||\n\t\t\t\t\t\t\ts.title === StringHelper.stripPrefix(candidateTypeName) ||\n\t\t\t\t\t\t\ts.$id?.endsWith(`/${title}`)\n\t\t\t\t\t);\n\t\t\t\tif (localLoadedSchema?.type === \"object\" && localLoadedSchema.properties) {\n\t\t\t\t\treturn ObjectHelper.clone(localLoadedSchema);\n\t\t\t\t}\n\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst declarationResult = Resolver.resolveTypeDeclarationAst(\n\t\t\t\tmoduleSpecifier,\n\t\t\t\tcandidateTypeName\n\t\t\t);\n\t\t\tif (!declarationResult) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst mappedReference = JsonSchemaBuilder.resolveReferenceMappingTarget(\n\t\t\t\tcontext,\n\t\t\t\tmoduleSpecifier,\n\t\t\t\tcandidateTypeName\n\t\t\t);\n\t\t\tconst externalContext: ITypeScriptToSchemaContext = {\n\t\t\t\tnamespace: mappedReference?.namespace ?? context.namespace,\n\t\t\t\tpackageName: moduleSpecifier,\n\t\t\t\tschemas: context.schemas,\n\t\t\t\tactiveSourceFile: context.activeSourceFile,\n\t\t\t\tresolvingImportedObjectSchemas: context.resolvingImportedObjectSchemas,\n\t\t\t\toptions: context.options\n\t\t\t};\n\t\t\tJsonSchemaBuilder.parseAllObjectSchemas(\n\t\t\t\texternalContext,\n\t\t\t\tdeclarationResult.sourceFile.fileName,\n\t\t\t\tdeclarationResult.sourceFile.getFullText(),\n\t\t\t\t[]\n\t\t\t);\n\n\t\t\tconst loadedSchema =\n\t\t\t\tcontext.schemas[moduleSpecifier]?.[title] ??\n\t\t\t\tObject.values(context.schemas[moduleSpecifier] ?? {}).find(\n\t\t\t\t\ts => s.title === title || s.$id?.endsWith(`/${title}`)\n\t\t\t\t);\n\t\t\tif (loadedSchema?.type === \"object\" && loadedSchema.properties) {\n\t\t\t\treturn ObjectHelper.clone(loadedSchema);\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t} finally {\n\t\t\tcontext.resolvingImportedObjectSchemas.delete(resolvingKey);\n\t\t}\n\t}\n\n\t/**\n\t * Map a local interface or type alias declaration to an object schema.\n\t * @param context The generation context.\n\t * @param typeName The referenced type name.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapObjectTypeFromLocalDeclaration(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeName: string\n\t): IJsonSchema | undefined {\n\t\tconst sourceFile = context.activeSourceFile;\n\t\tif (!sourceFile) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tcontext.resolvingTypeNames ??= new Set<string>();\n\t\tif (context.resolvingTypeNames.has(typeName)) {\n\t\t\treturn {};\n\t\t}\n\n\t\tconst declaration = sourceFile.statements.find(statement => {\n\t\t\tif (ts.isInterfaceDeclaration(statement) || ts.isTypeAliasDeclaration(statement)) {\n\t\t\t\treturn statement.name.text === typeName;\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\n\t\tif (!declaration) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tcontext.resolvingTypeNames.add(typeName);\n\t\ttry {\n\t\t\tif (ts.isInterfaceDeclaration(declaration)) {\n\t\t\t\tconst boundContext = JsonSchemaBuilder.withTypeParameterBindings(\n\t\t\t\t\tcontext,\n\t\t\t\t\tdeclaration.typeParameters\n\t\t\t\t);\n\t\t\t\tconst { properties, required } = JsonSchemaBuilder.buildObjectMembersSchema(\n\t\t\t\t\tboundContext,\n\t\t\t\t\tdeclaration.members\n\t\t\t\t);\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"object\",\n\t\t\t\t\tproperties: Object.keys(properties).length > 0 ? properties : undefined,\n\t\t\t\t\trequired: required.length > 0 ? required : undefined\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (ts.isTypeAliasDeclaration(declaration) && ts.isTypeLiteralNode(declaration.type)) {\n\t\t\t\tconst boundContext = JsonSchemaBuilder.withTypeParameterBindings(\n\t\t\t\t\tcontext,\n\t\t\t\t\tdeclaration.typeParameters\n\t\t\t\t);\n\t\t\t\treturn JsonSchemaBuilder.buildTypeLiteralSchema(boundContext, declaration.type);\n\t\t\t}\n\t\t} finally {\n\t\t\tcontext.resolvingTypeNames.delete(typeName);\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Extract string literal keys from a utility type key argument (e.g. Pick or Omit).\n\t * @param context The generation context.\n\t * @param keysTypeNode The keys type node.\n\t * @returns The extracted keys.\n\t */\n\tpublic static extractUtilityTypeKeys(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tkeysTypeNode: ts.TypeNode | undefined\n\t): string[] {\n\t\tif (!keysTypeNode) {\n\t\t\treturn [];\n\t\t}\n\n\t\t// readonly T[] or keyof T (type operator node)\n\t\tif (ts.isTypeOperatorNode(keysTypeNode)) {\n\t\t\tif (keysTypeNode.operator === ts.SyntaxKind.ReadonlyKeyword) {\n\t\t\t\treturn JsonSchemaBuilder.extractUtilityTypeKeys(context, keysTypeNode.type);\n\t\t\t}\n\n\t\t\tif (keysTypeNode.operator === ts.SyntaxKind.KeyOfKeyword) {\n\t\t\t\treturn JsonSchemaBuilder.extractKeyofTypeKeys(context, keysTypeNode.type);\n\t\t\t}\n\t\t}\n\n\t\t// \"key\" (string literal type as a single key)\n\t\tif (ts.isLiteralTypeNode(keysTypeNode) && ts.isStringLiteral(keysTypeNode.literal)) {\n\t\t\treturn [keysTypeNode.literal.text];\n\t\t}\n\n\t\t// \"a\" | \"b\" (union of string literal keys)\n\t\tif (ts.isUnionTypeNode(keysTypeNode)) {\n\t\t\treturn (\n\t\t\t\tkeysTypeNode.types\n\t\t\t\t\t// \"key\" (only string literal type members are supported)\n\t\t\t\t\t.filter(type => ts.isLiteralTypeNode(type) && ts.isStringLiteral(type.literal))\n\t\t\t\t\t.map(type => (type as ts.LiteralTypeNode).literal as ts.StringLiteral)\n\t\t\t\t\t.map(literal => literal.text)\n\t\t\t);\n\t\t}\n\n\t\treturn [];\n\t}\n\n\t/**\n\t * Extract property keys from an indexed access index type.\n\t * @param context The generation context.\n\t * @param indexTypeNode The index type node.\n\t * @returns The extracted keys.\n\t */\n\tpublic static extractIndexedAccessKeys(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tindexTypeNode: ts.TypeNode\n\t): string[] {\n\t\t// \"key\" or 42 (literal type index)\n\t\tif (ts.isLiteralTypeNode(indexTypeNode)) {\n\t\t\t// \"key\" (string literal index)\n\t\t\tif (ts.isStringLiteral(indexTypeNode.literal)) {\n\t\t\t\treturn [indexTypeNode.literal.text];\n\t\t\t}\n\n\t\t\t// 0 (numeric literal index)\n\t\t\tif (ts.isNumericLiteral(indexTypeNode.literal)) {\n\t\t\t\treturn [indexTypeNode.literal.text];\n\t\t\t}\n\t\t}\n\n\t\t// \"a\" | \"b\" (union of index types, recurse into each branch)\n\t\tif (ts.isUnionTypeNode(indexTypeNode)) {\n\t\t\tconst keys = indexTypeNode.types.flatMap(unionType =>\n\t\t\t\tJsonSchemaBuilder.extractIndexedAccessKeys(context, unionType)\n\t\t\t);\n\t\t\treturn [...new Set(keys)];\n\t\t}\n\n\t\treturn JsonSchemaBuilder.extractUtilityTypeKeys(context, indexTypeNode);\n\t}\n\n\t/**\n\t * Extract keys for a mapped type constraint.\n\t * @param context The generation context.\n\t * @param constraintTypeNode The mapped type constraint.\n\t * @returns The extracted keys.\n\t */\n\tpublic static extractMappedTypeKeys(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tconstraintTypeNode: ts.TypeNode | undefined\n\t): string[] {\n\t\tif (!constraintTypeNode) {\n\t\t\treturn [];\n\t\t}\n\n\t\t// `prefix-${T}` (template literal constraint, keys cannot be statically enumerated)\n\t\tif (ts.isTemplateLiteralTypeNode(constraintTypeNode)) {\n\t\t\treturn [];\n\t\t}\n\n\t\t// TypeName (type reference constraint, resolve to its declaration)\n\t\tif (ts.isTypeReferenceNode(constraintTypeNode)) {\n\t\t\tconst referencedTypeNode = JsonSchemaBuilder.resolveReferencedTypeNodeFromLocalDeclaration(\n\t\t\t\tcontext,\n\t\t\t\tconstraintTypeNode\n\t\t\t);\n\t\t\tif (referencedTypeNode) {\n\t\t\t\treturn JsonSchemaBuilder.extractMappedTypeKeys(context, referencedTypeNode);\n\t\t\t}\n\t\t}\n\n\t\treturn JsonSchemaBuilder.extractUtilityTypeKeys(context, constraintTypeNode);\n\t}\n\n\t/**\n\t * Resolve a referenced type node from a local type alias declaration.\n\t * @param context The generation context.\n\t * @param typeNode The type reference node.\n\t * @returns The referenced type node, if found locally.\n\t */\n\tpublic static resolveReferencedTypeNodeFromLocalDeclaration(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode\n\t): ts.TypeNode | undefined {\n\t\t// TypeName (plain identifier) vs Namespace.TypeName (qualified name)\n\t\tconst typeName = ts.isIdentifier(typeNode.typeName)\n\t\t\t? typeNode.typeName.text\n\t\t\t: typeNode.typeName.right.text;\n\t\tconst typeParameterBinding = JsonSchemaBuilder.getTypeParameterBinding(context, typeName);\n\t\tif (typeParameterBinding !== undefined) {\n\t\t\treturn typeParameterBinding ?? undefined;\n\t\t}\n\n\t\tconst sourceFile = context.activeSourceFile;\n\t\tif (!sourceFile) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst declaration = sourceFile.statements.find(\n\t\t\t// type TypeName = ... (type alias declaration matching the resolved name)\n\t\t\t(statement): statement is ts.TypeAliasDeclaration =>\n\t\t\t\tts.isTypeAliasDeclaration(statement) && statement.name.text === typeName\n\t\t);\n\n\t\treturn declaration?.type;\n\t}\n\n\t/**\n\t * Create a nested mapping context with generic parameters bound.\n\t * @param context The current generation context.\n\t * @param typeParameters The generic type parameters for the declaration.\n\t * @param typeArguments Explicit type arguments, when provided.\n\t * @returns The scoped mapping context.\n\t */\n\tpublic static withTypeParameterBindings(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeParameters: ts.NodeArray<ts.TypeParameterDeclaration> | undefined,\n\t\ttypeArguments?: ts.NodeArray<ts.TypeNode>\n\t): ITypeScriptToSchemaContext {\n\t\tif (!typeParameters || typeParameters.length === 0) {\n\t\t\treturn context;\n\t\t}\n\n\t\tconst typeParameterBindings = context.typeParameterBindings ?? {};\n\n\t\tfor (const [index, typeParameter] of typeParameters.entries()) {\n\t\t\ttypeParameterBindings[typeParameter.name.text] =\n\t\t\t\ttypeArguments?.[index] ?? typeParameter.default ?? typeParameter.constraint ?? null;\n\t\t}\n\n\t\treturn {\n\t\t\t...context,\n\t\t\ttypeParameterBindings\n\t\t};\n\t}\n\n\t/**\n\t * Get a bound generic type parameter for the current mapping scope.\n\t * @param context The current generation context.\n\t * @param typeName The type name to resolve.\n\t * @returns The bound type node, null for unresolved generic parameters, or undefined when not generic.\n\t */\n\tpublic static getTypeParameterBinding(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeName: string\n\t): ts.TypeNode | null | undefined {\n\t\tif (!context.typeParameterBindings) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn Object.prototype.hasOwnProperty.call(context.typeParameterBindings, typeName)\n\t\t\t? context.typeParameterBindings[typeName]\n\t\t\t: undefined;\n\t}\n\n\t/**\n\t * Determine whether a mapped type is a homomorphic source-preserving form.\n\t * @param typeNode The mapped type node.\n\t * @returns True if the mapped type mirrors an existing object shape.\n\t */\n\tpublic static isHomomorphicMappedType(typeNode: ts.MappedTypeNode): boolean {\n\t\tconst mappedTypeParameterName = typeNode.typeParameter.name.text;\n\t\tconst constraintTypeNode = typeNode.typeParameter.constraint;\n\t\tconst mappedValueType = typeNode.type;\n\n\t\t// keyof T (constraint must be a type operator for the type to be homomorphic)\n\t\tif (!constraintTypeNode || !mappedValueType || !ts.isTypeOperatorNode(constraintTypeNode)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (constraintTypeNode.operator !== ts.SyntaxKind.KeyOfKeyword) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// T[K] (mapped value must be an indexed access of the source object)\n\t\tif (!ts.isIndexedAccessTypeNode(mappedValueType)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (\n\t\t\t!JsonSchemaBuilder.isMappedTypeParameterReference(\n\t\t\t\tmappedValueType.indexType,\n\t\t\t\tmappedTypeParameterName\n\t\t\t)\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn (\n\t\t\tmappedValueType.objectType.getText() === constraintTypeNode.type.getText() &&\n\t\t\ttypeNode.nameType === undefined\n\t\t);\n\t}\n\n\t/**\n\t * Resolve a source object schema for a mapped type when one exists.\n\t * @param context The generation context.\n\t * @param typeNode The mapped type node.\n\t * @returns The resolved source object schema.\n\t */\n\tpublic static resolveMappedTypeSourceObjectSchema(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.MappedTypeNode\n\t): IJsonSchema | undefined {\n\t\tconst constraintTypeNode = typeNode.typeParameter.constraint;\n\t\tif (\n\t\t\tconstraintTypeNode &&\n\t\t\t// keyof T (homomorphic mapped type, constraint is keyof the source object)\n\t\t\tts.isTypeOperatorNode(constraintTypeNode) &&\n\t\t\tconstraintTypeNode.operator === ts.SyntaxKind.KeyOfKeyword\n\t\t) {\n\t\t\treturn JsonSchemaBuilder.resolveUtilityBaseObjectSchema(context, constraintTypeNode.type);\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Map a single mapped-type property schema.\n\t * @param context The generation context.\n\t * @param typeNode The mapped type node.\n\t * @param sourcePropertyKey The original property key from the source object, used for lookup when the mapped type is homomorphic.\n\t * @param mappedTypeParameterName The mapped type parameter name.\n\t * @param sourceObjectSchema The optional source object schema.\n\t * @returns The mapped property schema.\n\t */\n\tpublic static mapMappedTypePropertySchema(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.MappedTypeNode,\n\t\tsourcePropertyKey: string,\n\t\tmappedTypeParameterName: string,\n\t\tsourceObjectSchema?: IJsonSchema\n\t): IJsonSchema | undefined {\n\t\tif (!typeNode.type) {\n\t\t\treturn {};\n\t\t}\n\n\t\tif (\n\t\t\t// T[K] (indexed access where the index is the mapped type parameter)\n\t\t\tts.isIndexedAccessTypeNode(typeNode.type) &&\n\t\t\tJsonSchemaBuilder.isMappedTypeParameterReference(\n\t\t\t\ttypeNode.type.indexType,\n\t\t\t\tmappedTypeParameterName\n\t\t\t)\n\t\t) {\n\t\t\tconst indexedPropertySchema = JsonSchemaBuilder.resolveIndexedPropertySchema(\n\t\t\t\tcontext,\n\t\t\t\ttypeNode.type.objectType,\n\t\t\t\tsourcePropertyKey,\n\t\t\t\tsourceObjectSchema\n\t\t\t);\n\t\t\tif (indexedPropertySchema) {\n\t\t\t\treturn indexedPropertySchema;\n\t\t\t}\n\t\t}\n\n\t\treturn JsonSchemaBuilder.mapTypeNodeToSchema(context, typeNode.type);\n\t}\n\n\t/**\n\t * Resolve a concrete property schema for an indexed access object type and key.\n\t * @param context The generation context.\n\t * @param objectTypeNode The source object type node.\n\t * @param propertyKey The property key to resolve.\n\t * @param sourceObjectSchema The optional pre-resolved source object schema.\n\t * @returns The resolved property schema.\n\t */\n\tpublic static resolveIndexedPropertySchema(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tobjectTypeNode: ts.TypeNode,\n\t\tpropertyKey: string,\n\t\tsourceObjectSchema?: IJsonSchema\n\t): IJsonSchema | undefined {\n\t\tconst objectSchema =\n\t\t\tsourceObjectSchema ??\n\t\t\tJsonSchemaBuilder.resolveUtilityBaseObjectSchema(context, objectTypeNode);\n\t\tif (!objectSchema) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn ObjectTransformer.resolvePropertySchemaFromObjectSchema(objectSchema, propertyKey);\n\t}\n\n\t/**\n\t * Determine whether a type node is a reference to the mapped type parameter.\n\t * @param typeNode The type node.\n\t * @param mappedTypeParameterName The mapped type parameter name.\n\t * @returns True if the node references the mapped parameter.\n\t */\n\tpublic static isMappedTypeParameterReference(\n\t\ttypeNode: ts.TypeNode,\n\t\tmappedTypeParameterName: string\n\t): boolean {\n\t\treturn (\n\t\t\t// K (type reference to the mapped parameter, plain identifier)\n\t\t\tts.isTypeReferenceNode(typeNode) &&\n\t\t\t// K (identifier node matching the parameter name)\n\t\t\tts.isIdentifier(typeNode.typeName) &&\n\t\t\ttypeNode.typeName.text === mappedTypeParameterName\n\t\t);\n\t}\n\n\t/**\n\t * Apply mapped-type optionality to a schema cloned from a source object.\n\t * @param schema The mapped schema.\n\t * @param optionalToken The mapped type optional token.\n\t */\n\tpublic static applyMappedTypeOptionality(\n\t\tschema: IJsonSchema,\n\t\toptionalToken: ts.QuestionToken | ts.PlusToken | ts.MinusToken | undefined\n\t): void {\n\t\tif (!optionalToken) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (\n\t\t\toptionalToken.kind === ts.SyntaxKind.QuestionToken ||\n\t\t\toptionalToken.kind === ts.SyntaxKind.PlusToken\n\t\t) {\n\t\t\tdelete schema.required;\n\t\t\treturn;\n\t\t}\n\n\t\tif (optionalToken.kind === ts.SyntaxKind.MinusToken && Is.object(schema.properties)) {\n\t\t\tschema.required = Object.keys(schema.properties);\n\t\t}\n\t}\n\n\t/**\n\t * Apply mapped-type required keys for generated property sets.\n\t * @param schema The mapped schema.\n\t * @param propertyKeys The generated property keys.\n\t * @param optionalToken The mapped type optional token.\n\t */\n\tpublic static applyMappedTypeRequiredKeys(\n\t\tschema: IJsonSchema,\n\t\tpropertyKeys: string[],\n\t\toptionalToken: ts.QuestionToken | ts.PlusToken | ts.MinusToken | undefined\n\t): void {\n\t\tif (\n\t\t\toptionalToken &&\n\t\t\t(optionalToken.kind === ts.SyntaxKind.QuestionToken ||\n\t\t\t\toptionalToken.kind === ts.SyntaxKind.PlusToken)\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tschema.required = propertyKeys;\n\t}\n\n\t/**\n\t * Extract key names from a keyof operand where possible.\n\t * @param context The generation context.\n\t * @param keysOperandNode The operand used with keyof.\n\t * @returns The extracted keys.\n\t */\n\tpublic static extractKeyofTypeKeys(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tkeysOperandNode: ts.TypeNode\n\t): string[] {\n\t\t// (string | number) (parenthesised type, unwrap and recurse)\n\t\tif (ts.isParenthesizedTypeNode(keysOperandNode)) {\n\t\t\treturn JsonSchemaBuilder.extractKeyofTypeKeys(context, keysOperandNode.type);\n\t\t}\n\n\t\tif (ts.isTypeReferenceNode(keysOperandNode) && ts.isIdentifier(keysOperandNode.typeName)) {\n\t\t\tconst typeParameterBinding = JsonSchemaBuilder.getTypeParameterBinding(\n\t\t\t\tcontext,\n\t\t\t\tkeysOperandNode.typeName.text\n\t\t\t);\n\t\t\tif (typeParameterBinding !== undefined) {\n\t\t\t\treturn typeParameterBinding\n\t\t\t\t\t? JsonSchemaBuilder.extractKeyofTypeKeys(context, typeParameterBinding)\n\t\t\t\t\t: [];\n\t\t\t}\n\t\t}\n\n\t\t// { prop: string } (type literal, enumerate property names as keys)\n\t\tif (ts.isTypeLiteralNode(keysOperandNode)) {\n\t\t\tconst keyNames = keysOperandNode.members\n\t\t\t\t.filter(\n\t\t\t\t\t// prop: string (property signature with a name)\n\t\t\t\t\t(member): member is ts.PropertySignature & { name: ts.PropertyName } =>\n\t\t\t\t\t\tts.isPropertySignature(member) && member.name !== undefined\n\t\t\t\t)\n\t\t\t\t.map(member => JsonSchemaBuilder.extractPropertyName(context, member.name))\n\t\t\t\t.filter((keyName): keyName is string => Is.stringValue(keyName));\n\n\t\t\treturn [...new Set(keyNames)];\n\t\t}\n\n\t\tconst objectSchema = JsonSchemaBuilder.resolveUtilityBaseObjectSchema(context, keysOperandNode);\n\t\tif (objectSchema?.properties && Is.object(objectSchema.properties)) {\n\t\t\treturn Object.keys(objectSchema.properties);\n\t\t}\n\n\t\treturn [];\n\t}\n\n\t/**\n\t * Determine whether a keyof operand is a generic type parameter reference.\n\t * @param context The generation context.\n\t * @param keysOperandNode The operand used with keyof.\n\t * @returns True if the operand is a generic parameter.\n\t */\n\tpublic static isGenericKeyofOperand(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tkeysOperandNode: ts.TypeNode\n\t): boolean {\n\t\tif (ts.isParenthesizedTypeNode(keysOperandNode)) {\n\t\t\treturn JsonSchemaBuilder.isGenericKeyofOperand(context, keysOperandNode.type);\n\t\t}\n\n\t\tif (!ts.isTypeReferenceNode(keysOperandNode) || !ts.isIdentifier(keysOperandNode.typeName)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst typeName = keysOperandNode.typeName.text;\n\t\tif (JsonSchemaBuilder.getTypeParameterBinding(context, typeName) !== undefined) {\n\t\t\treturn true;\n\t\t}\n\n\t\tlet currentNode: ts.Node | undefined = keysOperandNode;\n\t\twhile (currentNode) {\n\t\t\tconst typedNode = currentNode as ts.Node & {\n\t\t\t\ttypeParameters?: ts.NodeArray<ts.TypeParameterDeclaration>;\n\t\t\t};\n\t\t\tif (typedNode.typeParameters?.some(typeParameter => typeParameter.name.text === typeName)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tcurrentNode = currentNode.parent;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Resolve a schema id for an external imported type reference.\n\t * @param context The generation context.\n\t * @param typeNode The type reference node.\n\t * @param typeName The referenced type name.\n\t * @returns The resolved schema id.\n\t */\n\tpublic static resolveExternalTypeReferenceSchemaId(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode,\n\t\ttypeName: string\n\t): string | undefined {\n\t\tconst activeSourceFile = context.activeSourceFile;\n\t\tif (!activeSourceFile) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst moduleSpecifier = JsonSchemaBuilder.findImportedModuleSpecifier(\n\t\t\tactiveSourceFile,\n\t\t\ttypeNode,\n\t\t\ttypeName\n\t\t);\n\t\tif (!moduleSpecifier) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (moduleSpecifier.startsWith(\".\")) {\n\t\t\treturn JsonSchemaBuilder.resolveReferenceMappingTarget(context, moduleSpecifier, typeName)\n\t\t\t\t?.schemaId;\n\t\t}\n\n\t\tconst title = StringHelper.stripPrefix(typeName);\n\t\tconst cachedSchemaId = context.schemas[moduleSpecifier]?.[title]?.$id;\n\t\tif (cachedSchemaId) {\n\t\t\treturn cachedSchemaId;\n\t\t}\n\n\t\tconst mappedReference = JsonSchemaBuilder.resolveReferenceMappingTarget(\n\t\t\tcontext,\n\t\t\tmoduleSpecifier,\n\t\t\ttypeName\n\t\t);\n\n\t\tconst declarationResult = Resolver.resolveTypeDeclarationAst(moduleSpecifier, typeName);\n\t\tif (!declarationResult) {\n\t\t\treturn mappedReference?.schemaId;\n\t\t}\n\n\t\tconst externalContext: ITypeScriptToSchemaContext = {\n\t\t\tnamespace: mappedReference?.namespace ?? context.namespace,\n\t\t\tpackageName: moduleSpecifier,\n\t\t\tschemas: context.schemas,\n\t\t\tactiveSourceFile: context.activeSourceFile,\n\t\t\toptions: context.options\n\t\t};\n\n\t\tJsonSchemaBuilder.parseAllObjectSchemas(\n\t\t\texternalContext,\n\t\t\tdeclarationResult.sourceFile.fileName,\n\t\t\tdeclarationResult.sourceFile.getFullText(),\n\t\t\t[]\n\t\t);\n\n\t\treturn context.schemas[moduleSpecifier]?.[title]?.$id ?? mappedReference?.schemaId;\n\t}\n\n\t/**\n\t * Resolve a mapped schema target for an imported reference.\n\t * @param context The generation context.\n\t * @param packageName The referenced package or module specifier.\n\t * @param typeName The imported type name.\n\t * @returns The mapped schema id and optional namespace if one matches.\n\t */\n\tpublic static resolveReferenceMappingTarget(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tpackageName: string,\n\t\ttypeName: string\n\t): { schemaId: string; namespace?: string } | undefined {\n\t\tconst externalReferences = context.options?.externalReferences;\n\t\tif (!externalReferences) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst derivedTitle = StringHelper.stripPrefix(typeName);\n\n\t\tif (externalReferences[packageName]) {\n\t\t\treturn {\n\t\t\t\tschemaId: `${externalReferences[packageName]}${derivedTitle}`,\n\t\t\t\tnamespace: externalReferences[packageName]\n\t\t\t};\n\t\t}\n\n\t\tif (externalReferences[typeName]) {\n\t\t\treturn {\n\t\t\t\tschemaId: `${externalReferences[typeName]}${derivedTitle}`,\n\t\t\t\tnamespace: externalReferences[typeName]\n\t\t\t};\n\t\t}\n\n\t\tif (externalReferences[derivedTitle]) {\n\t\t\treturn {\n\t\t\t\tschemaId: `${externalReferences[derivedTitle]}${derivedTitle}`,\n\t\t\t\tnamespace: externalReferences[derivedTitle]\n\t\t\t};\n\t\t}\n\n\t\tfor (const [pattern, mappedNamespace] of Object.entries(externalReferences)) {\n\t\t\tif (RegEx.isReferencePatternMatch(pattern, packageName, typeName, derivedTitle)) {\n\t\t\t\tif (/\\$\\d+/u.test(mappedNamespace)) {\n\t\t\t\t\tconst schemaId = RegEx.applyReferencePatternReplacement(\n\t\t\t\t\t\tpattern,\n\t\t\t\t\t\tmappedNamespace,\n\t\t\t\t\t\tpackageName,\n\t\t\t\t\t\ttypeName,\n\t\t\t\t\t\tderivedTitle\n\t\t\t\t\t);\n\t\t\t\t\tif (schemaId) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tschemaId,\n\t\t\t\t\t\t\tnamespace: schemaId.endsWith(derivedTitle)\n\t\t\t\t\t\t\t\t? schemaId.slice(0, -derivedTitle.length)\n\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tschemaId: `${mappedNamespace}${derivedTitle}`,\n\t\t\t\t\tnamespace: mappedNamespace\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Find a module specifier for a referenced type in the active source file imports.\n\t * @param sourceFile The active source file.\n\t * @param typeNode The referenced type node.\n\t * @param typeName The referenced type name.\n\t * @returns The module specifier.\n\t */\n\tpublic static findImportedModuleSpecifier(\n\t\tsourceFile: ts.SourceFile,\n\t\ttypeNode: ts.TypeReferenceNode,\n\t\ttypeName: string\n\t): string | undefined {\n\t\tfor (const statement of sourceFile.statements) {\n\t\t\t// import { ... } from \"./module.js\" (import declaration with string specifier)\n\t\t\tif (ts.isImportDeclaration(statement) && ts.isStringLiteral(statement.moduleSpecifier)) {\n\t\t\t\tconst importClause = statement.importClause;\n\t\t\t\tif (importClause) {\n\t\t\t\t\tif (importClause.name?.text === typeName) {\n\t\t\t\t\t\treturn statement.moduleSpecifier.text;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst namedBindings = importClause.namedBindings;\n\t\t\t\t\tif (namedBindings) {\n\t\t\t\t\t\t// import * as Namespace and Namespace.TypeName (namespace import + qualified usage)\n\t\t\t\t\t\tif (ts.isNamespaceImport(namedBindings) && ts.isQualifiedName(typeNode.typeName)) {\n\t\t\t\t\t\t\tif (namedBindings.name.text === typeNode.typeName.left.getText()) {\n\t\t\t\t\t\t\t\treturn statement.moduleSpecifier.text;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// import { Named, Import } (named import bindings)\n\t\t\t\t\t\tif (ts.isNamedImports(namedBindings)) {\n\t\t\t\t\t\t\tfor (const importSpecifier of namedBindings.elements) {\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\timportSpecifier.name.text === typeName ||\n\t\t\t\t\t\t\t\t\timportSpecifier.propertyName?.text === typeName\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\treturn statement.moduleSpecifier.text;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Map custom tag key names to JSON schema property names.\n\t * @param key The raw tag key.\n\t * @returns The schema key.\n\t */\n\tpublic static mapJsonSchemaTagKey(key: string): string {\n\t\tif (key === \"id\") {\n\t\t\treturn \"$id\";\n\t\t}\n\t\tif (key === \"ref\") {\n\t\t\treturn \"$ref\";\n\t\t}\n\t\tif (key === \"comment\") {\n\t\t\treturn \"$comment\";\n\t\t}\n\n\t\treturn key;\n\t}\n\n\t/**\n\t * Extract the inner type node from a named or rest tuple element.\n\t * Named tuple members and rest elements both wrap an inner type node; this unwraps them.\n\t * Plain type nodes are returned as-is.\n\t * @param element The tuple element.\n\t * @returns The inner type node.\n\t */\n\tpublic static extractTupleElementType(element: ts.TypeNode): ts.TypeNode | undefined {\n\t\t// label: string (named tuple member, e.g. [label: string, count: number])\n\t\tif (ts.isNamedTupleMember(element)) {\n\t\t\treturn element.type;\n\t\t}\n\n\t\t// ...string[] (rest element in a tuple, e.g. [first: string, ...rest: string[]])\n\t\tif (ts.isRestTypeNode(element)) {\n\t\t\treturn element.type;\n\t\t}\n\n\t\treturn element;\n\t}\n}\n"]}
|