@twin.org/tools-core 0.0.3-next.23 → 0.0.3-next.24

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.
@@ -260,7 +260,7 @@ export class UtilityTypeSchemaMapper {
260
260
  const valueTypeNode = typeNode.typeArguments?.[1];
261
261
  const valueSchema = valueTypeNode
262
262
  ? JsonSchemaBuilder.mapTypeNodeToSchema(context, valueTypeNode)
263
- : UtilityTypeSchemaMapper.mapJsonLdObjectDefaultSchemaByKey(baseSchema, options.keyToAdd);
263
+ : UtilityTypeSchemaMapper.mapJsonLdObjectDefaultSchemaByKey(context, baseSchema, options.keyToAdd);
264
264
  if (!valueSchema) {
265
265
  return undefined;
266
266
  }
@@ -384,16 +384,17 @@ export class UtilityTypeSchemaMapper {
384
384
  }
385
385
  /**
386
386
  * Resolve a default schema for JsonLdObject utility key additions when the type argument is omitted.
387
+ * @param context The generation context.
387
388
  * @param baseSchema The base object schema being transformed.
388
389
  * @param keyToAdd The key to add when no explicit value type argument is provided.
389
390
  * @returns The resolved default schema for the added key.
390
391
  */
391
- static mapJsonLdObjectDefaultSchemaByKey(baseSchema, keyToAdd) {
392
+ static mapJsonLdObjectDefaultSchemaByKey(context, baseSchema, keyToAdd) {
392
393
  if (keyToAdd === "id" || keyToAdd === "@id") {
393
394
  return UtilityTypeSchemaMapper.mapJsonLdObjectWithIdDefaultIdSchema(baseSchema);
394
395
  }
395
396
  if (keyToAdd === "@context") {
396
- return UtilityTypeSchemaMapper.mapJsonLdObjectWithContextDefaultContextSchema(baseSchema);
397
+ return UtilityTypeSchemaMapper.mapJsonLdObjectWithContextDefaultContextSchema(context, baseSchema);
397
398
  }
398
399
  return UtilityTypeSchemaMapper.mapJsonLdObjectWithTypeDefaultTypeSchema(baseSchema);
399
400
  }
@@ -419,14 +420,28 @@ export class UtilityTypeSchemaMapper {
419
420
  }
420
421
  /**
421
422
  * Resolve default context schema for JsonLdObjectWithContext when Context argument is omitted.
423
+ * @param context The generation context.
422
424
  * @param baseSchema The base object schema being transformed.
423
425
  * @returns The default context schema.
424
426
  */
425
- static mapJsonLdObjectWithContextDefaultContextSchema(baseSchema) {
426
- return UtilityTypeSchemaMapper.mapJsonLdObjectDefaultEitherSchema(baseSchema, "@context", "@context", {
427
- type: "array",
428
- items: { type: "string" }
429
- });
427
+ static mapJsonLdObjectWithContextDefaultContextSchema(context, baseSchema) {
428
+ const existingContextSchema = ObjectTransformer.resolvePropertySchemaFromObjectSchema(baseSchema, "@context");
429
+ if (existingContextSchema) {
430
+ return existingContextSchema;
431
+ }
432
+ // Look up JsonLdContextDefinitionRoot from the cache to get its correct namespace
433
+ const contextDefRootSchema = Object.values(context.schemas)
434
+ .flatMap(packageSchemas => Object.values(packageSchemas ?? {}))
435
+ .find(schema => schema?.$id?.endsWith("JsonLdContextDefinitionRoot"));
436
+ if (contextDefRootSchema?.$id) {
437
+ return {
438
+ $ref: contextDefRootSchema.$id
439
+ };
440
+ }
441
+ // Fallback: return a reference using a common JSON-LD namespace
442
+ return {
443
+ $ref: "https://schema.twindev.org/json-ld/JsonLdContextDefinitionRoot"
444
+ };
430
445
  }
431
446
  /**
432
447
  * Resolve default schema from either of two source keys, with fallback when both are absent.
@@ -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(baseSchema, options.keyToAdd);\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 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 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\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(baseSchema);\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 baseSchema The base object schema being transformed.\n\t * @returns The default context schema.\n\t */\n\tprivate static mapJsonLdObjectWithContextDefaultContextSchema(\n\t\tbaseSchema: IJsonSchema\n\t): IJsonSchema {\n\t\treturn UtilityTypeSchemaMapper.mapJsonLdObjectDefaultEitherSchema(\n\t\t\tbaseSchema,\n\t\t\t\"@context\",\n\t\t\t\"@context\",\n\t\t\t{\n\t\t\t\ttype: \"array\",\n\t\t\t\titems: { type: \"string\" }\n\t\t\t}\n\t\t);\n\t}\n\n\t/**\n\t * Resolve default schema from either of two source keys, with fallback when both are absent.\n\t * @param baseSchema The base object schema 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 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\t// Look up JsonLdContextDefinitionRoot from the cache to get its correct namespace\n\t\tconst contextDefRootSchema = Object.values(context.schemas)\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"]}
@@ -104,6 +104,7 @@ export declare class UtilityTypeSchemaMapper {
104
104
  private static extractRecordLiteralKeys;
105
105
  /**
106
106
  * Resolve a default schema for JsonLdObject utility key additions when the type argument is omitted.
107
+ * @param context The generation context.
107
108
  * @param baseSchema The base object schema being transformed.
108
109
  * @param keyToAdd The key to add when no explicit value type argument is provided.
109
110
  * @returns The resolved default schema for the added key.
@@ -123,6 +124,7 @@ export declare class UtilityTypeSchemaMapper {
123
124
  private static mapJsonLdObjectWithTypeDefaultTypeSchema;
124
125
  /**
125
126
  * Resolve default context schema for JsonLdObjectWithContext when Context argument is omitted.
127
+ * @param context The generation context.
126
128
  * @param baseSchema The base object schema being transformed.
127
129
  * @returns The default context schema.
128
130
  */
package/docs/changelog.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.0.3-next.24](https://github.com/twinfoundation/tools/compare/tools-core-v0.0.3-next.23...tools-core-v0.0.3-next.24) (2026-03-20)
4
+
5
+
6
+ ### Features
7
+
8
+ * use correct json-ld context schema ([c831486](https://github.com/twinfoundation/tools/commit/c8314864a63635556cd5f2912162a2989056e974))
9
+
10
+
11
+ ### Dependencies
12
+
13
+ * The following workspace dependencies were updated
14
+ * dependencies
15
+ * @twin.org/tools-models bumped from 0.0.3-next.23 to 0.0.3-next.24
16
+
3
17
  ## [0.0.3-next.23](https://github.com/twinfoundation/tools/compare/tools-core-v0.0.3-next.22...tools-core-v0.0.3-next.23) (2026-03-20)
4
18
 
5
19
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@twin.org/tools-core",
3
- "version": "0.0.3-next.23",
3
+ "version": "0.0.3-next.24",
4
4
  "description": "Shared utilities and models for tooling packages",
5
5
  "repository": {
6
6
  "type": "git",
@@ -16,7 +16,7 @@
16
16
  "dependencies": {
17
17
  "@twin.org/core": "next",
18
18
  "@twin.org/nameof": "next",
19
- "@twin.org/tools-models": "0.0.3-next.23",
19
+ "@twin.org/tools-models": "0.0.3-next.24",
20
20
  "glob": "13.0.6"
21
21
  },
22
22
  "main": "./dist/es/index.js",