@twin.org/tools-core 0.0.4-next.3 → 0.9.0-next.1

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.
@@ -246,6 +246,7 @@ export class MappedTypeSchemaResolver {
246
246
  * @param intrinsicName The intrinsic helper name.
247
247
  * @param value The input key value.
248
248
  * @returns The remapped key value.
249
+ * @internal
249
250
  */
250
251
  static applyIntrinsicMappedTypeKeyRemap(intrinsicName, value) {
251
252
  switch (intrinsicName) {
@@ -1 +1 @@
1
- {"version":3,"file":"mappedTypeSchemaResolver.js","sourceRoot":"","sources":["../../../src/utils/mappedTypeSchemaResolver.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2026 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { Is, JsonHelper } from \"@twin.org/core\";\nimport type { IJsonSchema } from \"@twin.org/tools-models\";\nimport * as ts from \"typescript\";\nimport { JsonSchemaBuilder } from \"./jsonSchemaBuilder.js\";\nimport type { ITypeScriptToSchemaContext } from \"../models/ITypeScriptToSchemaContext.js\";\n\n/**\n * Static mapped-type schema transformation helpers.\n */\nexport class MappedTypeSchemaResolver {\n\t/**\n\t * Resolve mapped type output keys, including remapped key names via `as`.\n\t * @param context The generation context.\n\t * @param typeNode The mapped type node.\n\t * @param mappedKeys The resolved source keys from the mapped type constraint.\n\t * @param mappedTypeParameterName The mapped type parameter identifier.\n\t * @returns The resolved source-to-output mapped key entries.\n\t */\n\tpublic static resolveMappedTypePropertyEntries(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.MappedTypeNode,\n\t\tmappedKeys: string[],\n\t\tmappedTypeParameterName: string\n\t): { sourceKey: string; mappedKey: string }[] | undefined {\n\t\tif (!typeNode.nameType) {\n\t\t\treturn mappedKeys.map(mappedKey => ({ sourceKey: mappedKey, mappedKey }));\n\t\t}\n\n\t\tconst mappedEntries: { sourceKey: string; mappedKey: string }[] = [];\n\n\t\tfor (const sourceKey of mappedKeys) {\n\t\t\tconst mappedKey = MappedTypeSchemaResolver.resolveMappedTypeRemappedKey(\n\t\t\t\tcontext,\n\t\t\t\ttypeNode.nameType,\n\t\t\t\tsourceKey,\n\t\t\t\tmappedTypeParameterName\n\t\t\t);\n\t\t\tif (mappedKey !== null && !Is.stringValue(mappedKey)) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tif (Is.stringValue(mappedKey)) {\n\t\t\t\tmappedEntries.push({ sourceKey, mappedKey });\n\t\t\t}\n\t\t}\n\n\t\treturn mappedEntries;\n\t}\n\n\t/**\n\t * Resolve a remapped mapped-type key expression for a concrete source key.\n\t * @param context The generation context.\n\t * @param nameTypeNode The mapped type name remapping expression node.\n\t * @param sourceKey The concrete source key currently being evaluated.\n\t * @param mappedTypeParameterName The mapped type parameter identifier.\n\t * @returns The remapped key, null when excluded via never, or undefined when unresolved.\n\t */\n\tpublic static resolveMappedTypeRemappedKey(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tnameTypeNode: ts.TypeNode,\n\t\tsourceKey: string,\n\t\tmappedTypeParameterName: string\n\t): string | null | undefined {\n\t\tif (ts.isParenthesizedTypeNode(nameTypeNode)) {\n\t\t\treturn MappedTypeSchemaResolver.resolveMappedTypeRemappedKey(\n\t\t\t\tcontext,\n\t\t\t\tnameTypeNode.type,\n\t\t\t\tsourceKey,\n\t\t\t\tmappedTypeParameterName\n\t\t\t);\n\t\t}\n\n\t\tif (nameTypeNode.kind === ts.SyntaxKind.NeverKeyword) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (JsonSchemaBuilder.isMappedTypeParameterReference(nameTypeNode, mappedTypeParameterName)) {\n\t\t\treturn sourceKey;\n\t\t}\n\n\t\tif (ts.isLiteralTypeNode(nameTypeNode)) {\n\t\t\tif (ts.isStringLiteral(nameTypeNode.literal) || ts.isNumericLiteral(nameTypeNode.literal)) {\n\t\t\t\treturn nameTypeNode.literal.text;\n\t\t\t}\n\t\t\tif (nameTypeNode.literal.kind === ts.SyntaxKind.TrueKeyword) {\n\t\t\t\treturn \"true\";\n\t\t\t}\n\t\t\tif (nameTypeNode.literal.kind === ts.SyntaxKind.FalseKeyword) {\n\t\t\t\treturn \"false\";\n\t\t\t}\n\t\t}\n\n\t\tif (ts.isIntersectionTypeNode(nameTypeNode)) {\n\t\t\tconst hasMappedKeyReference = nameTypeNode.types.some(type =>\n\t\t\t\tJsonSchemaBuilder.isMappedTypeParameterReference(type, mappedTypeParameterName)\n\t\t\t);\n\t\t\tconst hasStringKeyword = nameTypeNode.types.some(\n\t\t\t\ttype => type.kind === ts.SyntaxKind.StringKeyword\n\t\t\t);\n\t\t\tif (hasMappedKeyReference && hasStringKeyword) {\n\t\t\t\treturn sourceKey;\n\t\t\t}\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (ts.isTemplateLiteralTypeNode(nameTypeNode)) {\n\t\t\tlet remappedKey = nameTypeNode.head.text;\n\t\t\tfor (const span of nameTypeNode.templateSpans) {\n\t\t\t\tconst spanValue = MappedTypeSchemaResolver.resolveMappedTypeRemappedKey(\n\t\t\t\t\tcontext,\n\t\t\t\t\tspan.type,\n\t\t\t\t\tsourceKey,\n\t\t\t\t\tmappedTypeParameterName\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\tremappedKey += `${spanValue}${span.literal.text}`;\n\t\t\t}\n\n\t\t\treturn remappedKey;\n\t\t}\n\n\t\tif (ts.isTypeReferenceNode(nameTypeNode) && ts.isIdentifier(nameTypeNode.typeName)) {\n\t\t\tconst intrinsicName = nameTypeNode.typeName.text;\n\t\t\tif (nameTypeNode.typeArguments?.length === 1) {\n\t\t\t\tconst intrinsicInput = MappedTypeSchemaResolver.resolveMappedTypeRemappedKey(\n\t\t\t\t\tcontext,\n\t\t\t\t\tnameTypeNode.typeArguments[0],\n\t\t\t\t\tsourceKey,\n\t\t\t\t\tmappedTypeParameterName\n\t\t\t\t);\n\t\t\t\tif (!Is.stringValue(intrinsicInput)) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\n\t\t\t\treturn MappedTypeSchemaResolver.applyIntrinsicMappedTypeKeyRemap(\n\t\t\t\t\tintrinsicName,\n\t\t\t\t\tintrinsicInput\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tif (ts.isConditionalTypeNode(nameTypeNode)) {\n\t\t\tif (\n\t\t\t\t!JsonSchemaBuilder.isMappedTypeParameterReference(\n\t\t\t\t\tnameTypeNode.checkType,\n\t\t\t\t\tmappedTypeParameterName\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst satisfies = MappedTypeSchemaResolver.evaluateMappedKeyExtendsCondition(\n\t\t\t\tcontext,\n\t\t\t\tsourceKey,\n\t\t\t\tnameTypeNode.extendsType\n\t\t\t);\n\t\t\tif (satisfies === undefined) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst branchType = satisfies ? nameTypeNode.trueType : nameTypeNode.falseType;\n\t\t\treturn MappedTypeSchemaResolver.resolveMappedTypeRemappedKey(\n\t\t\t\tcontext,\n\t\t\t\tbranchType,\n\t\t\t\tsourceKey,\n\t\t\t\tmappedTypeParameterName\n\t\t\t);\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Evaluate whether a concrete mapped key satisfies an `extends` condition.\n\t * @param context The generation context.\n\t * @param sourceKey The concrete source key being evaluated.\n\t * @param extendsTypeNode The extends condition type node.\n\t * @returns True when the key satisfies the condition, false when it does not, otherwise undefined.\n\t */\n\tpublic static evaluateMappedKeyExtendsCondition(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tsourceKey: string,\n\t\textendsTypeNode: ts.TypeNode\n\t): boolean | undefined {\n\t\tif (ts.isParenthesizedTypeNode(extendsTypeNode)) {\n\t\t\treturn MappedTypeSchemaResolver.evaluateMappedKeyExtendsCondition(\n\t\t\t\tcontext,\n\t\t\t\tsourceKey,\n\t\t\t\textendsTypeNode.type\n\t\t\t);\n\t\t}\n\n\t\tif (\n\t\t\textendsTypeNode.kind === ts.SyntaxKind.StringKeyword ||\n\t\t\textendsTypeNode.kind === ts.SyntaxKind.AnyKeyword ||\n\t\t\textendsTypeNode.kind === ts.SyntaxKind.UnknownKeyword\n\t\t) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (\n\t\t\textendsTypeNode.kind === ts.SyntaxKind.NeverKeyword ||\n\t\t\textendsTypeNode.kind === ts.SyntaxKind.NumberKeyword ||\n\t\t\textendsTypeNode.kind === ts.SyntaxKind.BooleanKeyword ||\n\t\t\textendsTypeNode.kind === ts.SyntaxKind.ObjectKeyword\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (ts.isLiteralTypeNode(extendsTypeNode)) {\n\t\t\tif (\n\t\t\t\tts.isStringLiteral(extendsTypeNode.literal) ||\n\t\t\t\tts.isNumericLiteral(extendsTypeNode.literal)\n\t\t\t) {\n\t\t\t\treturn sourceKey === extendsTypeNode.literal.text;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\tif (ts.isUnionTypeNode(extendsTypeNode)) {\n\t\t\tlet hasUndetermined = false;\n\t\t\tfor (const memberType of extendsTypeNode.types) {\n\t\t\t\tconst result = MappedTypeSchemaResolver.evaluateMappedKeyExtendsCondition(\n\t\t\t\t\tcontext,\n\t\t\t\t\tsourceKey,\n\t\t\t\t\tmemberType\n\t\t\t\t);\n\t\t\t\tif (result === true) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (result === undefined) {\n\t\t\t\t\thasUndetermined = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn hasUndetermined ? undefined : false;\n\t\t}\n\n\t\tif (\n\t\t\tts.isTypeOperatorNode(extendsTypeNode) &&\n\t\t\textendsTypeNode.operator === ts.SyntaxKind.KeyOfKeyword\n\t\t) {\n\t\t\tconst keys = JsonSchemaBuilder.extractKeyofTypeKeys(context, extendsTypeNode.type);\n\t\t\tif (keys.length > 0) {\n\t\t\t\treturn keys.includes(sourceKey);\n\t\t\t}\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (ts.isTypeReferenceNode(extendsTypeNode)) {\n\t\t\tconst resolved = JsonSchemaBuilder.resolveReferencedTypeNodeFromLocalDeclaration(\n\t\t\t\tcontext,\n\t\t\t\textendsTypeNode\n\t\t\t);\n\t\t\tif (resolved) {\n\t\t\t\treturn MappedTypeSchemaResolver.evaluateMappedKeyExtendsCondition(\n\t\t\t\t\tcontext,\n\t\t\t\t\tsourceKey,\n\t\t\t\t\tresolved\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Build a conservative fallback schema for mapped types whose key remapping cannot be resolved.\n\t * @param context The generation context.\n\t * @param typeNode The mapped type node.\n\t * @param mappedKeys The resolved source keys from the mapped type constraint.\n\t * @param mappedTypeParameterName The mapped type parameter identifier.\n\t * @param sourceObjectSchema The optional source object schema for property lookups.\n\t * @returns The fallback mapped type schema.\n\t */\n\tpublic static buildMappedTypeFallbackSchema(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.MappedTypeNode,\n\t\tmappedKeys: string[],\n\t\tmappedTypeParameterName: string,\n\t\tsourceObjectSchema?: IJsonSchema\n\t): IJsonSchema {\n\t\tconst additionalProperties =\n\t\t\tMappedTypeSchemaResolver.buildMappedTypeFallbackAdditionalProperties(\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\n\t\treturn {\n\t\t\ttype: \"object\",\n\t\t\tadditionalProperties: additionalProperties ?? {}\n\t\t};\n\t}\n\n\t/**\n\t * Build fallback additionalProperties for unresolved mapped key remapping.\n\t * @param context The generation context.\n\t * @param typeNode The mapped type node.\n\t * @param mappedKeys The resolved source keys from the mapped type constraint.\n\t * @param mappedTypeParameterName The mapped type parameter identifier.\n\t * @param sourceObjectSchema The optional source object schema for property lookups.\n\t * @returns The fallback additionalProperties schema.\n\t */\n\tpublic static buildMappedTypeFallbackAdditionalProperties(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.MappedTypeNode,\n\t\tmappedKeys: string[],\n\t\tmappedTypeParameterName: string,\n\t\tsourceObjectSchema?: IJsonSchema\n\t): IJsonSchema | undefined {\n\t\tconst resolvedPropertySchemas = mappedKeys\n\t\t\t.map(mappedKey =>\n\t\t\t\tJsonSchemaBuilder.mapMappedTypePropertySchema(\n\t\t\t\t\tcontext,\n\t\t\t\t\ttypeNode,\n\t\t\t\t\tmappedKey,\n\t\t\t\t\tmappedTypeParameterName,\n\t\t\t\t\tsourceObjectSchema\n\t\t\t\t)\n\t\t\t)\n\t\t\t.filter((mappedType): mappedType is IJsonSchema => mappedType !== 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 * Merge mapped property schemas when multiple source keys remap to the same output key.\n\t * @param existingSchema The existing schema already assigned to the mapped key.\n\t * @param nextSchema The next schema to merge into the mapped key.\n\t * @returns The merged schema.\n\t */\n\tpublic static mergeMappedTypePropertySchemas(\n\t\texistingSchema: IJsonSchema,\n\t\tnextSchema: IJsonSchema\n\t): IJsonSchema {\n\t\tconst schemaVariants = [\n\t\t\t...(existingSchema.anyOf ?? [existingSchema]),\n\t\t\t...(nextSchema.anyOf ?? [nextSchema])\n\t\t];\n\n\t\tconst uniqueSchemas = schemaVariants.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 * Resolve required remapped keys from the source object's required key set.\n\t * @param mappedEntries The source-to-output mapped key entries.\n\t * @param sourceObjectSchema The source object schema containing required keys.\n\t * @returns The required output keys.\n\t */\n\tpublic static resolveMappedTypeSourceRequiredPropertyKeys(\n\t\tmappedEntries: { sourceKey: string; mappedKey: string }[],\n\t\tsourceObjectSchema: IJsonSchema\n\t): string[] | undefined {\n\t\tif (!Is.array<string>(sourceObjectSchema.required)) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst sourceRequiredKeys = new Set(sourceObjectSchema.required);\n\t\tconst remappedRequiredKeys = mappedEntries\n\t\t\t.filter(mappedEntry => sourceRequiredKeys.has(mappedEntry.sourceKey))\n\t\t\t.map(mappedEntry => mappedEntry.mappedKey);\n\n\t\treturn [...new Set(remappedRequiredKeys)];\n\t}\n\n\t/**\n\t * Apply TypeScript intrinsic string remapping helpers to a key.\n\t * @param intrinsicName The intrinsic helper name.\n\t * @param value The input key value.\n\t * @returns The remapped key value.\n\t */\n\tprivate static applyIntrinsicMappedTypeKeyRemap(\n\t\tintrinsicName: string,\n\t\tvalue: string\n\t): string | undefined {\n\t\tswitch (intrinsicName) {\n\t\t\tcase \"Uppercase\":\n\t\t\t\treturn value.toUpperCase();\n\t\t\tcase \"Lowercase\":\n\t\t\t\treturn value.toLowerCase();\n\t\t\tcase \"Capitalize\":\n\t\t\t\treturn value.length > 0 ? `${value[0].toUpperCase()}${value.slice(1)}` : value;\n\t\t\tcase \"Uncapitalize\":\n\t\t\t\treturn value.length > 0 ? `${value[0].toLowerCase()}${value.slice(1)}` : value;\n\t\t\tdefault:\n\t\t\t\treturn undefined;\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"mappedTypeSchemaResolver.js","sourceRoot":"","sources":["../../../src/utils/mappedTypeSchemaResolver.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2026 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { Is, JsonHelper } from \"@twin.org/core\";\nimport type { IJsonSchema } from \"@twin.org/tools-models\";\nimport * as ts from \"typescript\";\nimport { JsonSchemaBuilder } from \"./jsonSchemaBuilder.js\";\nimport type { ITypeScriptToSchemaContext } from \"../models/ITypeScriptToSchemaContext.js\";\n\n/**\n * Static mapped-type schema transformation helpers.\n */\nexport class MappedTypeSchemaResolver {\n\t/**\n\t * Resolve mapped type output keys, including remapped key names via `as`.\n\t * @param context The generation context.\n\t * @param typeNode The mapped type node.\n\t * @param mappedKeys The resolved source keys from the mapped type constraint.\n\t * @param mappedTypeParameterName The mapped type parameter identifier.\n\t * @returns The resolved source-to-output mapped key entries.\n\t */\n\tpublic static resolveMappedTypePropertyEntries(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.MappedTypeNode,\n\t\tmappedKeys: string[],\n\t\tmappedTypeParameterName: string\n\t): { sourceKey: string; mappedKey: string }[] | undefined {\n\t\tif (!typeNode.nameType) {\n\t\t\treturn mappedKeys.map(mappedKey => ({ sourceKey: mappedKey, mappedKey }));\n\t\t}\n\n\t\tconst mappedEntries: { sourceKey: string; mappedKey: string }[] = [];\n\n\t\tfor (const sourceKey of mappedKeys) {\n\t\t\tconst mappedKey = MappedTypeSchemaResolver.resolveMappedTypeRemappedKey(\n\t\t\t\tcontext,\n\t\t\t\ttypeNode.nameType,\n\t\t\t\tsourceKey,\n\t\t\t\tmappedTypeParameterName\n\t\t\t);\n\t\t\tif (mappedKey !== null && !Is.stringValue(mappedKey)) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tif (Is.stringValue(mappedKey)) {\n\t\t\t\tmappedEntries.push({ sourceKey, mappedKey });\n\t\t\t}\n\t\t}\n\n\t\treturn mappedEntries;\n\t}\n\n\t/**\n\t * Resolve a remapped mapped-type key expression for a concrete source key.\n\t * @param context The generation context.\n\t * @param nameTypeNode The mapped type name remapping expression node.\n\t * @param sourceKey The concrete source key currently being evaluated.\n\t * @param mappedTypeParameterName The mapped type parameter identifier.\n\t * @returns The remapped key, null when excluded via never, or undefined when unresolved.\n\t */\n\tpublic static resolveMappedTypeRemappedKey(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tnameTypeNode: ts.TypeNode,\n\t\tsourceKey: string,\n\t\tmappedTypeParameterName: string\n\t): string | null | undefined {\n\t\tif (ts.isParenthesizedTypeNode(nameTypeNode)) {\n\t\t\treturn MappedTypeSchemaResolver.resolveMappedTypeRemappedKey(\n\t\t\t\tcontext,\n\t\t\t\tnameTypeNode.type,\n\t\t\t\tsourceKey,\n\t\t\t\tmappedTypeParameterName\n\t\t\t);\n\t\t}\n\n\t\tif (nameTypeNode.kind === ts.SyntaxKind.NeverKeyword) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (JsonSchemaBuilder.isMappedTypeParameterReference(nameTypeNode, mappedTypeParameterName)) {\n\t\t\treturn sourceKey;\n\t\t}\n\n\t\tif (ts.isLiteralTypeNode(nameTypeNode)) {\n\t\t\tif (ts.isStringLiteral(nameTypeNode.literal) || ts.isNumericLiteral(nameTypeNode.literal)) {\n\t\t\t\treturn nameTypeNode.literal.text;\n\t\t\t}\n\t\t\tif (nameTypeNode.literal.kind === ts.SyntaxKind.TrueKeyword) {\n\t\t\t\treturn \"true\";\n\t\t\t}\n\t\t\tif (nameTypeNode.literal.kind === ts.SyntaxKind.FalseKeyword) {\n\t\t\t\treturn \"false\";\n\t\t\t}\n\t\t}\n\n\t\tif (ts.isIntersectionTypeNode(nameTypeNode)) {\n\t\t\tconst hasMappedKeyReference = nameTypeNode.types.some(type =>\n\t\t\t\tJsonSchemaBuilder.isMappedTypeParameterReference(type, mappedTypeParameterName)\n\t\t\t);\n\t\t\tconst hasStringKeyword = nameTypeNode.types.some(\n\t\t\t\ttype => type.kind === ts.SyntaxKind.StringKeyword\n\t\t\t);\n\t\t\tif (hasMappedKeyReference && hasStringKeyword) {\n\t\t\t\treturn sourceKey;\n\t\t\t}\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (ts.isTemplateLiteralTypeNode(nameTypeNode)) {\n\t\t\tlet remappedKey = nameTypeNode.head.text;\n\t\t\tfor (const span of nameTypeNode.templateSpans) {\n\t\t\t\tconst spanValue = MappedTypeSchemaResolver.resolveMappedTypeRemappedKey(\n\t\t\t\t\tcontext,\n\t\t\t\t\tspan.type,\n\t\t\t\t\tsourceKey,\n\t\t\t\t\tmappedTypeParameterName\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\tremappedKey += `${spanValue}${span.literal.text}`;\n\t\t\t}\n\n\t\t\treturn remappedKey;\n\t\t}\n\n\t\tif (ts.isTypeReferenceNode(nameTypeNode) && ts.isIdentifier(nameTypeNode.typeName)) {\n\t\t\tconst intrinsicName = nameTypeNode.typeName.text;\n\t\t\tif (nameTypeNode.typeArguments?.length === 1) {\n\t\t\t\tconst intrinsicInput = MappedTypeSchemaResolver.resolveMappedTypeRemappedKey(\n\t\t\t\t\tcontext,\n\t\t\t\t\tnameTypeNode.typeArguments[0],\n\t\t\t\t\tsourceKey,\n\t\t\t\t\tmappedTypeParameterName\n\t\t\t\t);\n\t\t\t\tif (!Is.stringValue(intrinsicInput)) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\n\t\t\t\treturn MappedTypeSchemaResolver.applyIntrinsicMappedTypeKeyRemap(\n\t\t\t\t\tintrinsicName,\n\t\t\t\t\tintrinsicInput\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tif (ts.isConditionalTypeNode(nameTypeNode)) {\n\t\t\tif (\n\t\t\t\t!JsonSchemaBuilder.isMappedTypeParameterReference(\n\t\t\t\t\tnameTypeNode.checkType,\n\t\t\t\t\tmappedTypeParameterName\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst satisfies = MappedTypeSchemaResolver.evaluateMappedKeyExtendsCondition(\n\t\t\t\tcontext,\n\t\t\t\tsourceKey,\n\t\t\t\tnameTypeNode.extendsType\n\t\t\t);\n\t\t\tif (satisfies === undefined) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst branchType = satisfies ? nameTypeNode.trueType : nameTypeNode.falseType;\n\t\t\treturn MappedTypeSchemaResolver.resolveMappedTypeRemappedKey(\n\t\t\t\tcontext,\n\t\t\t\tbranchType,\n\t\t\t\tsourceKey,\n\t\t\t\tmappedTypeParameterName\n\t\t\t);\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Evaluate whether a concrete mapped key satisfies an `extends` condition.\n\t * @param context The generation context.\n\t * @param sourceKey The concrete source key being evaluated.\n\t * @param extendsTypeNode The extends condition type node.\n\t * @returns True when the key satisfies the condition, false when it does not, otherwise undefined.\n\t */\n\tpublic static evaluateMappedKeyExtendsCondition(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tsourceKey: string,\n\t\textendsTypeNode: ts.TypeNode\n\t): boolean | undefined {\n\t\tif (ts.isParenthesizedTypeNode(extendsTypeNode)) {\n\t\t\treturn MappedTypeSchemaResolver.evaluateMappedKeyExtendsCondition(\n\t\t\t\tcontext,\n\t\t\t\tsourceKey,\n\t\t\t\textendsTypeNode.type\n\t\t\t);\n\t\t}\n\n\t\tif (\n\t\t\textendsTypeNode.kind === ts.SyntaxKind.StringKeyword ||\n\t\t\textendsTypeNode.kind === ts.SyntaxKind.AnyKeyword ||\n\t\t\textendsTypeNode.kind === ts.SyntaxKind.UnknownKeyword\n\t\t) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (\n\t\t\textendsTypeNode.kind === ts.SyntaxKind.NeverKeyword ||\n\t\t\textendsTypeNode.kind === ts.SyntaxKind.NumberKeyword ||\n\t\t\textendsTypeNode.kind === ts.SyntaxKind.BooleanKeyword ||\n\t\t\textendsTypeNode.kind === ts.SyntaxKind.ObjectKeyword\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (ts.isLiteralTypeNode(extendsTypeNode)) {\n\t\t\tif (\n\t\t\t\tts.isStringLiteral(extendsTypeNode.literal) ||\n\t\t\t\tts.isNumericLiteral(extendsTypeNode.literal)\n\t\t\t) {\n\t\t\t\treturn sourceKey === extendsTypeNode.literal.text;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\tif (ts.isUnionTypeNode(extendsTypeNode)) {\n\t\t\tlet hasUndetermined = false;\n\t\t\tfor (const memberType of extendsTypeNode.types) {\n\t\t\t\tconst result = MappedTypeSchemaResolver.evaluateMappedKeyExtendsCondition(\n\t\t\t\t\tcontext,\n\t\t\t\t\tsourceKey,\n\t\t\t\t\tmemberType\n\t\t\t\t);\n\t\t\t\tif (result === true) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (result === undefined) {\n\t\t\t\t\thasUndetermined = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn hasUndetermined ? undefined : false;\n\t\t}\n\n\t\tif (\n\t\t\tts.isTypeOperatorNode(extendsTypeNode) &&\n\t\t\textendsTypeNode.operator === ts.SyntaxKind.KeyOfKeyword\n\t\t) {\n\t\t\tconst keys = JsonSchemaBuilder.extractKeyofTypeKeys(context, extendsTypeNode.type);\n\t\t\tif (keys.length > 0) {\n\t\t\t\treturn keys.includes(sourceKey);\n\t\t\t}\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (ts.isTypeReferenceNode(extendsTypeNode)) {\n\t\t\tconst resolved = JsonSchemaBuilder.resolveReferencedTypeNodeFromLocalDeclaration(\n\t\t\t\tcontext,\n\t\t\t\textendsTypeNode\n\t\t\t);\n\t\t\tif (resolved) {\n\t\t\t\treturn MappedTypeSchemaResolver.evaluateMappedKeyExtendsCondition(\n\t\t\t\t\tcontext,\n\t\t\t\t\tsourceKey,\n\t\t\t\t\tresolved\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Build a conservative fallback schema for mapped types whose key remapping cannot be resolved.\n\t * @param context The generation context.\n\t * @param typeNode The mapped type node.\n\t * @param mappedKeys The resolved source keys from the mapped type constraint.\n\t * @param mappedTypeParameterName The mapped type parameter identifier.\n\t * @param sourceObjectSchema The optional source object schema for property lookups.\n\t * @returns The fallback mapped type schema.\n\t */\n\tpublic static buildMappedTypeFallbackSchema(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.MappedTypeNode,\n\t\tmappedKeys: string[],\n\t\tmappedTypeParameterName: string,\n\t\tsourceObjectSchema?: IJsonSchema\n\t): IJsonSchema {\n\t\tconst additionalProperties =\n\t\t\tMappedTypeSchemaResolver.buildMappedTypeFallbackAdditionalProperties(\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\n\t\treturn {\n\t\t\ttype: \"object\",\n\t\t\tadditionalProperties: additionalProperties ?? {}\n\t\t};\n\t}\n\n\t/**\n\t * Build fallback additionalProperties for unresolved mapped key remapping.\n\t * @param context The generation context.\n\t * @param typeNode The mapped type node.\n\t * @param mappedKeys The resolved source keys from the mapped type constraint.\n\t * @param mappedTypeParameterName The mapped type parameter identifier.\n\t * @param sourceObjectSchema The optional source object schema for property lookups.\n\t * @returns The fallback additionalProperties schema.\n\t */\n\tpublic static buildMappedTypeFallbackAdditionalProperties(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.MappedTypeNode,\n\t\tmappedKeys: string[],\n\t\tmappedTypeParameterName: string,\n\t\tsourceObjectSchema?: IJsonSchema\n\t): IJsonSchema | undefined {\n\t\tconst resolvedPropertySchemas = mappedKeys\n\t\t\t.map(mappedKey =>\n\t\t\t\tJsonSchemaBuilder.mapMappedTypePropertySchema(\n\t\t\t\t\tcontext,\n\t\t\t\t\ttypeNode,\n\t\t\t\t\tmappedKey,\n\t\t\t\t\tmappedTypeParameterName,\n\t\t\t\t\tsourceObjectSchema\n\t\t\t\t)\n\t\t\t)\n\t\t\t.filter((mappedType): mappedType is IJsonSchema => mappedType !== 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 * Merge mapped property schemas when multiple source keys remap to the same output key.\n\t * @param existingSchema The existing schema already assigned to the mapped key.\n\t * @param nextSchema The next schema to merge into the mapped key.\n\t * @returns The merged schema.\n\t */\n\tpublic static mergeMappedTypePropertySchemas(\n\t\texistingSchema: IJsonSchema,\n\t\tnextSchema: IJsonSchema\n\t): IJsonSchema {\n\t\tconst schemaVariants = [\n\t\t\t...(existingSchema.anyOf ?? [existingSchema]),\n\t\t\t...(nextSchema.anyOf ?? [nextSchema])\n\t\t];\n\n\t\tconst uniqueSchemas = schemaVariants.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 * Resolve required remapped keys from the source object's required key set.\n\t * @param mappedEntries The source-to-output mapped key entries.\n\t * @param sourceObjectSchema The source object schema containing required keys.\n\t * @returns The required output keys.\n\t */\n\tpublic static resolveMappedTypeSourceRequiredPropertyKeys(\n\t\tmappedEntries: { sourceKey: string; mappedKey: string }[],\n\t\tsourceObjectSchema: IJsonSchema\n\t): string[] | undefined {\n\t\tif (!Is.array<string>(sourceObjectSchema.required)) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst sourceRequiredKeys = new Set(sourceObjectSchema.required);\n\t\tconst remappedRequiredKeys = mappedEntries\n\t\t\t.filter(mappedEntry => sourceRequiredKeys.has(mappedEntry.sourceKey))\n\t\t\t.map(mappedEntry => mappedEntry.mappedKey);\n\n\t\treturn [...new Set(remappedRequiredKeys)];\n\t}\n\n\t/**\n\t * Apply TypeScript intrinsic string remapping helpers to a key.\n\t * @param intrinsicName The intrinsic helper name.\n\t * @param value The input key value.\n\t * @returns The remapped key value.\n\t * @internal\n\t */\n\tprivate static applyIntrinsicMappedTypeKeyRemap(\n\t\tintrinsicName: string,\n\t\tvalue: string\n\t): string | undefined {\n\t\tswitch (intrinsicName) {\n\t\t\tcase \"Uppercase\":\n\t\t\t\treturn value.toUpperCase();\n\t\t\tcase \"Lowercase\":\n\t\t\t\treturn value.toLowerCase();\n\t\t\tcase \"Capitalize\":\n\t\t\t\treturn value.length > 0 ? `${value[0].toUpperCase()}${value.slice(1)}` : value;\n\t\t\tcase \"Uncapitalize\":\n\t\t\t\treturn value.length > 0 ? `${value[0].toLowerCase()}${value.slice(1)}` : value;\n\t\t\tdefault:\n\t\t\t\treturn undefined;\n\t\t}\n\t}\n}\n"]}
@@ -43,7 +43,7 @@ export class RegEx {
43
43
  }
44
44
  /**
45
45
  * Determine if a mapping pattern is a regex literal surrounded by forward slashes.
46
- * Example pattern: /^foo.*bar$/
46
+ * Example pattern: /^foo.*bar$/.
47
47
  * @param pattern The mapping pattern.
48
48
  * @returns True if the pattern looks like a regex literal.
49
49
  * @internal
@@ -1 +1 @@
1
- {"version":3,"file":"regEx.js","sourceRoot":"","sources":["../../../src/utils/regEx.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2026 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\n\n/**\n * Utility methods for pattern matching and regex construction.\n */\nexport class RegEx {\n\t/**\n\t * Determine whether a reference mapping pattern matches an external reference.\n\t * @param pattern The mapping pattern.\n\t * @param packageName The external package name.\n\t * @param typeName The imported type name.\n\t * @param schemaTitle The derived schema title.\n\t * @returns True if matched.\n\t */\n\tpublic static isReferencePatternMatch(\n\t\tpattern: string,\n\t\tpackageName: string,\n\t\ttypeName: string,\n\t\tschemaTitle: string\n\t): boolean {\n\t\tconst regex = RegEx.toRegexFromReferencePattern(pattern);\n\t\treturn regex\n\t\t\t? regex.test(packageName) || regex.test(typeName) || regex.test(schemaTitle)\n\t\t\t: false;\n\t}\n\n\t/**\n\t * Apply a reference mapping replacement to the first matching candidate.\n\t * @param pattern The mapping pattern.\n\t * @param replacement The replacement template.\n\t * @param packageName The external package name.\n\t * @param typeName The imported type name.\n\t * @param schemaTitle The derived schema title.\n\t * @returns The replaced value if a candidate matches.\n\t */\n\tpublic static applyReferencePatternReplacement(\n\t\tpattern: string,\n\t\treplacement: string,\n\t\tpackageName: string,\n\t\ttypeName: string,\n\t\tschemaTitle: string\n\t): string | undefined {\n\t\tconst regex = RegEx.toRegexFromReferencePattern(pattern);\n\t\tif (!regex) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tfor (const candidate of [packageName, typeName, schemaTitle]) {\n\t\t\tregex.lastIndex = 0;\n\t\t\tif (regex.test(candidate)) {\n\t\t\t\tregex.lastIndex = 0;\n\t\t\t\treturn candidate.replace(regex, replacement);\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Determine if a mapping pattern is a regex literal surrounded by forward slashes.\n\t * Example pattern: /^foo.*bar$/\n\t * @param pattern The mapping pattern.\n\t * @returns True if the pattern looks like a regex literal.\n\t * @internal\n\t */\n\tprivate static isRegexLiteralPattern(pattern: string): boolean {\n\t\treturn pattern.length > 2 && pattern.startsWith(\"/\") && pattern.endsWith(\"/\");\n\t}\n\n\t/**\n\t * Determine if a mapping pattern should be treated as a raw regex expression.\n\t * Any pattern that contains at least one regex meta character is treated as a raw expression.\n\t * @param pattern The mapping pattern.\n\t * @returns True if the pattern contains regex syntax.\n\t * @internal\n\t */\n\tprivate static isRegexExpressionPattern(pattern: string): boolean {\n\t\treturn /[()[\\]{}+?|^$\\\\]/u.test(pattern);\n\t}\n\n\t/**\n\t * Convert a regex literal mapping pattern to a RegExp.\n\t * The surrounding forward slashes are stripped before compiling.\n\t * @param pattern The regex literal pattern, e.g. /^foo.*bar$/\n\t * @returns The RegExp instance, or undefined when the inner expression is invalid.\n\t * @internal\n\t */\n\tprivate static toRegexFromLiteralPattern(pattern: string): RegExp | undefined {\n\t\ttry {\n\t\t\treturn new RegExp(pattern.slice(1, -1));\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\t/**\n\t * Convert a raw regex expression mapping pattern to a RegExp anchored to full-string match.\n\t * The expression is wrapped with ^ and $ so that partial matches are not accepted.\n\t * @param pattern The raw regex expression.\n\t * @returns The RegExp instance, or undefined when the expression is invalid.\n\t * @internal\n\t */\n\tprivate static toRegexFromExpressionPattern(pattern: string): RegExp | undefined {\n\t\ttry {\n\t\t\treturn new RegExp(`^${pattern}$`);\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\t/**\n\t * Select and compile the appropriate RegExp for a reference mapping pattern.\n\t * Evaluation order: regex literal -> raw regex expression -> wildcard glob.\n\t * Plain strings with none of these characteristics return undefined.\n\t * @param pattern The mapping pattern.\n\t * @returns The RegExp instance, or undefined when the pattern is not pattern-based.\n\t * @internal\n\t */\n\tprivate static toRegexFromReferencePattern(pattern: string): RegExp | undefined {\n\t\tif (RegEx.isRegexLiteralPattern(pattern)) {\n\t\t\treturn RegEx.toRegexFromLiteralPattern(pattern);\n\t\t}\n\n\t\tif (RegEx.isRegexExpressionPattern(pattern)) {\n\t\t\treturn RegEx.toRegexFromExpressionPattern(pattern);\n\t\t}\n\n\t\tif (pattern.includes(\"*\")) {\n\t\t\treturn RegEx.toRegexFromWildcardPattern(pattern);\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Convert a glob wildcard pattern to a RegExp.\n\t * All regex metacharacters in the pattern are escaped first, then each * is replaced with .*.\n\t * The resulting expression is anchored with ^ and $ for full-string matching.\n\t * @param pattern The wildcard pattern, e.g. *Operation or @twin.org/*.\n\t * @returns The compiled RegExp.\n\t * @internal\n\t */\n\tprivate static toRegexFromWildcardPattern(pattern: string): RegExp {\n\t\tconst escapedPattern = pattern.replace(/[$()+./?[\\\\\\]^{|}-]/g, \"\\\\$&\");\n\t\tconst regexPattern = `^${escapedPattern.replace(/\\*/g, \".*\")}$`;\n\t\treturn new RegExp(regexPattern);\n\t}\n}\n"]}
1
+ {"version":3,"file":"regEx.js","sourceRoot":"","sources":["../../../src/utils/regEx.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2026 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\n\n/**\n * Utility methods for pattern matching and regex construction.\n */\nexport class RegEx {\n\t/**\n\t * Determine whether a reference mapping pattern matches an external reference.\n\t * @param pattern The mapping pattern.\n\t * @param packageName The external package name.\n\t * @param typeName The imported type name.\n\t * @param schemaTitle The derived schema title.\n\t * @returns True if matched.\n\t */\n\tpublic static isReferencePatternMatch(\n\t\tpattern: string,\n\t\tpackageName: string,\n\t\ttypeName: string,\n\t\tschemaTitle: string\n\t): boolean {\n\t\tconst regex = RegEx.toRegexFromReferencePattern(pattern);\n\t\treturn regex\n\t\t\t? regex.test(packageName) || regex.test(typeName) || regex.test(schemaTitle)\n\t\t\t: false;\n\t}\n\n\t/**\n\t * Apply a reference mapping replacement to the first matching candidate.\n\t * @param pattern The mapping pattern.\n\t * @param replacement The replacement template.\n\t * @param packageName The external package name.\n\t * @param typeName The imported type name.\n\t * @param schemaTitle The derived schema title.\n\t * @returns The replaced value if a candidate matches.\n\t */\n\tpublic static applyReferencePatternReplacement(\n\t\tpattern: string,\n\t\treplacement: string,\n\t\tpackageName: string,\n\t\ttypeName: string,\n\t\tschemaTitle: string\n\t): string | undefined {\n\t\tconst regex = RegEx.toRegexFromReferencePattern(pattern);\n\t\tif (!regex) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tfor (const candidate of [packageName, typeName, schemaTitle]) {\n\t\t\tregex.lastIndex = 0;\n\t\t\tif (regex.test(candidate)) {\n\t\t\t\tregex.lastIndex = 0;\n\t\t\t\treturn candidate.replace(regex, replacement);\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Determine if a mapping pattern is a regex literal surrounded by forward slashes.\n\t * Example pattern: /^foo.*bar$/.\n\t * @param pattern The mapping pattern.\n\t * @returns True if the pattern looks like a regex literal.\n\t * @internal\n\t */\n\tprivate static isRegexLiteralPattern(pattern: string): boolean {\n\t\treturn pattern.length > 2 && pattern.startsWith(\"/\") && pattern.endsWith(\"/\");\n\t}\n\n\t/**\n\t * Determine if a mapping pattern should be treated as a raw regex expression.\n\t * Any pattern that contains at least one regex meta character is treated as a raw expression.\n\t * @param pattern The mapping pattern.\n\t * @returns True if the pattern contains regex syntax.\n\t * @internal\n\t */\n\tprivate static isRegexExpressionPattern(pattern: string): boolean {\n\t\treturn /[()[\\]{}+?|^$\\\\]/u.test(pattern);\n\t}\n\n\t/**\n\t * Convert a regex literal mapping pattern to a RegExp.\n\t * The surrounding forward slashes are stripped before compiling.\n\t * @param pattern The regex literal pattern, e.g. /^foo.*bar$/\n\t * @returns The RegExp instance, or undefined when the inner expression is invalid.\n\t * @internal\n\t */\n\tprivate static toRegexFromLiteralPattern(pattern: string): RegExp | undefined {\n\t\ttry {\n\t\t\treturn new RegExp(pattern.slice(1, -1));\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\t/**\n\t * Convert a raw regex expression mapping pattern to a RegExp anchored to full-string match.\n\t * The expression is wrapped with ^ and $ so that partial matches are not accepted.\n\t * @param pattern The raw regex expression.\n\t * @returns The RegExp instance, or undefined when the expression is invalid.\n\t * @internal\n\t */\n\tprivate static toRegexFromExpressionPattern(pattern: string): RegExp | undefined {\n\t\ttry {\n\t\t\treturn new RegExp(`^${pattern}$`);\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\t/**\n\t * Select and compile the appropriate RegExp for a reference mapping pattern.\n\t * Evaluation order: regex literal -> raw regex expression -> wildcard glob.\n\t * Plain strings with none of these characteristics return undefined.\n\t * @param pattern The mapping pattern.\n\t * @returns The RegExp instance, or undefined when the pattern is not pattern-based.\n\t * @internal\n\t */\n\tprivate static toRegexFromReferencePattern(pattern: string): RegExp | undefined {\n\t\tif (RegEx.isRegexLiteralPattern(pattern)) {\n\t\t\treturn RegEx.toRegexFromLiteralPattern(pattern);\n\t\t}\n\n\t\tif (RegEx.isRegexExpressionPattern(pattern)) {\n\t\t\treturn RegEx.toRegexFromExpressionPattern(pattern);\n\t\t}\n\n\t\tif (pattern.includes(\"*\")) {\n\t\t\treturn RegEx.toRegexFromWildcardPattern(pattern);\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Convert a glob wildcard pattern to a RegExp.\n\t * All regex metacharacters in the pattern are escaped first, then each * is replaced with .*.\n\t * The resulting expression is anchored with ^ and $ for full-string matching.\n\t * @param pattern The wildcard pattern, e.g. *Operation or @twin.org/*.\n\t * @returns The compiled RegExp.\n\t * @internal\n\t */\n\tprivate static toRegexFromWildcardPattern(pattern: string): RegExp {\n\t\tconst escapedPattern = pattern.replace(/[$()+./?[\\\\\\]^{|}-]/g, \"\\\\$&\");\n\t\tconst regexPattern = `^${escapedPattern.replace(/\\*/g, \".*\")}$`;\n\t\treturn new RegExp(regexPattern);\n\t}\n}\n"]}
@@ -106,6 +106,7 @@ export class TypeScriptToSchema {
106
106
  * @param context The generation context.
107
107
  * @param schema The root schema to rewrite.
108
108
  * @param rootTitle The title of the root schema.
109
+ * @internal
109
110
  */
110
111
  inlineEmbeddedSchemas(context, schema, rootTitle) {
111
112
  this.inlineEmbeddedSchemasInNode(context, schema, schema, rootTitle, new Set([rootTitle]));
@@ -118,6 +119,7 @@ export class TypeScriptToSchema {
118
119
  * @param rootTitle The title of the root schema.
119
120
  * @param ancestry Titles currently being expanded to avoid recursion cycles.
120
121
  * @returns True if inline embedding changed this node or a descendant.
122
+ * @internal
121
123
  */
122
124
  inlineEmbeddedSchemasInNode(context, rootSchema, currentNode, rootTitle, ancestry) {
123
125
  let hasInlineReplacement = false;
@@ -173,6 +175,7 @@ export class TypeScriptToSchema {
173
175
  /**
174
176
  * Flatten inline-expanded object allOf branches into the containing schema.
175
177
  * @param schema The schema to flatten.
178
+ * @internal
176
179
  */
177
180
  flattenInlineAllOfBranches(schema) {
178
181
  if (!Is.array(schema.allOf) || schema.allOf.length === 0) {
@@ -221,6 +224,7 @@ export class TypeScriptToSchema {
221
224
  * Determine whether an allOf branch can be flattened into its parent after inline embedding.
222
225
  * @param branch The allOf branch.
223
226
  * @returns True if the branch is a plain object schema.
227
+ * @internal
224
228
  */
225
229
  canFlattenInlineAllOfBranch(branch) {
226
230
  return Boolean(!branch.$ref &&
@@ -236,6 +240,7 @@ export class TypeScriptToSchema {
236
240
  * @param embeddedSchema The source schema.
237
241
  * @param embeddedMode The embedding mode.
238
242
  * @returns The cloned schema.
243
+ * @internal
239
244
  */
240
245
  createEmbeddedSchemaClone(context, embeddedSchema, embeddedMode) {
241
246
  let embeddedClone = ObjectHelper.clone(embeddedSchema);
@@ -254,6 +259,7 @@ export class TypeScriptToSchema {
254
259
  * Replace the contents of a schema node while keeping the same object reference.
255
260
  * @param target The schema node to mutate.
256
261
  * @param replacement The replacement content.
262
+ * @internal
257
263
  */
258
264
  replaceSchemaNode(target, replacement) {
259
265
  for (const key of Object.keys(target)) {
@@ -266,6 +272,7 @@ export class TypeScriptToSchema {
266
272
  * @param context The generation context.
267
273
  * @param schemaId The schema id to locate.
268
274
  * @returns The schema when found.
275
+ * @internal
269
276
  */
270
277
  findSchemaById(context, schemaId) {
271
278
  return Object.values(context.schemas)
@@ -277,6 +284,7 @@ export class TypeScriptToSchema {
277
284
  * @param schema The embedded schema.
278
285
  * @param schemaId The canonical schema id.
279
286
  * @returns The local definition key.
287
+ * @internal
280
288
  */
281
289
  getEmbeddedDefinitionKey(schema, schemaId) {
282
290
  return schema.title ?? schemaId.split("/").pop() ?? schemaId;
@@ -284,6 +292,7 @@ export class TypeScriptToSchema {
284
292
  /**
285
293
  * Remove $comment fields from a schema tree.
286
294
  * @param schema The schema tree to clean.
295
+ * @internal
287
296
  */
288
297
  removeSchemaComments(schema) {
289
298
  delete schema.$comment;
@@ -1 +1 @@
1
- {"version":3,"file":"typeScriptToSchema.js","sourceRoot":"","sources":["../../../src/utils/typeScriptToSchema.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2026 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { Is, ObjectHelper, StringHelper } from \"@twin.org/core\";\nimport type { IJsonSchema } from \"@twin.org/tools-models\";\nimport { FileUtils } from \"./fileUtils.js\";\nimport { JsonSchemaBuilder } from \"./jsonSchemaBuilder.js\";\nimport { Resolver } from \"./resolver.js\";\nimport { EmbeddedSchemaMode } from \"../models/embeddedSchemaMode.js\";\nimport type { ITypeScriptToSchemaContext } from \"../models/ITypeScriptToSchemaContext.js\";\nimport type { ITypeScriptToSchemaOptions } from \"../models/ITypeScriptToSchemaOptions.js\";\n\n/**\n * Class for converting TypeScript types to JSON Schema.\n */\nexport class TypeScriptToSchema {\n\t/**\n\t * Generates a JSON schema from a TypeScript source file or type name.\n\t * @param namespace The schema namespace.\n\t * @param packageName The package name.\n\t * @param schemas The package schema map.\n\t * @param sourceFileOrTypeName The source file to process or type name to resolve.\n\t * @param options Additional generation options.\n\t * @returns The generated JSON schemas indexed by title.\n\t */\n\tpublic async generateSchema(\n\t\tnamespace: string,\n\t\tpackageName: string,\n\t\tschemas: { [id: string]: { [id: string]: IJsonSchema } },\n\t\tsourceFileOrTypeName: string,\n\t\toptions?: ITypeScriptToSchemaOptions\n\t): Promise<{ [id: string]: IJsonSchema }> {\n\t\tconst suppressPackageWarnings = (options?.suppressPackageWarnings ?? [])\n\t\t\t.filter(packageNameToSkip => Is.stringValue(packageNameToSkip))\n\t\t\t.map(packageNameToSkip => packageNameToSkip.toLowerCase());\n\t\tconst filteredOptions: ITypeScriptToSchemaOptions = {\n\t\t\t...options,\n\t\t\tonDiagnostic: diagnostic => {\n\t\t\t\tif (\n\t\t\t\t\tsuppressPackageWarnings.some(packageToSkip =>\n\t\t\t\t\t\tthis.isDiagnosticFromPackage(diagnostic.path, diagnostic.fileName, packageToSkip)\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\toptions?.onDiagnostic?.(diagnostic);\n\t\t\t}\n\t\t};\n\n\t\tconst context: ITypeScriptToSchemaContext = {\n\t\t\tnamespace,\n\t\t\tpackageName,\n\t\t\tschemas,\n\t\t\toptions: filteredOptions\n\t\t};\n\n\t\tlet generatedTitles: string[] = [];\n\t\tcontext.schemas[context.packageName] ??= {};\n\t\tconst visitedFiles: string[] = [];\n\t\tconst sourceFiles = FileUtils.resolveSourceFiles(sourceFileOrTypeName);\n\n\t\tif (sourceFiles.length > 0) {\n\t\t\tfor (const sourceFilePath of sourceFiles) {\n\t\t\t\tconst source = FileUtils.readFile(sourceFilePath);\n\t\t\t\tif (source) {\n\t\t\t\t\tconst parsedTitles = JsonSchemaBuilder.parseAllObjectSchemas(\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t\tsourceFilePath,\n\t\t\t\t\t\tsource,\n\t\t\t\t\t\tvisitedFiles\n\t\t\t\t\t);\n\t\t\t\t\tfor (const parsedTitle of parsedTitles) {\n\t\t\t\t\t\tif (!generatedTitles.includes(parsedTitle)) {\n\t\t\t\t\t\t\tgeneratedTitles.push(parsedTitle);\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} else if (this.isTypeNameInput(sourceFileOrTypeName)) {\n\t\t\tconst declarationResult = Resolver.resolveTypeDeclarationAst(\n\t\t\t\tcontext.packageName,\n\t\t\t\tsourceFileOrTypeName\n\t\t\t);\n\t\t\tif (declarationResult) {\n\t\t\t\tgeneratedTitles = JsonSchemaBuilder.parseAllObjectSchemas(\n\t\t\t\t\tcontext,\n\t\t\t\t\tdeclarationResult.sourceFile.fileName,\n\t\t\t\t\tdeclarationResult.sourceFile.getFullText(),\n\t\t\t\t\tvisitedFiles\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\treturn {};\n\t\t}\n\n\t\tconst generatedSchemas: { [id: string]: IJsonSchema } = {};\n\t\tfor (const generatedTitle of generatedTitles) {\n\t\t\tconst generatedSchema = context.schemas[context.packageName][generatedTitle];\n\t\t\tif (generatedSchema) {\n\t\t\t\tgeneratedSchemas[generatedTitle] = generatedSchema;\n\t\t\t}\n\t\t}\n\n\t\tif (this.isTypeNameInput(sourceFileOrTypeName)) {\n\t\t\tconst requestedTitle = StringHelper.stripPrefix(sourceFileOrTypeName);\n\t\t\tconst requestedSchema = context.schemas[context.packageName][requestedTitle];\n\t\t\tif (requestedSchema) {\n\t\t\t\tgeneratedSchemas[requestedTitle] = requestedSchema;\n\t\t\t}\n\t\t}\n\n\t\tfor (const [generatedTitle, generatedSchema] of Object.entries(generatedSchemas)) {\n\t\t\tthis.inlineEmbeddedSchemas(context, generatedSchema, generatedTitle);\n\t\t}\n\n\t\treturn generatedSchemas;\n\t}\n\n\t/**\n\t * Determine if a diagnostic originates from a specific package.\n\t * @param path The schema or source path associated with the diagnostic.\n\t * @param fileName The source filename associated with the diagnostic.\n\t * @param packageName The package name to check, e.g. jose.\n\t * @returns True if the diagnostic originated from the package.\n\t */\n\tpublic isDiagnosticFromPackage(\n\t\tpath: string,\n\t\tfileName: string | undefined,\n\t\tpackageName: string\n\t): boolean {\n\t\tif (!Is.stringValue(packageName)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst sourcePaths = [fileName, path]\n\t\t\t.filter((value): value is string => Is.stringValue(value))\n\t\t\t.map(value => value.replace(/\\\\/g, \"/\").toLowerCase());\n\t\tconst normalisedPackageName = packageName.toLowerCase();\n\t\tconst packagePath = `/node_modules/${normalisedPackageName}/`;\n\t\tconst packagePathNoTrailingSlash = `/node_modules/${normalisedPackageName}`;\n\n\t\treturn sourcePaths.some(\n\t\t\tsourcePath =>\n\t\t\t\tsourcePath.includes(packagePath) || sourcePath.endsWith(packagePathNoTrailingSlash)\n\t\t);\n\t}\n\n\t/**\n\t * Rewrite refs to @json-schema embedded local types into the current schema's $defs.\n\t * @param context The generation context.\n\t * @param schema The root schema to rewrite.\n\t * @param rootTitle The title of the root schema.\n\t */\n\tprivate inlineEmbeddedSchemas(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tschema: IJsonSchema,\n\t\trootTitle: string\n\t): void {\n\t\tthis.inlineEmbeddedSchemasInNode(context, schema, schema, rootTitle, new Set([rootTitle]));\n\t}\n\n\t/**\n\t * Traverse a schema tree and move embedded local refs into the root schema's $defs.\n\t * @param context The generation context.\n\t * @param rootSchema The root schema document being rewritten.\n\t * @param currentNode The current schema node.\n\t * @param rootTitle The title of the root schema.\n\t * @param ancestry Titles currently being expanded to avoid recursion cycles.\n\t * @returns True if inline embedding changed this node or a descendant.\n\t */\n\tprivate inlineEmbeddedSchemasInNode(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\trootSchema: IJsonSchema,\n\t\tcurrentNode: IJsonSchema,\n\t\trootTitle: string,\n\t\tancestry: Set<string>\n\t): boolean {\n\t\tlet hasInlineReplacement = false;\n\n\t\tif (Is.stringValue(currentNode.$ref)) {\n\t\t\tconst refId = currentNode.$ref;\n\t\t\tconst embeddedMode = context.embeddedSchemaModes?.[refId];\n\t\t\tconst embeddedSchema = this.findSchemaById(context, refId);\n\t\t\tconst defsKey = embeddedSchema\n\t\t\t\t? this.getEmbeddedDefinitionKey(embeddedSchema, refId)\n\t\t\t\t: undefined;\n\n\t\t\tif (\n\t\t\t\tembeddedMode &&\n\t\t\t\tembeddedSchema &&\n\t\t\t\tdefsKey &&\n\t\t\t\tdefsKey !== rootTitle &&\n\t\t\t\t!ancestry.has(defsKey)\n\t\t\t) {\n\t\t\t\tconst embeddedClone = this.createEmbeddedSchemaClone(context, embeddedSchema, embeddedMode);\n\t\t\t\tthis.inlineEmbeddedSchemasInNode(\n\t\t\t\t\tcontext,\n\t\t\t\t\trootSchema,\n\t\t\t\t\tembeddedClone,\n\t\t\t\t\trootTitle,\n\t\t\t\t\tnew Set([...ancestry, defsKey])\n\t\t\t\t);\n\n\t\t\t\tif (embeddedMode === EmbeddedSchemaMode.Defs) {\n\t\t\t\t\trootSchema.$defs ??= {};\n\t\t\t\t\trootSchema.$defs[defsKey] ??= embeddedClone;\n\t\t\t\t\tcurrentNode.$ref = `#/$defs/${defsKey}`;\n\t\t\t\t} else {\n\t\t\t\t\tthis.replaceSchemaNode(currentNode, embeddedClone);\n\t\t\t\t\thasInlineReplacement = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const value of Object.values(currentNode)) {\n\t\t\tif (Is.array(value)) {\n\t\t\t\tfor (const item of value) {\n\t\t\t\t\tif (Is.object<IJsonSchema>(item)) {\n\t\t\t\t\t\thasInlineReplacement =\n\t\t\t\t\t\t\tthis.inlineEmbeddedSchemasInNode(context, rootSchema, item, rootTitle, ancestry) ||\n\t\t\t\t\t\t\thasInlineReplacement;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (Is.object<{ [id: string]: unknown }>(value)) {\n\t\t\t\tfor (const nestedValue of Object.values(value)) {\n\t\t\t\t\tif (Is.object<IJsonSchema>(nestedValue)) {\n\t\t\t\t\t\thasInlineReplacement =\n\t\t\t\t\t\t\tthis.inlineEmbeddedSchemasInNode(\n\t\t\t\t\t\t\t\tcontext,\n\t\t\t\t\t\t\t\trootSchema,\n\t\t\t\t\t\t\t\tnestedValue,\n\t\t\t\t\t\t\t\trootTitle,\n\t\t\t\t\t\t\t\tancestry\n\t\t\t\t\t\t\t) || hasInlineReplacement;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (hasInlineReplacement) {\n\t\t\tthis.flattenInlineAllOfBranches(currentNode);\n\t\t}\n\n\t\treturn hasInlineReplacement;\n\t}\n\n\t/**\n\t * Flatten inline-expanded object allOf branches into the containing schema.\n\t * @param schema The schema to flatten.\n\t */\n\tprivate flattenInlineAllOfBranches(schema: IJsonSchema): void {\n\t\tif (!Is.array(schema.allOf) || schema.allOf.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst remainingBranches: IJsonSchema[] = [];\n\t\tconst mergedProperties: { [id: string]: IJsonSchema } = {};\n\t\tconst mergedRequired = new Set<string>(\n\t\t\t(Is.array(schema.required) ? schema.required : []).filter(\n\t\t\t\t(requiredKey): requiredKey is string => Is.stringValue(requiredKey)\n\t\t\t)\n\t\t);\n\t\tlet hasMergedBranch = false;\n\n\t\tfor (const branch of schema.allOf) {\n\t\t\tif (this.canFlattenInlineAllOfBranch(branch)) {\n\t\t\t\thasMergedBranch = true;\n\t\t\t\tschema.type ??= \"object\";\n\t\t\t\tif (Is.object(branch.properties)) {\n\t\t\t\t\tObject.assign(mergedProperties, branch.properties);\n\t\t\t\t}\n\t\t\t\tif (Is.array(branch.required)) {\n\t\t\t\t\tfor (const requiredKey of branch.required) {\n\t\t\t\t\t\tif (Is.stringValue(requiredKey)) {\n\t\t\t\t\t\t\tmergedRequired.add(requiredKey);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tremainingBranches.push(branch);\n\t\t\t}\n\t\t}\n\n\t\tif (!hasMergedBranch) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (Object.keys(mergedProperties).length > 0) {\n\t\t\tschema.properties = Object.assign(schema.properties ?? {}, mergedProperties);\n\t\t}\n\n\t\tif (mergedRequired.size > 0) {\n\t\t\tschema.required = [...mergedRequired];\n\t\t}\n\n\t\tif (remainingBranches.length > 0) {\n\t\t\tschema.allOf = remainingBranches;\n\t\t} else {\n\t\t\tdelete schema.allOf;\n\t\t}\n\t}\n\n\t/**\n\t * Determine whether an allOf branch can be flattened into its parent after inline embedding.\n\t * @param branch The allOf branch.\n\t * @returns True if the branch is a plain object schema.\n\t */\n\tprivate canFlattenInlineAllOfBranch(branch: IJsonSchema): boolean {\n\t\treturn Boolean(\n\t\t\t!branch.$ref &&\n\t\t\t!branch.allOf &&\n\t\t\t!branch.anyOf &&\n\t\t\t!branch.oneOf &&\n\t\t\t!branch.items &&\n\t\t\t(branch.type === \"object\" || Is.object(branch.properties) || Is.array(branch.required))\n\t\t);\n\t}\n\n\t/**\n\t * Create a clone of an embedded schema suitable for defs or inline expansion.\n\t * @param context The generation context.\n\t * @param embeddedSchema The source schema.\n\t * @param embeddedMode The embedding mode.\n\t * @returns The cloned schema.\n\t */\n\tprivate createEmbeddedSchemaClone(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tembeddedSchema: IJsonSchema,\n\t\tembeddedMode: EmbeddedSchemaMode\n\t): IJsonSchema {\n\t\tlet embeddedClone = ObjectHelper.clone(embeddedSchema);\n\t\tif (embeddedMode === EmbeddedSchemaMode.Inline) {\n\t\t\tembeddedClone = JsonSchemaBuilder.expandAllOfReferences(context, embeddedClone);\n\t\t\tthis.removeSchemaComments(embeddedClone);\n\t\t}\n\t\tdelete embeddedClone.$schema;\n\t\tdelete embeddedClone.$id;\n\t\tif (embeddedMode === EmbeddedSchemaMode.Inline) {\n\t\t\tdelete embeddedClone.title;\n\t\t}\n\n\t\treturn embeddedClone;\n\t}\n\n\t/**\n\t * Replace the contents of a schema node while keeping the same object reference.\n\t * @param target The schema node to mutate.\n\t * @param replacement The replacement content.\n\t */\n\tprivate replaceSchemaNode(target: IJsonSchema, replacement: IJsonSchema): void {\n\t\tfor (const key of Object.keys(target)) {\n\t\t\tdelete target[key as keyof IJsonSchema];\n\t\t}\n\n\t\tObject.assign(target, replacement);\n\t}\n\n\t/**\n\t * Find a generated schema by its canonical id across all loaded packages.\n\t * @param context The generation context.\n\t * @param schemaId The schema id to locate.\n\t * @returns The schema when found.\n\t */\n\tprivate findSchemaById(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tschemaId: string\n\t): IJsonSchema | undefined {\n\t\treturn Object.values(context.schemas)\n\t\t\t.flatMap(packageSchemas => Object.values(packageSchemas))\n\t\t\t.find(schema => schema.$id === schemaId);\n\t}\n\n\t/**\n\t * Resolve the local $defs key to use for an embedded schema.\n\t * @param schema The embedded schema.\n\t * @param schemaId The canonical schema id.\n\t * @returns The local definition key.\n\t */\n\tprivate getEmbeddedDefinitionKey(schema: IJsonSchema, schemaId: string): string {\n\t\treturn schema.title ?? schemaId.split(\"/\").pop() ?? schemaId;\n\t}\n\n\t/**\n\t * Remove $comment fields from a schema tree.\n\t * @param schema The schema tree to clean.\n\t */\n\tprivate removeSchemaComments(schema: IJsonSchema): void {\n\t\tdelete schema.$comment;\n\n\t\tfor (const value of Object.values(schema)) {\n\t\t\tif (Is.array(value)) {\n\t\t\t\tfor (const item of value) {\n\t\t\t\t\tif (Is.object<IJsonSchema>(item)) {\n\t\t\t\t\t\tthis.removeSchemaComments(item);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (Is.object<{ [id: string]: unknown }>(value)) {\n\t\t\t\tfor (const nestedValue of Object.values(value)) {\n\t\t\t\t\tif (Is.object<IJsonSchema>(nestedValue)) {\n\t\t\t\t\t\tthis.removeSchemaComments(nestedValue);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Determine whether an input value is a valid TypeScript type identifier.\n\t * An identifier must start with a letter, underscore, or dollar sign and contain only\n\t * alphanumerics, underscores, or dollar signs thereafter.\n\t * @param value The value to inspect.\n\t * @returns True if the value looks like a type name.\n\t * @internal\n\t */\n\tprivate isTypeNameInput(value: string): boolean {\n\t\treturn /^[A-Za-z_$][A-Za-z0-9_$]*$/u.test(value);\n\t}\n}\n"]}
1
+ {"version":3,"file":"typeScriptToSchema.js","sourceRoot":"","sources":["../../../src/utils/typeScriptToSchema.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2026 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { Is, ObjectHelper, StringHelper } from \"@twin.org/core\";\nimport type { IJsonSchema } from \"@twin.org/tools-models\";\nimport { FileUtils } from \"./fileUtils.js\";\nimport { JsonSchemaBuilder } from \"./jsonSchemaBuilder.js\";\nimport { Resolver } from \"./resolver.js\";\nimport { EmbeddedSchemaMode } from \"../models/embeddedSchemaMode.js\";\nimport type { ITypeScriptToSchemaContext } from \"../models/ITypeScriptToSchemaContext.js\";\nimport type { ITypeScriptToSchemaOptions } from \"../models/ITypeScriptToSchemaOptions.js\";\n\n/**\n * Class for converting TypeScript types to JSON Schema.\n */\nexport class TypeScriptToSchema {\n\t/**\n\t * Generates a JSON schema from a TypeScript source file or type name.\n\t * @param namespace The schema namespace.\n\t * @param packageName The package name.\n\t * @param schemas The package schema map.\n\t * @param sourceFileOrTypeName The source file to process or type name to resolve.\n\t * @param options Additional generation options.\n\t * @returns The generated JSON schemas indexed by title.\n\t */\n\tpublic async generateSchema(\n\t\tnamespace: string,\n\t\tpackageName: string,\n\t\tschemas: { [id: string]: { [id: string]: IJsonSchema } },\n\t\tsourceFileOrTypeName: string,\n\t\toptions?: ITypeScriptToSchemaOptions\n\t): Promise<{ [id: string]: IJsonSchema }> {\n\t\tconst suppressPackageWarnings = (options?.suppressPackageWarnings ?? [])\n\t\t\t.filter(packageNameToSkip => Is.stringValue(packageNameToSkip))\n\t\t\t.map(packageNameToSkip => packageNameToSkip.toLowerCase());\n\t\tconst filteredOptions: ITypeScriptToSchemaOptions = {\n\t\t\t...options,\n\t\t\tonDiagnostic: diagnostic => {\n\t\t\t\tif (\n\t\t\t\t\tsuppressPackageWarnings.some(packageToSkip =>\n\t\t\t\t\t\tthis.isDiagnosticFromPackage(diagnostic.path, diagnostic.fileName, packageToSkip)\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\toptions?.onDiagnostic?.(diagnostic);\n\t\t\t}\n\t\t};\n\n\t\tconst context: ITypeScriptToSchemaContext = {\n\t\t\tnamespace,\n\t\t\tpackageName,\n\t\t\tschemas,\n\t\t\toptions: filteredOptions\n\t\t};\n\n\t\tlet generatedTitles: string[] = [];\n\t\tcontext.schemas[context.packageName] ??= {};\n\t\tconst visitedFiles: string[] = [];\n\t\tconst sourceFiles = FileUtils.resolveSourceFiles(sourceFileOrTypeName);\n\n\t\tif (sourceFiles.length > 0) {\n\t\t\tfor (const sourceFilePath of sourceFiles) {\n\t\t\t\tconst source = FileUtils.readFile(sourceFilePath);\n\t\t\t\tif (source) {\n\t\t\t\t\tconst parsedTitles = JsonSchemaBuilder.parseAllObjectSchemas(\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t\tsourceFilePath,\n\t\t\t\t\t\tsource,\n\t\t\t\t\t\tvisitedFiles\n\t\t\t\t\t);\n\t\t\t\t\tfor (const parsedTitle of parsedTitles) {\n\t\t\t\t\t\tif (!generatedTitles.includes(parsedTitle)) {\n\t\t\t\t\t\t\tgeneratedTitles.push(parsedTitle);\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} else if (this.isTypeNameInput(sourceFileOrTypeName)) {\n\t\t\tconst declarationResult = Resolver.resolveTypeDeclarationAst(\n\t\t\t\tcontext.packageName,\n\t\t\t\tsourceFileOrTypeName\n\t\t\t);\n\t\t\tif (declarationResult) {\n\t\t\t\tgeneratedTitles = JsonSchemaBuilder.parseAllObjectSchemas(\n\t\t\t\t\tcontext,\n\t\t\t\t\tdeclarationResult.sourceFile.fileName,\n\t\t\t\t\tdeclarationResult.sourceFile.getFullText(),\n\t\t\t\t\tvisitedFiles\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\treturn {};\n\t\t}\n\n\t\tconst generatedSchemas: { [id: string]: IJsonSchema } = {};\n\t\tfor (const generatedTitle of generatedTitles) {\n\t\t\tconst generatedSchema = context.schemas[context.packageName][generatedTitle];\n\t\t\tif (generatedSchema) {\n\t\t\t\tgeneratedSchemas[generatedTitle] = generatedSchema;\n\t\t\t}\n\t\t}\n\n\t\tif (this.isTypeNameInput(sourceFileOrTypeName)) {\n\t\t\tconst requestedTitle = StringHelper.stripPrefix(sourceFileOrTypeName);\n\t\t\tconst requestedSchema = context.schemas[context.packageName][requestedTitle];\n\t\t\tif (requestedSchema) {\n\t\t\t\tgeneratedSchemas[requestedTitle] = requestedSchema;\n\t\t\t}\n\t\t}\n\n\t\tfor (const [generatedTitle, generatedSchema] of Object.entries(generatedSchemas)) {\n\t\t\tthis.inlineEmbeddedSchemas(context, generatedSchema, generatedTitle);\n\t\t}\n\n\t\treturn generatedSchemas;\n\t}\n\n\t/**\n\t * Determine if a diagnostic originates from a specific package.\n\t * @param path The schema or source path associated with the diagnostic.\n\t * @param fileName The source filename associated with the diagnostic.\n\t * @param packageName The package name to check, e.g. jose.\n\t * @returns True if the diagnostic originated from the package.\n\t */\n\tpublic isDiagnosticFromPackage(\n\t\tpath: string,\n\t\tfileName: string | undefined,\n\t\tpackageName: string\n\t): boolean {\n\t\tif (!Is.stringValue(packageName)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst sourcePaths = [fileName, path]\n\t\t\t.filter((value): value is string => Is.stringValue(value))\n\t\t\t.map(value => value.replace(/\\\\/g, \"/\").toLowerCase());\n\t\tconst normalisedPackageName = packageName.toLowerCase();\n\t\tconst packagePath = `/node_modules/${normalisedPackageName}/`;\n\t\tconst packagePathNoTrailingSlash = `/node_modules/${normalisedPackageName}`;\n\n\t\treturn sourcePaths.some(\n\t\t\tsourcePath =>\n\t\t\t\tsourcePath.includes(packagePath) || sourcePath.endsWith(packagePathNoTrailingSlash)\n\t\t);\n\t}\n\n\t/**\n\t * Rewrite refs to @json-schema embedded local types into the current schema's $defs.\n\t * @param context The generation context.\n\t * @param schema The root schema to rewrite.\n\t * @param rootTitle The title of the root schema.\n\t * @internal\n\t */\n\tprivate inlineEmbeddedSchemas(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tschema: IJsonSchema,\n\t\trootTitle: string\n\t): void {\n\t\tthis.inlineEmbeddedSchemasInNode(context, schema, schema, rootTitle, new Set([rootTitle]));\n\t}\n\n\t/**\n\t * Traverse a schema tree and move embedded local refs into the root schema's $defs.\n\t * @param context The generation context.\n\t * @param rootSchema The root schema document being rewritten.\n\t * @param currentNode The current schema node.\n\t * @param rootTitle The title of the root schema.\n\t * @param ancestry Titles currently being expanded to avoid recursion cycles.\n\t * @returns True if inline embedding changed this node or a descendant.\n\t * @internal\n\t */\n\tprivate inlineEmbeddedSchemasInNode(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\trootSchema: IJsonSchema,\n\t\tcurrentNode: IJsonSchema,\n\t\trootTitle: string,\n\t\tancestry: Set<string>\n\t): boolean {\n\t\tlet hasInlineReplacement = false;\n\n\t\tif (Is.stringValue(currentNode.$ref)) {\n\t\t\tconst refId = currentNode.$ref;\n\t\t\tconst embeddedMode = context.embeddedSchemaModes?.[refId];\n\t\t\tconst embeddedSchema = this.findSchemaById(context, refId);\n\t\t\tconst defsKey = embeddedSchema\n\t\t\t\t? this.getEmbeddedDefinitionKey(embeddedSchema, refId)\n\t\t\t\t: undefined;\n\n\t\t\tif (\n\t\t\t\tembeddedMode &&\n\t\t\t\tembeddedSchema &&\n\t\t\t\tdefsKey &&\n\t\t\t\tdefsKey !== rootTitle &&\n\t\t\t\t!ancestry.has(defsKey)\n\t\t\t) {\n\t\t\t\tconst embeddedClone = this.createEmbeddedSchemaClone(context, embeddedSchema, embeddedMode);\n\t\t\t\tthis.inlineEmbeddedSchemasInNode(\n\t\t\t\t\tcontext,\n\t\t\t\t\trootSchema,\n\t\t\t\t\tembeddedClone,\n\t\t\t\t\trootTitle,\n\t\t\t\t\tnew Set([...ancestry, defsKey])\n\t\t\t\t);\n\n\t\t\t\tif (embeddedMode === EmbeddedSchemaMode.Defs) {\n\t\t\t\t\trootSchema.$defs ??= {};\n\t\t\t\t\trootSchema.$defs[defsKey] ??= embeddedClone;\n\t\t\t\t\tcurrentNode.$ref = `#/$defs/${defsKey}`;\n\t\t\t\t} else {\n\t\t\t\t\tthis.replaceSchemaNode(currentNode, embeddedClone);\n\t\t\t\t\thasInlineReplacement = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const value of Object.values(currentNode)) {\n\t\t\tif (Is.array(value)) {\n\t\t\t\tfor (const item of value) {\n\t\t\t\t\tif (Is.object<IJsonSchema>(item)) {\n\t\t\t\t\t\thasInlineReplacement =\n\t\t\t\t\t\t\tthis.inlineEmbeddedSchemasInNode(context, rootSchema, item, rootTitle, ancestry) ||\n\t\t\t\t\t\t\thasInlineReplacement;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (Is.object<{ [id: string]: unknown }>(value)) {\n\t\t\t\tfor (const nestedValue of Object.values(value)) {\n\t\t\t\t\tif (Is.object<IJsonSchema>(nestedValue)) {\n\t\t\t\t\t\thasInlineReplacement =\n\t\t\t\t\t\t\tthis.inlineEmbeddedSchemasInNode(\n\t\t\t\t\t\t\t\tcontext,\n\t\t\t\t\t\t\t\trootSchema,\n\t\t\t\t\t\t\t\tnestedValue,\n\t\t\t\t\t\t\t\trootTitle,\n\t\t\t\t\t\t\t\tancestry\n\t\t\t\t\t\t\t) || hasInlineReplacement;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (hasInlineReplacement) {\n\t\t\tthis.flattenInlineAllOfBranches(currentNode);\n\t\t}\n\n\t\treturn hasInlineReplacement;\n\t}\n\n\t/**\n\t * Flatten inline-expanded object allOf branches into the containing schema.\n\t * @param schema The schema to flatten.\n\t * @internal\n\t */\n\tprivate flattenInlineAllOfBranches(schema: IJsonSchema): void {\n\t\tif (!Is.array(schema.allOf) || schema.allOf.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst remainingBranches: IJsonSchema[] = [];\n\t\tconst mergedProperties: { [id: string]: IJsonSchema } = {};\n\t\tconst mergedRequired = new Set<string>(\n\t\t\t(Is.array(schema.required) ? schema.required : []).filter(\n\t\t\t\t(requiredKey): requiredKey is string => Is.stringValue(requiredKey)\n\t\t\t)\n\t\t);\n\t\tlet hasMergedBranch = false;\n\n\t\tfor (const branch of schema.allOf) {\n\t\t\tif (this.canFlattenInlineAllOfBranch(branch)) {\n\t\t\t\thasMergedBranch = true;\n\t\t\t\tschema.type ??= \"object\";\n\t\t\t\tif (Is.object(branch.properties)) {\n\t\t\t\t\tObject.assign(mergedProperties, branch.properties);\n\t\t\t\t}\n\t\t\t\tif (Is.array(branch.required)) {\n\t\t\t\t\tfor (const requiredKey of branch.required) {\n\t\t\t\t\t\tif (Is.stringValue(requiredKey)) {\n\t\t\t\t\t\t\tmergedRequired.add(requiredKey);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tremainingBranches.push(branch);\n\t\t\t}\n\t\t}\n\n\t\tif (!hasMergedBranch) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (Object.keys(mergedProperties).length > 0) {\n\t\t\tschema.properties = Object.assign(schema.properties ?? {}, mergedProperties);\n\t\t}\n\n\t\tif (mergedRequired.size > 0) {\n\t\t\tschema.required = [...mergedRequired];\n\t\t}\n\n\t\tif (remainingBranches.length > 0) {\n\t\t\tschema.allOf = remainingBranches;\n\t\t} else {\n\t\t\tdelete schema.allOf;\n\t\t}\n\t}\n\n\t/**\n\t * Determine whether an allOf branch can be flattened into its parent after inline embedding.\n\t * @param branch The allOf branch.\n\t * @returns True if the branch is a plain object schema.\n\t * @internal\n\t */\n\tprivate canFlattenInlineAllOfBranch(branch: IJsonSchema): boolean {\n\t\treturn Boolean(\n\t\t\t!branch.$ref &&\n\t\t\t!branch.allOf &&\n\t\t\t!branch.anyOf &&\n\t\t\t!branch.oneOf &&\n\t\t\t!branch.items &&\n\t\t\t(branch.type === \"object\" || Is.object(branch.properties) || Is.array(branch.required))\n\t\t);\n\t}\n\n\t/**\n\t * Create a clone of an embedded schema suitable for defs or inline expansion.\n\t * @param context The generation context.\n\t * @param embeddedSchema The source schema.\n\t * @param embeddedMode The embedding mode.\n\t * @returns The cloned schema.\n\t * @internal\n\t */\n\tprivate createEmbeddedSchemaClone(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tembeddedSchema: IJsonSchema,\n\t\tembeddedMode: EmbeddedSchemaMode\n\t): IJsonSchema {\n\t\tlet embeddedClone = ObjectHelper.clone(embeddedSchema);\n\t\tif (embeddedMode === EmbeddedSchemaMode.Inline) {\n\t\t\tembeddedClone = JsonSchemaBuilder.expandAllOfReferences(context, embeddedClone);\n\t\t\tthis.removeSchemaComments(embeddedClone);\n\t\t}\n\t\tdelete embeddedClone.$schema;\n\t\tdelete embeddedClone.$id;\n\t\tif (embeddedMode === EmbeddedSchemaMode.Inline) {\n\t\t\tdelete embeddedClone.title;\n\t\t}\n\n\t\treturn embeddedClone;\n\t}\n\n\t/**\n\t * Replace the contents of a schema node while keeping the same object reference.\n\t * @param target The schema node to mutate.\n\t * @param replacement The replacement content.\n\t * @internal\n\t */\n\tprivate replaceSchemaNode(target: IJsonSchema, replacement: IJsonSchema): void {\n\t\tfor (const key of Object.keys(target)) {\n\t\t\tdelete target[key as keyof IJsonSchema];\n\t\t}\n\n\t\tObject.assign(target, replacement);\n\t}\n\n\t/**\n\t * Find a generated schema by its canonical id across all loaded packages.\n\t * @param context The generation context.\n\t * @param schemaId The schema id to locate.\n\t * @returns The schema when found.\n\t * @internal\n\t */\n\tprivate findSchemaById(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tschemaId: string\n\t): IJsonSchema | undefined {\n\t\treturn Object.values(context.schemas)\n\t\t\t.flatMap(packageSchemas => Object.values(packageSchemas))\n\t\t\t.find(schema => schema.$id === schemaId);\n\t}\n\n\t/**\n\t * Resolve the local $defs key to use for an embedded schema.\n\t * @param schema The embedded schema.\n\t * @param schemaId The canonical schema id.\n\t * @returns The local definition key.\n\t * @internal\n\t */\n\tprivate getEmbeddedDefinitionKey(schema: IJsonSchema, schemaId: string): string {\n\t\treturn schema.title ?? schemaId.split(\"/\").pop() ?? schemaId;\n\t}\n\n\t/**\n\t * Remove $comment fields from a schema tree.\n\t * @param schema The schema tree to clean.\n\t * @internal\n\t */\n\tprivate removeSchemaComments(schema: IJsonSchema): void {\n\t\tdelete schema.$comment;\n\n\t\tfor (const value of Object.values(schema)) {\n\t\t\tif (Is.array(value)) {\n\t\t\t\tfor (const item of value) {\n\t\t\t\t\tif (Is.object<IJsonSchema>(item)) {\n\t\t\t\t\t\tthis.removeSchemaComments(item);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (Is.object<{ [id: string]: unknown }>(value)) {\n\t\t\t\tfor (const nestedValue of Object.values(value)) {\n\t\t\t\t\tif (Is.object<IJsonSchema>(nestedValue)) {\n\t\t\t\t\t\tthis.removeSchemaComments(nestedValue);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Determine whether an input value is a valid TypeScript type identifier.\n\t * An identifier must start with a letter, underscore, or dollar sign and contain only\n\t * alphanumerics, underscores, or dollar signs thereafter.\n\t * @param value The value to inspect.\n\t * @returns True if the value looks like a type name.\n\t * @internal\n\t */\n\tprivate isTypeNameInput(value: string): boolean {\n\t\treturn /^[A-Za-z_$][A-Za-z0-9_$]*$/u.test(value);\n\t}\n}\n"]}
@@ -376,6 +376,7 @@ export class UtilityTypeSchemaMapper {
376
376
  * Determine whether a type node represents null or undefined.
377
377
  * @param typeNode The type node to inspect.
378
378
  * @returns True if the node represents null or undefined; otherwise false.
379
+ * @internal
379
380
  */
380
381
  static isNullOrUndefinedTypeNode(typeNode) {
381
382
  if (typeNode.kind === ts.SyntaxKind.NullKeyword ||
@@ -394,6 +395,7 @@ export class UtilityTypeSchemaMapper {
394
395
  * Extract literal keys from a Record key type argument.
395
396
  * @param keyTypeNode The Record key type argument to inspect.
396
397
  * @returns The extracted literal keys.
398
+ * @internal
397
399
  */
398
400
  static extractRecordLiteralKeys(keyTypeNode) {
399
401
  if (ts.isLiteralTypeNode(keyTypeNode) && ts.isStringLiteral(keyTypeNode.literal)) {
@@ -414,6 +416,7 @@ export class UtilityTypeSchemaMapper {
414
416
  * @param baseSchema The base object schema being transformed.
415
417
  * @param keyToAdd The key to add when no explicit value type argument is provided.
416
418
  * @returns The resolved default schema for the added key.
419
+ * @internal
417
420
  */
418
421
  static mapJsonLdObjectDefaultSchemaByKey(context, baseSchema, keyToAdd) {
419
422
  if (keyToAdd === "id" || keyToAdd === "@id") {
@@ -428,6 +431,7 @@ export class UtilityTypeSchemaMapper {
428
431
  * Resolve default id schema for JsonLdObjectWithId when Id type argument is omitted.
429
432
  * @param baseSchema The base object schema being transformed.
430
433
  * @returns The default id schema.
434
+ * @internal
431
435
  */
432
436
  static mapJsonLdObjectWithIdDefaultIdSchema(baseSchema) {
433
437
  return UtilityTypeSchemaMapper.mapJsonLdObjectDefaultEitherSchema(baseSchema, "id", "@id", {
@@ -438,6 +442,7 @@ export class UtilityTypeSchemaMapper {
438
442
  * Resolve default type schema for JsonLdObjectWithType when Type argument is omitted.
439
443
  * @param baseSchema The base object schema being transformed.
440
444
  * @returns The default type schema.
445
+ * @internal
441
446
  */
442
447
  static mapJsonLdObjectWithTypeDefaultTypeSchema(baseSchema) {
443
448
  return UtilityTypeSchemaMapper.mapJsonLdObjectDefaultEitherSchema(baseSchema, "type", "@type", {
@@ -449,6 +454,7 @@ export class UtilityTypeSchemaMapper {
449
454
  * @param context The generation context.
450
455
  * @param baseSchema The base object schema being transformed.
451
456
  * @returns The default context schema.
457
+ * @internal
452
458
  */
453
459
  static mapJsonLdObjectWithContextDefaultContextSchema(context, baseSchema) {
454
460
  const existingContextSchema = ObjectTransformer.resolvePropertySchemaFromObjectSchema(baseSchema, "@context");
@@ -483,6 +489,7 @@ export class UtilityTypeSchemaMapper {
483
489
  * @param secondKey The second property key to check.
484
490
  * @param fallbackSchema The fallback schema when neither key is present.
485
491
  * @returns The resolved schema.
492
+ * @internal
486
493
  */
487
494
  static mapJsonLdObjectDefaultEitherSchema(baseSchema, firstKey, secondKey, fallbackSchema) {
488
495
  const firstSchema = ObjectTransformer.resolvePropertySchemaFromObjectSchema(baseSchema, firstKey);
@@ -1 +1 @@
1
- {"version":3,"file":"utilityTypeSchemaMapper.js","sourceRoot":"","sources":["../../../src/utils/utilityTypeSchemaMapper.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2026 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { Is, JsonHelper, ObjectHelper } from \"@twin.org/core\";\nimport type { IJsonSchema } from \"@twin.org/tools-models\";\nimport * as ts from \"typescript\";\nimport { JsonSchemaBuilder } from \"./jsonSchemaBuilder.js\";\nimport { ObjectTransformer } from \"./objectTransformer.js\";\nimport type { ITypeScriptToSchemaContext } from \"../models/ITypeScriptToSchemaContext.js\";\n\n/**\n * Static utility-type schema mapping helpers.\n */\nexport class UtilityTypeSchemaMapper {\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\tconst baseTypeNode = typeNode.typeArguments?.[0];\n\t\tif (!baseTypeNode) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst objectSchema = JsonSchemaBuilder.resolveUtilityBaseObjectSchema(context, baseTypeNode);\n\t\tif (objectSchema) {\n\t\t\tconst partialSchema = ObjectTransformer.toInlineUtilityObjectSchema(objectSchema);\n\t\t\tdelete partialSchema.required;\n\t\t\treturn partialSchema;\n\t\t}\n\n\t\treturn undefined;\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\tconst baseTypeNode = typeNode.typeArguments?.[0];\n\t\tif (!baseTypeNode) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst objectSchema = JsonSchemaBuilder.resolveUtilityBaseObjectSchema(context, baseTypeNode);\n\t\tif (objectSchema) {\n\t\t\tconst requiredSchema = ObjectTransformer.toInlineUtilityObjectSchema(objectSchema);\n\t\t\tif (requiredSchema.properties) {\n\t\t\t\trequiredSchema.required = Object.keys(requiredSchema.properties);\n\t\t\t}\n\t\t\treturn requiredSchema;\n\t\t}\n\n\t\treturn undefined;\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\tconst baseTypeNode = typeNode.typeArguments?.[0];\n\t\tconst pickedKeys = JsonSchemaBuilder.extractUtilityTypeKeys(\n\t\t\tcontext,\n\t\t\ttypeNode.typeArguments?.[1]\n\t\t);\n\t\tif (!baseTypeNode || pickedKeys.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst baseSchema = JsonSchemaBuilder.resolveUtilityBaseObjectSchema(context, baseTypeNode);\n\t\tif (baseSchema) {\n\t\t\treturn ObjectTransformer.pickKeysFromObjectSchema(baseSchema, pickedKeys);\n\t\t}\n\n\t\treturn undefined;\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\tconst baseTypeNode = typeNode.typeArguments?.[0];\n\t\tconst omittedKeys = JsonSchemaBuilder.extractUtilityTypeKeys(\n\t\t\tcontext,\n\t\t\ttypeNode.typeArguments?.[1]\n\t\t);\n\t\tif (!baseTypeNode || omittedKeys.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst baseSchema = JsonSchemaBuilder.resolveUtilityBaseObjectSchema(context, baseTypeNode);\n\t\tif (baseSchema) {\n\t\t\treturn ObjectTransformer.omitKeysFromObjectSchema(baseSchema, omittedKeys);\n\t\t}\n\n\t\treturn undefined;\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\tconst sourceTypeNode = typeNode.typeArguments?.[0];\n\t\tconst excludedTypeNode = typeNode.typeArguments?.[1];\n\t\tif (!sourceTypeNode || !excludedTypeNode) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst sourceTypes = ts.isUnionTypeNode(sourceTypeNode)\n\t\t\t? sourceTypeNode.types\n\t\t\t: [sourceTypeNode];\n\t\tconst excludedTypes = ts.isUnionTypeNode(excludedTypeNode)\n\t\t\t? excludedTypeNode.types\n\t\t\t: [excludedTypeNode];\n\n\t\tconst sourceSchemas = sourceTypes\n\t\t\t.map(sourceType => JsonSchemaBuilder.mapTypeNodeToSchema(context, sourceType))\n\t\t\t.filter((schema): schema is IJsonSchema => schema !== undefined);\n\t\tconst excludedSchemas = excludedTypes\n\t\t\t.map(excludedType => JsonSchemaBuilder.mapTypeNodeToSchema(context, excludedType))\n\t\t\t.filter((schema): schema is IJsonSchema => schema !== undefined)\n\t\t\t.map(schema => JsonHelper.canonicalize(schema));\n\n\t\tif (sourceSchemas.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst excludedSchemaKeys = new Set(excludedSchemas);\n\t\tconst remainingSchemas = sourceSchemas.filter(\n\t\t\tschema => !excludedSchemaKeys.has(JsonHelper.canonicalize(schema))\n\t\t);\n\n\t\tif (remainingSchemas.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (remainingSchemas.length === 1) {\n\t\t\treturn remainingSchemas[0];\n\t\t}\n\n\t\treturn {\n\t\t\tanyOf: remainingSchemas\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\tconst sourceTypeNode = typeNode.typeArguments?.[0];\n\t\tconst includedTypeNode = typeNode.typeArguments?.[1];\n\t\tif (!sourceTypeNode || !includedTypeNode) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst sourceTypes = ts.isUnionTypeNode(sourceTypeNode)\n\t\t\t? sourceTypeNode.types\n\t\t\t: [sourceTypeNode];\n\t\tconst includedTypes = ts.isUnionTypeNode(includedTypeNode)\n\t\t\t? includedTypeNode.types\n\t\t\t: [includedTypeNode];\n\n\t\tconst sourceSchemas = sourceTypes\n\t\t\t.map(sourceType => JsonSchemaBuilder.mapTypeNodeToSchema(context, sourceType))\n\t\t\t.filter((schema): schema is IJsonSchema => schema !== undefined);\n\t\tconst includedSchemaKeys = new Set(\n\t\t\tincludedTypes\n\t\t\t\t.map(includedType => JsonSchemaBuilder.mapTypeNodeToSchema(context, includedType))\n\t\t\t\t.filter((schema): schema is IJsonSchema => schema !== undefined)\n\t\t\t\t.map(schema => JsonHelper.canonicalize(schema))\n\t\t);\n\n\t\tif (sourceSchemas.length === 0 || includedSchemaKeys.size === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst matchedSchemas = sourceSchemas.filter(schema =>\n\t\t\tincludedSchemaKeys.has(JsonHelper.canonicalize(schema))\n\t\t);\n\n\t\tif (matchedSchemas.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (matchedSchemas.length === 1) {\n\t\t\treturn matchedSchemas[0];\n\t\t}\n\n\t\treturn {\n\t\t\tanyOf: matchedSchemas\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\tconst sourceTypeNode = typeNode.typeArguments?.[0];\n\t\tif (!sourceTypeNode) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst sourceTypes = ts.isUnionTypeNode(sourceTypeNode)\n\t\t\t? sourceTypeNode.types\n\t\t\t: [sourceTypeNode];\n\t\tconst nonNullableTypes = sourceTypes.filter(\n\t\t\tsourceType => !UtilityTypeSchemaMapper.isNullOrUndefinedTypeNode(sourceType)\n\t\t);\n\n\t\tif (nonNullableTypes.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst mappedSchemas = nonNullableTypes\n\t\t\t.map(sourceType => JsonSchemaBuilder.mapTypeNodeToSchema(context, sourceType))\n\t\t\t.filter((schema): schema is IJsonSchema => schema !== undefined);\n\n\t\tif (mappedSchemas.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (mappedSchemas.length === 1) {\n\t\t\treturn mappedSchemas[0];\n\t\t}\n\n\t\tconst uniqueSchemas = mappedSchemas.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 `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\tconst keyTypeNode = typeNode.typeArguments?.[0];\n\t\tconst valueTypeNode = typeNode.typeArguments?.[1];\n\t\tif (!keyTypeNode || !valueTypeNode) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst valueSchema = JsonSchemaBuilder.mapTypeNodeToSchema(context, valueTypeNode);\n\t\tif (!valueSchema) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst recordLiteralKeys = UtilityTypeSchemaMapper.extractRecordLiteralKeys(keyTypeNode);\n\t\tif (recordLiteralKeys.length > 0) {\n\t\t\tconst properties: { [key: string]: IJsonSchema } = {};\n\t\t\tfor (const key of recordLiteralKeys) {\n\t\t\t\tproperties[key] = ObjectHelper.clone(valueSchema);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\ttype: \"object\",\n\t\t\t\tproperties,\n\t\t\t\trequired: recordLiteralKeys\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\ttype: \"object\",\n\t\t\tadditionalProperties: valueSchema\n\t\t};\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 The mapping options for key removal and optional key addition.\n\t * @param options.keysToRemove The property keys to remove from the base schema.\n\t * @param options.keyToAdd The optional key to add after removal.\n\t * @param options.isAddedKeyRequired True when the added key must 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\tconst baseTypeNode = typeNode.typeArguments?.[0];\n\t\tif (!baseTypeNode) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst baseSchema = JsonSchemaBuilder.resolveUtilityBaseObjectSchema(context, baseTypeNode);\n\t\tif (!baseSchema) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst mappedSchema = ObjectTransformer.omitKeysFromObjectSchema(\n\t\t\tbaseSchema,\n\t\t\toptions.keysToRemove\n\t\t);\n\t\tif (!options.keyToAdd) {\n\t\t\treturn mappedSchema;\n\t\t}\n\n\t\tconst valueTypeNode = typeNode.typeArguments?.[1];\n\t\tconst valueSchema = valueTypeNode\n\t\t\t? JsonSchemaBuilder.mapTypeNodeToSchema(context, valueTypeNode)\n\t\t\t: UtilityTypeSchemaMapper.mapJsonLdObjectDefaultSchemaByKey(\n\t\t\t\t\tcontext,\n\t\t\t\t\tbaseSchema,\n\t\t\t\t\toptions.keyToAdd\n\t\t\t\t);\n\t\tif (!valueSchema) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tmappedSchema.type = \"object\";\n\t\tmappedSchema.properties ??= {};\n\t\tmappedSchema.properties[options.keyToAdd] = valueSchema;\n\n\t\tif (options.isAddedKeyRequired) {\n\t\t\tconst requiredKeys = new Set(mappedSchema.required ?? []);\n\t\t\trequiredKeys.add(options.keyToAdd);\n\t\t\tmappedSchema.required = [...requiredKeys];\n\t\t}\n\n\t\treturn mappedSchema;\n\t}\n\n\t/**\n\t * Map `JsonLdWithAliases<T, Prefix>` (and `JsonLdObjectWithAliases<T, Prefix>`) to an object\n\t * schema where non-JSON-LD property keys are renamed to `Prefix:key` and `@`-prefixed keys\n\t * are preserved as-is.\n\t * @param context The generation context.\n\t * @param typeNode The type reference node.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapJsonLdWithAliasesUtilityType(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode\n\t): IJsonSchema | undefined {\n\t\tconst baseTypeNode = typeNode.typeArguments?.[0];\n\t\tif (!baseTypeNode) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst prefixTypeNode = typeNode.typeArguments?.[1];\n\t\tif (\n\t\t\t!prefixTypeNode ||\n\t\t\t!ts.isLiteralTypeNode(prefixTypeNode) ||\n\t\t\t!ts.isStringLiteral(prefixTypeNode.literal)\n\t\t) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst prefix = prefixTypeNode.literal.text;\n\t\tconst baseSchema = JsonSchemaBuilder.resolveUtilityBaseObjectSchema(context, baseTypeNode);\n\t\tif (!baseSchema) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn ObjectTransformer.renameKeysWithPrefixInObjectSchema(baseSchema, prefix);\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\tconst baseTypeNode = typeNode.typeArguments?.[0];\n\t\tif (!baseTypeNode) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst itemSchema = JsonSchemaBuilder.mapTypeNodeToSchema(context, baseTypeNode);\n\t\tif (!itemSchema) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst scalarSchemas =\n\t\t\tIs.array(itemSchema.anyOf) && Object.keys(itemSchema).length === 1\n\t\t\t\t? itemSchema.anyOf\n\t\t\t\t: [itemSchema];\n\n\t\treturn {\n\t\t\tanyOf: [...scalarSchemas, { type: \"array\", items: itemSchema }]\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\tconst primaryTypeNode = typeNode.typeArguments?.[0];\n\t\tif (!primaryTypeNode) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst primarySchema = JsonSchemaBuilder.mapTypeNodeToSchema(context, primaryTypeNode);\n\t\tif (!primarySchema) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst singleOccurrenceTypeNode = typeNode.typeArguments?.[1];\n\t\tif (!singleOccurrenceTypeNode) {\n\t\t\treturn {\n\t\t\t\ttype: \"array\",\n\t\t\t\titems: primarySchema,\n\t\t\t\tminItems: 1\n\t\t\t};\n\t\t}\n\n\t\tconst singleOccurrenceSchema = JsonSchemaBuilder.mapTypeNodeToSchema(\n\t\t\tcontext,\n\t\t\tsingleOccurrenceTypeNode\n\t\t);\n\t\tif (!singleOccurrenceSchema) {\n\t\t\treturn {\n\t\t\t\ttype: \"array\",\n\t\t\t\titems: primarySchema,\n\t\t\t\tminItems: 1\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tJsonHelper.canonicalize(primarySchema) === JsonHelper.canonicalize(singleOccurrenceSchema)\n\t\t) {\n\t\t\treturn {\n\t\t\t\ttype: \"array\",\n\t\t\t\titems: primarySchema,\n\t\t\t\tminItems: 1\n\t\t\t};\n\t\t}\n\n\t\tconst itemSchema: IJsonSchema = {\n\t\t\tanyOf: [primarySchema, singleOccurrenceSchema]\n\t\t};\n\n\t\treturn {\n\t\t\ttype: \"array\",\n\t\t\titems: itemSchema,\n\t\t\tcontains: singleOccurrenceSchema,\n\t\t\tminContains: 1,\n\t\t\tmaxContains: 1,\n\t\t\tminItems: 1\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 to inspect.\n\t * @returns True if the node represents null or undefined; otherwise false.\n\t */\n\tprivate static isNullOrUndefinedTypeNode(typeNode: ts.TypeNode): boolean {\n\t\tif (\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\tif (ts.isLiteralTypeNode(typeNode)) {\n\t\t\treturn typeNode.literal.kind === ts.SyntaxKind.NullKeyword;\n\t\t}\n\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 Record key type argument to inspect.\n\t * @returns The extracted literal keys.\n\t */\n\tprivate static extractRecordLiteralKeys(keyTypeNode: ts.TypeNode): string[] {\n\t\tif (ts.isLiteralTypeNode(keyTypeNode) && ts.isStringLiteral(keyTypeNode.literal)) {\n\t\t\treturn [keyTypeNode.literal.text];\n\t\t}\n\n\t\tif (ts.isUnionTypeNode(keyTypeNode)) {\n\t\t\tconst keys = keyTypeNode.types\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 * Resolve a default schema for JsonLdObject utility key additions when the type argument is omitted.\n\t * @param context The generation context.\n\t * @param baseSchema The base object schema being transformed.\n\t * @param keyToAdd The key to add when no explicit value type argument is provided.\n\t * @returns The resolved default schema for the added key.\n\t */\n\tprivate static mapJsonLdObjectDefaultSchemaByKey(\n\t\tcontext: ITypeScriptToSchemaContext,\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 UtilityTypeSchemaMapper.mapJsonLdObjectWithIdDefaultIdSchema(baseSchema);\n\t\t}\n\n\t\tif (keyToAdd === \"@context\") {\n\t\t\treturn UtilityTypeSchemaMapper.mapJsonLdObjectWithContextDefaultContextSchema(\n\t\t\t\tcontext,\n\t\t\t\tbaseSchema\n\t\t\t);\n\t\t}\n\n\t\treturn UtilityTypeSchemaMapper.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 being transformed.\n\t * @returns The default id schema.\n\t */\n\tprivate static mapJsonLdObjectWithIdDefaultIdSchema(baseSchema: IJsonSchema): IJsonSchema {\n\t\treturn UtilityTypeSchemaMapper.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 being transformed.\n\t * @returns The default type schema.\n\t */\n\tprivate static mapJsonLdObjectWithTypeDefaultTypeSchema(baseSchema: IJsonSchema): IJsonSchema {\n\t\treturn UtilityTypeSchemaMapper.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 context The generation context.\n\t * @param baseSchema The base object schema being transformed.\n\t * @returns The default context schema.\n\t */\n\tprivate static mapJsonLdObjectWithContextDefaultContextSchema(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tbaseSchema: IJsonSchema\n\t): IJsonSchema {\n\t\tconst existingContextSchema = ObjectTransformer.resolvePropertySchemaFromObjectSchema(\n\t\t\tbaseSchema,\n\t\t\t\"@context\"\n\t\t);\n\n\t\tif (existingContextSchema) {\n\t\t\treturn existingContextSchema;\n\t\t}\n\n\t\tconst mappedContextReference = JsonSchemaBuilder.resolveReferenceMappingTarget(\n\t\t\tcontext,\n\t\t\t\"\",\n\t\t\t\"JsonLdContextDefinitionRoot\"\n\t\t);\n\t\tif (mappedContextReference?.schemaId) {\n\t\t\treturn {\n\t\t\t\t$ref: mappedContextReference.schemaId\n\t\t\t};\n\t\t}\n\n\t\t// Look up JsonLdContextDefinitionRoot from the cache to get its correct namespace\n\t\tconst contextDefRootSchema = Object.entries(context.schemas)\n\t\t\t.filter(([packageName]) => packageName !== context.packageName)\n\t\t\t.flatMap(([, packageSchemas]) => Object.values(packageSchemas ?? {}))\n\t\t\t.find(schema => schema?.$id?.endsWith(\"JsonLdContextDefinitionRoot\"));\n\n\t\tif (contextDefRootSchema?.$id) {\n\t\t\treturn {\n\t\t\t\t$ref: contextDefRootSchema.$id\n\t\t\t};\n\t\t}\n\n\t\t// Fallback: return a reference using a common JSON-LD namespace\n\t\treturn {\n\t\t\t$ref: \"https://schema.twindev.org/json-ld/JsonLdContextDefinitionRoot\"\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 being transformed.\n\t * @param firstKey The first property key to check.\n\t * @param secondKey The second property key to check.\n\t * @param fallbackSchema The fallback schema when neither key is present.\n\t * @returns The resolved schema.\n\t */\n\tprivate 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\treturn firstSchema ?? secondSchema ?? fallbackSchema;\n\t}\n}\n"]}
1
+ {"version":3,"file":"utilityTypeSchemaMapper.js","sourceRoot":"","sources":["../../../src/utils/utilityTypeSchemaMapper.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2026 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { Is, JsonHelper, ObjectHelper } from \"@twin.org/core\";\nimport type { IJsonSchema } from \"@twin.org/tools-models\";\nimport * as ts from \"typescript\";\nimport { JsonSchemaBuilder } from \"./jsonSchemaBuilder.js\";\nimport { ObjectTransformer } from \"./objectTransformer.js\";\nimport type { ITypeScriptToSchemaContext } from \"../models/ITypeScriptToSchemaContext.js\";\n\n/**\n * Static utility-type schema mapping helpers.\n */\nexport class UtilityTypeSchemaMapper {\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\tconst baseTypeNode = typeNode.typeArguments?.[0];\n\t\tif (!baseTypeNode) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst objectSchema = JsonSchemaBuilder.resolveUtilityBaseObjectSchema(context, baseTypeNode);\n\t\tif (objectSchema) {\n\t\t\tconst partialSchema = ObjectTransformer.toInlineUtilityObjectSchema(objectSchema);\n\t\t\tdelete partialSchema.required;\n\t\t\treturn partialSchema;\n\t\t}\n\n\t\treturn undefined;\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\tconst baseTypeNode = typeNode.typeArguments?.[0];\n\t\tif (!baseTypeNode) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst objectSchema = JsonSchemaBuilder.resolveUtilityBaseObjectSchema(context, baseTypeNode);\n\t\tif (objectSchema) {\n\t\t\tconst requiredSchema = ObjectTransformer.toInlineUtilityObjectSchema(objectSchema);\n\t\t\tif (requiredSchema.properties) {\n\t\t\t\trequiredSchema.required = Object.keys(requiredSchema.properties);\n\t\t\t}\n\t\t\treturn requiredSchema;\n\t\t}\n\n\t\treturn undefined;\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\tconst baseTypeNode = typeNode.typeArguments?.[0];\n\t\tconst pickedKeys = JsonSchemaBuilder.extractUtilityTypeKeys(\n\t\t\tcontext,\n\t\t\ttypeNode.typeArguments?.[1]\n\t\t);\n\t\tif (!baseTypeNode || pickedKeys.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst baseSchema = JsonSchemaBuilder.resolveUtilityBaseObjectSchema(context, baseTypeNode);\n\t\tif (baseSchema) {\n\t\t\treturn ObjectTransformer.pickKeysFromObjectSchema(baseSchema, pickedKeys);\n\t\t}\n\n\t\treturn undefined;\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\tconst baseTypeNode = typeNode.typeArguments?.[0];\n\t\tconst omittedKeys = JsonSchemaBuilder.extractUtilityTypeKeys(\n\t\t\tcontext,\n\t\t\ttypeNode.typeArguments?.[1]\n\t\t);\n\t\tif (!baseTypeNode || omittedKeys.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst baseSchema = JsonSchemaBuilder.resolveUtilityBaseObjectSchema(context, baseTypeNode);\n\t\tif (baseSchema) {\n\t\t\treturn ObjectTransformer.omitKeysFromObjectSchema(baseSchema, omittedKeys);\n\t\t}\n\n\t\treturn undefined;\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\tconst sourceTypeNode = typeNode.typeArguments?.[0];\n\t\tconst excludedTypeNode = typeNode.typeArguments?.[1];\n\t\tif (!sourceTypeNode || !excludedTypeNode) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst sourceTypes = ts.isUnionTypeNode(sourceTypeNode)\n\t\t\t? sourceTypeNode.types\n\t\t\t: [sourceTypeNode];\n\t\tconst excludedTypes = ts.isUnionTypeNode(excludedTypeNode)\n\t\t\t? excludedTypeNode.types\n\t\t\t: [excludedTypeNode];\n\n\t\tconst sourceSchemas = sourceTypes\n\t\t\t.map(sourceType => JsonSchemaBuilder.mapTypeNodeToSchema(context, sourceType))\n\t\t\t.filter((schema): schema is IJsonSchema => schema !== undefined);\n\t\tconst excludedSchemas = excludedTypes\n\t\t\t.map(excludedType => JsonSchemaBuilder.mapTypeNodeToSchema(context, excludedType))\n\t\t\t.filter((schema): schema is IJsonSchema => schema !== undefined)\n\t\t\t.map(schema => JsonHelper.canonicalize(schema));\n\n\t\tif (sourceSchemas.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst excludedSchemaKeys = new Set(excludedSchemas);\n\t\tconst remainingSchemas = sourceSchemas.filter(\n\t\t\tschema => !excludedSchemaKeys.has(JsonHelper.canonicalize(schema))\n\t\t);\n\n\t\tif (remainingSchemas.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (remainingSchemas.length === 1) {\n\t\t\treturn remainingSchemas[0];\n\t\t}\n\n\t\treturn {\n\t\t\tanyOf: remainingSchemas\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\tconst sourceTypeNode = typeNode.typeArguments?.[0];\n\t\tconst includedTypeNode = typeNode.typeArguments?.[1];\n\t\tif (!sourceTypeNode || !includedTypeNode) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst sourceTypes = ts.isUnionTypeNode(sourceTypeNode)\n\t\t\t? sourceTypeNode.types\n\t\t\t: [sourceTypeNode];\n\t\tconst includedTypes = ts.isUnionTypeNode(includedTypeNode)\n\t\t\t? includedTypeNode.types\n\t\t\t: [includedTypeNode];\n\n\t\tconst sourceSchemas = sourceTypes\n\t\t\t.map(sourceType => JsonSchemaBuilder.mapTypeNodeToSchema(context, sourceType))\n\t\t\t.filter((schema): schema is IJsonSchema => schema !== undefined);\n\t\tconst includedSchemaKeys = new Set(\n\t\t\tincludedTypes\n\t\t\t\t.map(includedType => JsonSchemaBuilder.mapTypeNodeToSchema(context, includedType))\n\t\t\t\t.filter((schema): schema is IJsonSchema => schema !== undefined)\n\t\t\t\t.map(schema => JsonHelper.canonicalize(schema))\n\t\t);\n\n\t\tif (sourceSchemas.length === 0 || includedSchemaKeys.size === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst matchedSchemas = sourceSchemas.filter(schema =>\n\t\t\tincludedSchemaKeys.has(JsonHelper.canonicalize(schema))\n\t\t);\n\n\t\tif (matchedSchemas.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (matchedSchemas.length === 1) {\n\t\t\treturn matchedSchemas[0];\n\t\t}\n\n\t\treturn {\n\t\t\tanyOf: matchedSchemas\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\tconst sourceTypeNode = typeNode.typeArguments?.[0];\n\t\tif (!sourceTypeNode) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst sourceTypes = ts.isUnionTypeNode(sourceTypeNode)\n\t\t\t? sourceTypeNode.types\n\t\t\t: [sourceTypeNode];\n\t\tconst nonNullableTypes = sourceTypes.filter(\n\t\t\tsourceType => !UtilityTypeSchemaMapper.isNullOrUndefinedTypeNode(sourceType)\n\t\t);\n\n\t\tif (nonNullableTypes.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst mappedSchemas = nonNullableTypes\n\t\t\t.map(sourceType => JsonSchemaBuilder.mapTypeNodeToSchema(context, sourceType))\n\t\t\t.filter((schema): schema is IJsonSchema => schema !== undefined);\n\n\t\tif (mappedSchemas.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (mappedSchemas.length === 1) {\n\t\t\treturn mappedSchemas[0];\n\t\t}\n\n\t\tconst uniqueSchemas = mappedSchemas.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 `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\tconst keyTypeNode = typeNode.typeArguments?.[0];\n\t\tconst valueTypeNode = typeNode.typeArguments?.[1];\n\t\tif (!keyTypeNode || !valueTypeNode) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst valueSchema = JsonSchemaBuilder.mapTypeNodeToSchema(context, valueTypeNode);\n\t\tif (!valueSchema) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst recordLiteralKeys = UtilityTypeSchemaMapper.extractRecordLiteralKeys(keyTypeNode);\n\t\tif (recordLiteralKeys.length > 0) {\n\t\t\tconst properties: { [key: string]: IJsonSchema } = {};\n\t\t\tfor (const key of recordLiteralKeys) {\n\t\t\t\tproperties[key] = ObjectHelper.clone(valueSchema);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\ttype: \"object\",\n\t\t\t\tproperties,\n\t\t\t\trequired: recordLiteralKeys\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\ttype: \"object\",\n\t\t\tadditionalProperties: valueSchema\n\t\t};\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 The mapping options for key removal and optional key addition.\n\t * @param options.keysToRemove The property keys to remove from the base schema.\n\t * @param options.keyToAdd The optional key to add after removal.\n\t * @param options.isAddedKeyRequired True when the added key must 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\tconst baseTypeNode = typeNode.typeArguments?.[0];\n\t\tif (!baseTypeNode) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst baseSchema = JsonSchemaBuilder.resolveUtilityBaseObjectSchema(context, baseTypeNode);\n\t\tif (!baseSchema) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst mappedSchema = ObjectTransformer.omitKeysFromObjectSchema(\n\t\t\tbaseSchema,\n\t\t\toptions.keysToRemove\n\t\t);\n\t\tif (!options.keyToAdd) {\n\t\t\treturn mappedSchema;\n\t\t}\n\n\t\tconst valueTypeNode = typeNode.typeArguments?.[1];\n\t\tconst valueSchema = valueTypeNode\n\t\t\t? JsonSchemaBuilder.mapTypeNodeToSchema(context, valueTypeNode)\n\t\t\t: UtilityTypeSchemaMapper.mapJsonLdObjectDefaultSchemaByKey(\n\t\t\t\t\tcontext,\n\t\t\t\t\tbaseSchema,\n\t\t\t\t\toptions.keyToAdd\n\t\t\t\t);\n\t\tif (!valueSchema) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tmappedSchema.type = \"object\";\n\t\tmappedSchema.properties ??= {};\n\t\tmappedSchema.properties[options.keyToAdd] = valueSchema;\n\n\t\tif (options.isAddedKeyRequired) {\n\t\t\tconst requiredKeys = new Set(mappedSchema.required ?? []);\n\t\t\trequiredKeys.add(options.keyToAdd);\n\t\t\tmappedSchema.required = [...requiredKeys];\n\t\t}\n\n\t\treturn mappedSchema;\n\t}\n\n\t/**\n\t * Map `JsonLdWithAliases<T, Prefix>` (and `JsonLdObjectWithAliases<T, Prefix>`) to an object\n\t * schema where non-JSON-LD property keys are renamed to `Prefix:key` and `@`-prefixed keys\n\t * are preserved as-is.\n\t * @param context The generation context.\n\t * @param typeNode The type reference node.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapJsonLdWithAliasesUtilityType(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeReferenceNode\n\t): IJsonSchema | undefined {\n\t\tconst baseTypeNode = typeNode.typeArguments?.[0];\n\t\tif (!baseTypeNode) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst prefixTypeNode = typeNode.typeArguments?.[1];\n\t\tif (\n\t\t\t!prefixTypeNode ||\n\t\t\t!ts.isLiteralTypeNode(prefixTypeNode) ||\n\t\t\t!ts.isStringLiteral(prefixTypeNode.literal)\n\t\t) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst prefix = prefixTypeNode.literal.text;\n\t\tconst baseSchema = JsonSchemaBuilder.resolveUtilityBaseObjectSchema(context, baseTypeNode);\n\t\tif (!baseSchema) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn ObjectTransformer.renameKeysWithPrefixInObjectSchema(baseSchema, prefix);\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\tconst baseTypeNode = typeNode.typeArguments?.[0];\n\t\tif (!baseTypeNode) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst itemSchema = JsonSchemaBuilder.mapTypeNodeToSchema(context, baseTypeNode);\n\t\tif (!itemSchema) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst scalarSchemas =\n\t\t\tIs.array(itemSchema.anyOf) && Object.keys(itemSchema).length === 1\n\t\t\t\t? itemSchema.anyOf\n\t\t\t\t: [itemSchema];\n\n\t\treturn {\n\t\t\tanyOf: [...scalarSchemas, { type: \"array\", items: itemSchema }]\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\tconst primaryTypeNode = typeNode.typeArguments?.[0];\n\t\tif (!primaryTypeNode) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst primarySchema = JsonSchemaBuilder.mapTypeNodeToSchema(context, primaryTypeNode);\n\t\tif (!primarySchema) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst singleOccurrenceTypeNode = typeNode.typeArguments?.[1];\n\t\tif (!singleOccurrenceTypeNode) {\n\t\t\treturn {\n\t\t\t\ttype: \"array\",\n\t\t\t\titems: primarySchema,\n\t\t\t\tminItems: 1\n\t\t\t};\n\t\t}\n\n\t\tconst singleOccurrenceSchema = JsonSchemaBuilder.mapTypeNodeToSchema(\n\t\t\tcontext,\n\t\t\tsingleOccurrenceTypeNode\n\t\t);\n\t\tif (!singleOccurrenceSchema) {\n\t\t\treturn {\n\t\t\t\ttype: \"array\",\n\t\t\t\titems: primarySchema,\n\t\t\t\tminItems: 1\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tJsonHelper.canonicalize(primarySchema) === JsonHelper.canonicalize(singleOccurrenceSchema)\n\t\t) {\n\t\t\treturn {\n\t\t\t\ttype: \"array\",\n\t\t\t\titems: primarySchema,\n\t\t\t\tminItems: 1\n\t\t\t};\n\t\t}\n\n\t\tconst itemSchema: IJsonSchema = {\n\t\t\tanyOf: [primarySchema, singleOccurrenceSchema]\n\t\t};\n\n\t\treturn {\n\t\t\ttype: \"array\",\n\t\t\titems: itemSchema,\n\t\t\tcontains: singleOccurrenceSchema,\n\t\t\tminContains: 1,\n\t\t\tmaxContains: 1,\n\t\t\tminItems: 1\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 to inspect.\n\t * @returns True if the node represents null or undefined; otherwise false.\n\t * @internal\n\t */\n\tprivate static isNullOrUndefinedTypeNode(typeNode: ts.TypeNode): boolean {\n\t\tif (\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\tif (ts.isLiteralTypeNode(typeNode)) {\n\t\t\treturn typeNode.literal.kind === ts.SyntaxKind.NullKeyword;\n\t\t}\n\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 Record key type argument to inspect.\n\t * @returns The extracted literal keys.\n\t * @internal\n\t */\n\tprivate static extractRecordLiteralKeys(keyTypeNode: ts.TypeNode): string[] {\n\t\tif (ts.isLiteralTypeNode(keyTypeNode) && ts.isStringLiteral(keyTypeNode.literal)) {\n\t\t\treturn [keyTypeNode.literal.text];\n\t\t}\n\n\t\tif (ts.isUnionTypeNode(keyTypeNode)) {\n\t\t\tconst keys = keyTypeNode.types\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 * Resolve a default schema for JsonLdObject utility key additions when the type argument is omitted.\n\t * @param context The generation context.\n\t * @param baseSchema The base object schema being transformed.\n\t * @param keyToAdd The key to add when no explicit value type argument is provided.\n\t * @returns The resolved default schema for the added key.\n\t * @internal\n\t */\n\tprivate static mapJsonLdObjectDefaultSchemaByKey(\n\t\tcontext: ITypeScriptToSchemaContext,\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 UtilityTypeSchemaMapper.mapJsonLdObjectWithIdDefaultIdSchema(baseSchema);\n\t\t}\n\n\t\tif (keyToAdd === \"@context\") {\n\t\t\treturn UtilityTypeSchemaMapper.mapJsonLdObjectWithContextDefaultContextSchema(\n\t\t\t\tcontext,\n\t\t\t\tbaseSchema\n\t\t\t);\n\t\t}\n\n\t\treturn UtilityTypeSchemaMapper.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 being transformed.\n\t * @returns The default id schema.\n\t * @internal\n\t */\n\tprivate static mapJsonLdObjectWithIdDefaultIdSchema(baseSchema: IJsonSchema): IJsonSchema {\n\t\treturn UtilityTypeSchemaMapper.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 being transformed.\n\t * @returns The default type schema.\n\t * @internal\n\t */\n\tprivate static mapJsonLdObjectWithTypeDefaultTypeSchema(baseSchema: IJsonSchema): IJsonSchema {\n\t\treturn UtilityTypeSchemaMapper.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 context The generation context.\n\t * @param baseSchema The base object schema being transformed.\n\t * @returns The default context schema.\n\t * @internal\n\t */\n\tprivate static mapJsonLdObjectWithContextDefaultContextSchema(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tbaseSchema: IJsonSchema\n\t): IJsonSchema {\n\t\tconst existingContextSchema = ObjectTransformer.resolvePropertySchemaFromObjectSchema(\n\t\t\tbaseSchema,\n\t\t\t\"@context\"\n\t\t);\n\n\t\tif (existingContextSchema) {\n\t\t\treturn existingContextSchema;\n\t\t}\n\n\t\tconst mappedContextReference = JsonSchemaBuilder.resolveReferenceMappingTarget(\n\t\t\tcontext,\n\t\t\t\"\",\n\t\t\t\"JsonLdContextDefinitionRoot\"\n\t\t);\n\t\tif (mappedContextReference?.schemaId) {\n\t\t\treturn {\n\t\t\t\t$ref: mappedContextReference.schemaId\n\t\t\t};\n\t\t}\n\n\t\t// Look up JsonLdContextDefinitionRoot from the cache to get its correct namespace\n\t\tconst contextDefRootSchema = Object.entries(context.schemas)\n\t\t\t.filter(([packageName]) => packageName !== context.packageName)\n\t\t\t.flatMap(([, packageSchemas]) => Object.values(packageSchemas ?? {}))\n\t\t\t.find(schema => schema?.$id?.endsWith(\"JsonLdContextDefinitionRoot\"));\n\n\t\tif (contextDefRootSchema?.$id) {\n\t\t\treturn {\n\t\t\t\t$ref: contextDefRootSchema.$id\n\t\t\t};\n\t\t}\n\n\t\t// Fallback: return a reference using a common JSON-LD namespace\n\t\treturn {\n\t\t\t$ref: \"https://schema.twindev.org/json-ld/JsonLdContextDefinitionRoot\"\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 being transformed.\n\t * @param firstKey The first property key to check.\n\t * @param secondKey The second property key to check.\n\t * @param fallbackSchema The fallback schema when neither key is present.\n\t * @returns The resolved schema.\n\t * @internal\n\t */\n\tprivate 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\treturn firstSchema ?? secondSchema ?? fallbackSchema;\n\t}\n}\n"]}
@@ -3,10 +3,6 @@ import * as ts from "typescript";
3
3
  * Validates whether a type node is allowed for schema generation.
4
4
  */
5
5
  export declare class DisallowedTypeGuard {
6
- /**
7
- * Type names that are not supported for JSON schema generation.
8
- */
9
- private static readonly _DISALLOWED_TYPE_NAMES;
10
6
  /**
11
7
  * Resolve a disallowed type name from a type node.
12
8
  * @param typeNode The type node to inspect.