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

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.
@@ -91,6 +91,8 @@ export class FileUtils {
91
91
  `${resolvedBase}.d.ts`,
92
92
  `${resolvedBase}/index.ts`,
93
93
  `${resolvedBase}/index.d.ts`,
94
+ `${baseWithoutExtension}.ts`,
95
+ `${baseWithoutExtension}/index.ts`,
94
96
  `${baseWithoutExtension}.d.ts`,
95
97
  `${baseWithoutExtension}/index.d.ts`
96
98
  ];
@@ -1 +1 @@
1
- {"version":3,"file":"fileUtils.js","sourceRoot":"","sources":["../../../src/utils/fileUtils.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2026 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { existsSync, readFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { globSync } from \"glob\";\n\n/**\n * Utility helpers for TypeScript file and directory paths.\n */\nexport class FileUtils {\n\t/**\n\t * Does the file exist.\n\t * @param filePath The file path.\n\t * @returns True if the file exists.\n\t */\n\tpublic static fileExists(filePath: string): boolean {\n\t\treturn existsSync(filePath);\n\t}\n\n\t/**\n\t * Read the file.\n\t * @param filePath The file path.\n\t * @returns The file contents.\n\t */\n\tpublic static readFile(filePath: string): string {\n\t\treturn readFileSync(filePath, \"utf-8\");\n\t}\n\n\t/**\n\t * Resolve a path.\n\t * @param filePath The file path.\n\t * @returns The resolved path.\n\t */\n\tpublic static resolvePath(filePath: string): string {\n\t\treturn path.resolve(filePath);\n\t}\n\n\t/**\n\t * Get the current working directory.\n\t * @returns The current working directory.\n\t */\n\tpublic static getCurrentWorkingDirectory(): string {\n\t\treturn process.cwd();\n\t}\n\n\t/**\n\t * Normalize path separators for consistent comparisons.\n\t * @param filePath The file path.\n\t * @returns The normalized file path.\n\t */\n\tpublic static normalizeFilePath(filePath: string): string {\n\t\treturn filePath.replaceAll(\"\\\\\", \"/\");\n\t}\n\n\t/**\n\t * Get the directory portion of a file path.\n\t * @param filePath The file path.\n\t * @returns The directory path.\n\t */\n\tpublic static getDirectoryPath(filePath: string): string {\n\t\tconst normalizedPath = FileUtils.normalizeFilePath(filePath);\n\t\tconst lastSeparatorIndex = normalizedPath.lastIndexOf(\"/\");\n\t\treturn lastSeparatorIndex > -1 ? normalizedPath.slice(0, lastSeparatorIndex) : normalizedPath;\n\t}\n\n\t/**\n\t * Resolve a relative path against a base directory.\n\t * @param baseDirectory The base directory.\n\t * @param relativePath The relative path.\n\t * @returns The resolved path.\n\t */\n\tpublic static resolveRelativePath(baseDirectory: string, relativePath: string): string {\n\t\tconst normalizedRelative = FileUtils.normalizeFilePath(relativePath);\n\n\t\t// Return absolute paths unchanged (Windows drive letter or POSIX root)\n\t\tif (path.isAbsolute(normalizedRelative)) {\n\t\t\treturn normalizedRelative;\n\t\t}\n\n\t\tconst normalizedBase = FileUtils.normalizeFilePath(baseDirectory);\n\n\t\tif (path.isAbsolute(normalizedBase)) {\n\t\t\treturn FileUtils.normalizeFilePath(path.resolve(baseDirectory, relativePath));\n\t\t}\n\n\t\t// Base was relative — resolve to absolute then express relative to CWD to preserve relative form\n\t\treturn FileUtils.normalizeFilePath(\n\t\t\tpath.relative(process.cwd(), path.resolve(baseDirectory, relativePath))\n\t\t);\n\t}\n\n\t/**\n\t * Resolve a local import specifier to a TypeScript source file path.\n\t * @param sourceFilePath The importing source file path.\n\t * @param importPath The import specifier.\n\t * @returns The resolved source file path.\n\t */\n\tpublic static resolveImportSourceFilePath(\n\t\tsourceFilePath: string,\n\t\timportPath: string\n\t): string | undefined {\n\t\tconst sourceDirectory = FileUtils.getDirectoryPath(sourceFilePath);\n\t\tconst resolvedBase = FileUtils.resolveRelativePath(sourceDirectory, importPath);\n\t\tconst baseWithoutExtension = resolvedBase.replace(/\\.(c|m)?js$/u, \"\");\n\t\tconst candidates = [\n\t\t\tresolvedBase,\n\t\t\t`${resolvedBase}.ts`,\n\t\t\t`${resolvedBase}.d.ts`,\n\t\t\t`${resolvedBase}/index.ts`,\n\t\t\t`${resolvedBase}/index.d.ts`,\n\t\t\t`${baseWithoutExtension}.d.ts`,\n\t\t\t`${baseWithoutExtension}/index.d.ts`\n\t\t];\n\n\t\tfor (const candidate of candidates) {\n\t\t\tif (FileUtils.fileExists(candidate)) {\n\t\t\t\treturn candidate;\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Determine if the provided path includes glob pattern tokens.\n\t * @param sourceFileOrGlob The direct source file path or glob pattern.\n\t * @returns True if the value is a glob pattern.\n\t */\n\tpublic static isGlobPattern(sourceFileOrGlob: string): boolean {\n\t\treturn /[*?[\\]{}]/u.test(sourceFileOrGlob);\n\t}\n\n\t/**\n\t * Resolve source files from a direct path or a glob pattern.\n\t * @param sourceFileOrGlob The direct source file path or glob pattern.\n\t * @returns The resolved source file paths.\n\t */\n\tpublic static resolveSourceFiles(sourceFileOrGlob: string): string[] {\n\t\tif (!FileUtils.isGlobPattern(sourceFileOrGlob)) {\n\t\t\treturn FileUtils.fileExists(sourceFileOrGlob) ? [sourceFileOrGlob] : [];\n\t\t}\n\n\t\tconst sourceFiles = globSync(sourceFileOrGlob, {\n\t\t\twindowsPathsNoEscape: true,\n\t\t\twithFileTypes: false\n\t\t});\n\n\t\treturn sourceFiles\n\t\t\t.filter(\n\t\t\t\tsourceFile => /\\.(ts|tsx|mts|cts)$/u.test(sourceFile) && FileUtils.fileExists(sourceFile)\n\t\t\t)\n\t\t\t.sort((sourceFileA, sourceFileB) => sourceFileA.localeCompare(sourceFileB));\n\t}\n}\n"]}
1
+ {"version":3,"file":"fileUtils.js","sourceRoot":"","sources":["../../../src/utils/fileUtils.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2026 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { existsSync, readFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { globSync } from \"glob\";\n\n/**\n * Utility helpers for TypeScript file and directory paths.\n */\nexport class FileUtils {\n\t/**\n\t * Does the file exist.\n\t * @param filePath The file path.\n\t * @returns True if the file exists.\n\t */\n\tpublic static fileExists(filePath: string): boolean {\n\t\treturn existsSync(filePath);\n\t}\n\n\t/**\n\t * Read the file.\n\t * @param filePath The file path.\n\t * @returns The file contents.\n\t */\n\tpublic static readFile(filePath: string): string {\n\t\treturn readFileSync(filePath, \"utf-8\");\n\t}\n\n\t/**\n\t * Resolve a path.\n\t * @param filePath The file path.\n\t * @returns The resolved path.\n\t */\n\tpublic static resolvePath(filePath: string): string {\n\t\treturn path.resolve(filePath);\n\t}\n\n\t/**\n\t * Get the current working directory.\n\t * @returns The current working directory.\n\t */\n\tpublic static getCurrentWorkingDirectory(): string {\n\t\treturn process.cwd();\n\t}\n\n\t/**\n\t * Normalize path separators for consistent comparisons.\n\t * @param filePath The file path.\n\t * @returns The normalized file path.\n\t */\n\tpublic static normalizeFilePath(filePath: string): string {\n\t\treturn filePath.replaceAll(\"\\\\\", \"/\");\n\t}\n\n\t/**\n\t * Get the directory portion of a file path.\n\t * @param filePath The file path.\n\t * @returns The directory path.\n\t */\n\tpublic static getDirectoryPath(filePath: string): string {\n\t\tconst normalizedPath = FileUtils.normalizeFilePath(filePath);\n\t\tconst lastSeparatorIndex = normalizedPath.lastIndexOf(\"/\");\n\t\treturn lastSeparatorIndex > -1 ? normalizedPath.slice(0, lastSeparatorIndex) : normalizedPath;\n\t}\n\n\t/**\n\t * Resolve a relative path against a base directory.\n\t * @param baseDirectory The base directory.\n\t * @param relativePath The relative path.\n\t * @returns The resolved path.\n\t */\n\tpublic static resolveRelativePath(baseDirectory: string, relativePath: string): string {\n\t\tconst normalizedRelative = FileUtils.normalizeFilePath(relativePath);\n\n\t\t// Return absolute paths unchanged (Windows drive letter or POSIX root)\n\t\tif (path.isAbsolute(normalizedRelative)) {\n\t\t\treturn normalizedRelative;\n\t\t}\n\n\t\tconst normalizedBase = FileUtils.normalizeFilePath(baseDirectory);\n\n\t\tif (path.isAbsolute(normalizedBase)) {\n\t\t\treturn FileUtils.normalizeFilePath(path.resolve(baseDirectory, relativePath));\n\t\t}\n\n\t\t// Base was relative — resolve to absolute then express relative to CWD to preserve relative form\n\t\treturn FileUtils.normalizeFilePath(\n\t\t\tpath.relative(process.cwd(), path.resolve(baseDirectory, relativePath))\n\t\t);\n\t}\n\n\t/**\n\t * Resolve a local import specifier to a TypeScript source file path.\n\t * @param sourceFilePath The importing source file path.\n\t * @param importPath The import specifier.\n\t * @returns The resolved source file path.\n\t */\n\tpublic static resolveImportSourceFilePath(\n\t\tsourceFilePath: string,\n\t\timportPath: string\n\t): string | undefined {\n\t\tconst sourceDirectory = FileUtils.getDirectoryPath(sourceFilePath);\n\t\tconst resolvedBase = FileUtils.resolveRelativePath(sourceDirectory, importPath);\n\t\tconst baseWithoutExtension = resolvedBase.replace(/\\.(c|m)?js$/u, \"\");\n\t\tconst candidates = [\n\t\t\tresolvedBase,\n\t\t\t`${resolvedBase}.ts`,\n\t\t\t`${resolvedBase}.d.ts`,\n\t\t\t`${resolvedBase}/index.ts`,\n\t\t\t`${resolvedBase}/index.d.ts`,\n\t\t\t`${baseWithoutExtension}.ts`,\n\t\t\t`${baseWithoutExtension}/index.ts`,\n\t\t\t`${baseWithoutExtension}.d.ts`,\n\t\t\t`${baseWithoutExtension}/index.d.ts`\n\t\t];\n\n\t\tfor (const candidate of candidates) {\n\t\t\tif (FileUtils.fileExists(candidate)) {\n\t\t\t\treturn candidate;\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Determine if the provided path includes glob pattern tokens.\n\t * @param sourceFileOrGlob The direct source file path or glob pattern.\n\t * @returns True if the value is a glob pattern.\n\t */\n\tpublic static isGlobPattern(sourceFileOrGlob: string): boolean {\n\t\treturn /[*?[\\]{}]/u.test(sourceFileOrGlob);\n\t}\n\n\t/**\n\t * Resolve source files from a direct path or a glob pattern.\n\t * @param sourceFileOrGlob The direct source file path or glob pattern.\n\t * @returns The resolved source file paths.\n\t */\n\tpublic static resolveSourceFiles(sourceFileOrGlob: string): string[] {\n\t\tif (!FileUtils.isGlobPattern(sourceFileOrGlob)) {\n\t\t\treturn FileUtils.fileExists(sourceFileOrGlob) ? [sourceFileOrGlob] : [];\n\t\t}\n\n\t\tconst sourceFiles = globSync(sourceFileOrGlob, {\n\t\t\twindowsPathsNoEscape: true,\n\t\t\twithFileTypes: false\n\t\t});\n\n\t\treturn sourceFiles\n\t\t\t.filter(\n\t\t\t\tsourceFile => /\\.(ts|tsx|mts|cts)$/u.test(sourceFile) && FileUtils.fileExists(sourceFile)\n\t\t\t)\n\t\t\t.sort((sourceFileA, sourceFileB) => sourceFileA.localeCompare(sourceFileB));\n\t}\n}\n"]}
@@ -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,35 @@ 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
+ const mappedContextReference = JsonSchemaBuilder.resolveReferenceMappingTarget(context, "", "JsonLdContextDefinitionRoot");
433
+ if (mappedContextReference?.schemaId) {
434
+ return {
435
+ $ref: mappedContextReference.schemaId
436
+ };
437
+ }
438
+ // Look up JsonLdContextDefinitionRoot from the cache to get its correct namespace
439
+ const contextDefRootSchema = Object.entries(context.schemas)
440
+ .filter(([packageName]) => packageName !== context.packageName)
441
+ .flatMap(([, packageSchemas]) => Object.values(packageSchemas ?? {}))
442
+ .find(schema => schema?.$id?.endsWith("JsonLdContextDefinitionRoot"));
443
+ if (contextDefRootSchema?.$id) {
444
+ return {
445
+ $ref: contextDefRootSchema.$id
446
+ };
447
+ }
448
+ // Fallback: return a reference using a common JSON-LD namespace
449
+ return {
450
+ $ref: "https://schema.twindev.org/json-ld/JsonLdContextDefinitionRoot"
451
+ };
430
452
  }
431
453
  /**
432
454
  * 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\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"]}
@@ -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,33 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.0.3-next.25](https://github.com/twinfoundation/tools/compare/tools-core-v0.0.3-next.24...tools-core-v0.0.3-next.25) (2026-03-23)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * module resolution ([f3aa10c](https://github.com/twinfoundation/tools/commit/f3aa10c9c9af073de392a2ef6b8411e947e991c2))
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.24 to 0.0.3-next.25
16
+
17
+ ## [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)
18
+
19
+
20
+ ### Features
21
+
22
+ * use correct json-ld context schema ([c831486](https://github.com/twinfoundation/tools/commit/c8314864a63635556cd5f2912162a2989056e974))
23
+
24
+
25
+ ### Dependencies
26
+
27
+ * The following workspace dependencies were updated
28
+ * dependencies
29
+ * @twin.org/tools-models bumped from 0.0.3-next.23 to 0.0.3-next.24
30
+
3
31
  ## [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
32
 
5
33
 
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.25",
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.25",
20
20
  "glob": "13.0.6"
21
21
  },
22
22
  "main": "./dist/es/index.js",