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

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.
@@ -1,6 +1,5 @@
1
1
  // Copyright 2026 IOTA Stiftung.
2
2
  // SPDX-License-Identifier: Apache-2.0.
3
- /* eslint-disable jsdoc/require-param, jsdoc/require-returns */
4
3
  import { Is, StringHelper } from "@twin.org/core";
5
4
  import * as ts from "typescript";
6
5
  import { DiagnosticReporter } from "./diagnosticReporter.js";
@@ -13,6 +12,9 @@ import { Resolver } from "./resolver.js";
13
12
  export class ImportTypeQuerySchemaResolver {
14
13
  /**
15
14
  * Map import type nodes (e.g. import("pkg").Type) to schema references.
15
+ * @param context The generation context.
16
+ * @param typeNode The import type node.
17
+ * @returns The mapped schema.
16
18
  */
17
19
  static mapImportTypeNodeToSchema(context, typeNode) {
18
20
  if (typeNode.isTypeOf ||
@@ -37,6 +39,9 @@ export class ImportTypeQuerySchemaResolver {
37
39
  }
38
40
  /**
39
41
  * Map a type query node (typeof expr) to schema by resolving the referenced variable.
42
+ * @param context The generation context.
43
+ * @param typeNode The type query node.
44
+ * @returns The mapped schema.
40
45
  */
41
46
  static mapTypeQueryNodeToSchema(context, typeNode) {
42
47
  if (ts.isQualifiedName(typeNode.exprName) && ts.isIdentifier(typeNode.exprName.left)) {
@@ -74,6 +79,11 @@ export class ImportTypeQuerySchemaResolver {
74
79
  }
75
80
  /**
76
81
  * Resolve import-type references to local or external schema ids.
82
+ * @param context The generation context.
83
+ * @param moduleSpecifier The import module specifier.
84
+ * @param typeName The imported type name.
85
+ * @param title The stripped schema title.
86
+ * @returns The resolved schema id.
77
87
  */
78
88
  static resolveImportTypeReferenceSchemaId(context, moduleSpecifier, typeName, title) {
79
89
  const mappedReference = JsonSchemaBuilder.resolveReferenceMappingTarget(context, moduleSpecifier, typeName);
@@ -100,7 +110,7 @@ export class ImportTypeQuerySchemaResolver {
100
110
  if (cachedSchemaId) {
101
111
  return cachedSchemaId;
102
112
  }
103
- const declarationResult = Resolver.resolveTypeDeclarationAst(moduleSpecifier, typeName);
113
+ const declarationResult = Resolver.resolveTypeDeclarationAst(moduleSpecifier, typeName, context.activeSourceFile?.fileName);
104
114
  if (!declarationResult) {
105
115
  return mappedReference?.schemaId;
106
116
  }
@@ -116,6 +126,10 @@ export class ImportTypeQuerySchemaResolver {
116
126
  }
117
127
  /**
118
128
  * Resolve a property value from a const object declaration in an imported source file.
129
+ * @param context The generation context.
130
+ * @param objectName The imported object symbol name.
131
+ * @param propertyName The property name to resolve from the object.
132
+ * @returns The resolved literal property value.
119
133
  */
120
134
  static resolveConstObjectProperty(context, objectName, propertyName) {
121
135
  if (!context.activeSourceFile) {
@@ -153,6 +167,10 @@ export class ImportTypeQuerySchemaResolver {
153
167
  }
154
168
  /**
155
169
  * Find a variable declaration by traversing import and export chains.
170
+ * @param sourceFilePath The source file path to inspect.
171
+ * @param variableName The variable name to find.
172
+ * @param visitedFiles The set of visited files to prevent recursion cycles.
173
+ * @returns The matched variable declaration.
156
174
  */
157
175
  static findVariableDeclarationInModuleGraph(sourceFilePath, variableName, visitedFiles) {
158
176
  const normalizedSourceFilePath = FileUtils.normalizeFilePath(sourceFilePath);
@@ -197,6 +215,9 @@ export class ImportTypeQuerySchemaResolver {
197
215
  }
198
216
  /**
199
217
  * Find an imported symbol reference by local identifier name.
218
+ * @param sourceFile The active source file.
219
+ * @param localName The local identifier name.
220
+ * @returns The imported symbol reference.
200
221
  */
201
222
  static findImportedValueReference(sourceFile, localName) {
202
223
  for (const statement of sourceFile.statements) {
@@ -217,6 +238,9 @@ export class ImportTypeQuerySchemaResolver {
217
238
  }
218
239
  /**
219
240
  * Resolve an import declaration module specifier to a source file.
241
+ * @param containingSourceFilePath The path of the file containing the import declaration.
242
+ * @param moduleSpecifier The module specifier to resolve.
243
+ * @returns The resolved source file path.
220
244
  */
221
245
  static resolveImportDeclarationSourceFile(containingSourceFilePath, moduleSpecifier) {
222
246
  const resolvedContainingSourceFilePath = FileUtils.resolvePath(containingSourceFilePath);
@@ -236,6 +260,9 @@ export class ImportTypeQuerySchemaResolver {
236
260
  }
237
261
  /**
238
262
  * Extract a const-object property value from a declaration initializer.
263
+ * @param objectDeclaration The variable declaration containing the object initializer.
264
+ * @param propertyName The property name to resolve.
265
+ * @returns The extracted literal property value.
239
266
  */
240
267
  static extractConstObjectPropertyFromDeclarationInitializer(objectDeclaration, propertyName) {
241
268
  if (!objectDeclaration.initializer) {
@@ -268,6 +295,9 @@ export class ImportTypeQuerySchemaResolver {
268
295
  }
269
296
  /**
270
297
  * Extract a const-object property value from a declaration type annotation.
298
+ * @param declarationTypeNode The declaration type node to inspect.
299
+ * @param propertyName The property name to resolve.
300
+ * @returns The extracted literal property value.
271
301
  */
272
302
  static extractConstObjectPropertyFromDeclarationType(declarationTypeNode, propertyName) {
273
303
  if (ts.isParenthesizedTypeNode(declarationTypeNode)) {
@@ -300,6 +330,8 @@ export class ImportTypeQuerySchemaResolver {
300
330
  }
301
331
  /**
302
332
  * Extract a literal value from a type node when possible.
333
+ * @param typeNode The type node to inspect.
334
+ * @returns The extracted literal value.
303
335
  */
304
336
  static extractLiteralValueFromTypeNode(typeNode) {
305
337
  if (ts.isLiteralTypeNode(typeNode)) {
@@ -314,6 +346,8 @@ export class ImportTypeQuerySchemaResolver {
314
346
  }
315
347
  /**
316
348
  * Extract a referenced type name from an import type qualifier.
349
+ * @param qualifier The import type qualifier.
350
+ * @returns The extracted type name.
317
351
  */
318
352
  static extractImportTypeName(qualifier) {
319
353
  if (!qualifier) {
@@ -1 +1 @@
1
- {"version":3,"file":"importTypeQuerySchemaResolver.js","sourceRoot":"","sources":["../../../src/utils/importTypeQuerySchemaResolver.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC;AACvC,+DAA+D;AAC/D,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAElD,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAGzC;;GAEG;AACH,MAAM,OAAO,6BAA6B;IACzC;;OAEG;IACI,MAAM,CAAC,yBAAyB,CACtC,OAAmC,EACnC,QAA2B;QAE3B,IACC,QAAQ,CAAC,QAAQ;YACjB,CAAC,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACxC,CAAC,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAC7C,CAAC;YACF,kBAAkB,CAAC,MAAM,CACxB,OAAO,EACP,QAAQ,EACR,wDAAwD,EACxD,EAAE,QAAQ,EAAE,QAAQ,CAAC,OAAO,EAAE,EAAE,CAChC,CAAC;YACF,OAAO,EAAE,CAAC;QACX,CAAC;QAED,MAAM,eAAe,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC;QACvD,MAAM,QAAQ,GAAG,6BAA6B,CAAC,qBAAqB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACzF,IAAI,CAAC,QAAQ,EAAE,CAAC;YACf,kBAAkB,CAAC,MAAM,CACxB,OAAO,EACP,QAAQ,EACR,4DAA4D,EAC5D,EAAE,QAAQ,EAAE,eAAe,EAAE,CAC7B,CAAC;YACF,OAAO,EAAE,CAAC;QACX,CAAC;QAED,MAAM,KAAK,GAAG,YAAY,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QACjD,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,2BAA2B,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACvF,MAAM,gBAAgB,GACrB,gBAAgB;YAChB,6BAA6B,CAAC,kCAAkC,CAC/D,OAAO,EACP,eAAe,EACf,QAAQ,EACR,KAAK,CACL,CAAC;QAEH,OAAO;YACN,IAAI,EAAE,gBAAgB,IAAI,GAAG,OAAO,CAAC,SAAS,GAAG,KAAK,EAAE;SACxD,CAAC;IACH,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,wBAAwB,CACrC,OAAmC,EACnC,QAA0B;QAE1B,IAAI,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACtF,MAAM,UAAU,GAAG,iBAAiB,CAAC,+BAA+B,CACnE,OAAO,EACP,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAC3B,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAC5B,CAAC;YACF,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC9B,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;YAC9B,CAAC;YAED,MAAM,aAAa,GAAG,6BAA6B,CAAC,0BAA0B,CAC7E,OAAO,EACP,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAC3B,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAC5B,CAAC;YACF,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;gBACjC,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;YACjC,CAAC;YAED,kBAAkB,CAAC,MAAM,CACxB,OAAO,EACP,QAAQ,EACR,wDAAwD,EACxD,EAAE,MAAM,EAAE,QAAQ,CAAC,OAAO,EAAE,EAAE,CAC9B,CAAC;YACF,OAAO,EAAE,CAAC;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;QACzF,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC;YAC5C,kBAAkB,CAAC,MAAM,CACxB,OAAO,EACP,QAAQ,EACR,wDAAwD,EACxD,EAAE,MAAM,EAAE,QAAQ,CAAC,OAAO,EAAE,EAAE,CAC9B,CAAC;YACF,OAAO,EAAE,CAAC;QACX,CAAC;QAED,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,uBAAuB,CACjE,OAAO,CAAC,gBAAgB,EACxB,QAAQ,CACR,CAAC;QACF,IAAI,gBAAgB,EAAE,CAAC;YACtB,IAAI,gBAAgB,CAAC,IAAI,EAAE,CAAC;gBAC3B,OAAO,iBAAiB,CAAC,mBAAmB,CAAC,OAAO,EAAE,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACpF,CAAC;YACD,IAAI,gBAAgB,CAAC,WAAW,EAAE,CAAC;gBAClC,OAAO,iBAAiB,CAAC,yBAAyB,CAAC,OAAO,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAC;YAC3F,CAAC;QACF,CAAC;QAED,MAAM,uBAAuB,GAAG,iBAAiB,CAAC,8BAA8B,CAC/E,OAAO,EACP,QAAQ,CACR,CAAC;QACF,IAAI,uBAAuB,EAAE,CAAC;YAC7B,OAAO,uBAAuB,CAAC;QAChC,CAAC;QAED,kBAAkB,CAAC,MAAM,CACxB,OAAO,EACP,QAAQ,EACR,wDAAwD,EACxD,EAAE,MAAM,EAAE,QAAQ,EAAE,CACpB,CAAC;QAEF,OAAO,EAAE,CAAC;IACX,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,kCAAkC,CAC/C,OAAmC,EACnC,eAAuB,EACvB,QAAgB,EAChB,KAAa;QAEb,MAAM,eAAe,GAAG,iBAAiB,CAAC,6BAA6B,CACtE,OAAO,EACP,eAAe,EACf,QAAQ,CACR,CAAC;QAEF,IAAI,eAAe,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrC,IAAI,eAAe,EAAE,QAAQ,EAAE,CAAC;gBAC/B,OAAO,eAAe,CAAC,QAAQ,CAAC;YACjC,CAAC;YAED,MAAM,cAAc,GAAG,OAAO,CAAC,gBAAgB,EAAE,QAAQ,CAAC;YAC1D,IAAI,CAAC,cAAc,EAAE,CAAC;gBACrB,OAAO,SAAS,CAAC;YAClB,CAAC;YAED,MAAM,kBAAkB,GAAG,SAAS,CAAC,2BAA2B,CAC/D,cAAc,EACd,eAAe,CACf,CAAC;YACF,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBACzB,OAAO,SAAS,CAAC;YAClB,CAAC;YAED,MAAM,cAAc,GAAG,SAAS,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;YAC9D,IAAI,CAAC,cAAc,EAAE,CAAC;gBACrB,OAAO,SAAS,CAAC;YAClB,CAAC;YAED,iBAAiB,CAAC,qBAAqB,CAAC,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC;YACzF,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC;QAC3D,CAAC;QAED,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC;QACtE,IAAI,cAAc,EAAE,CAAC;YACpB,OAAO,cAAc,CAAC;QACvB,CAAC;QAED,MAAM,iBAAiB,GAAG,QAAQ,CAAC,yBAAyB,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;QACxF,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACxB,OAAO,eAAe,EAAE,QAAQ,CAAC;QAClC,CAAC;QAED,MAAM,eAAe,GAA+B;YACnD,SAAS,EAAE,eAAe,EAAE,SAAS,IAAI,OAAO,CAAC,SAAS;YAC1D,WAAW,EAAE,eAAe;YAC5B,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;YAC1C,OAAO,EAAE,OAAO,CAAC,OAAO;SACxB,CAAC;QAEF,iBAAiB,CAAC,qBAAqB,CACtC,eAAe,EACf,iBAAiB,CAAC,UAAU,CAAC,QAAQ,EACrC,iBAAiB,CAAC,UAAU,CAAC,WAAW,EAAE,EAC1C,EAAE,CACF,CAAC;QAEF,OAAO,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,eAAe,EAAE,QAAQ,CAAC;IACpF,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,0BAA0B,CACxC,OAAmC,EACnC,UAAkB,EAClB,YAAoB;QAEpB,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC;YAC/B,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,MAAM,eAAe,GAAG,6BAA6B,CAAC,0BAA0B,CAC/E,OAAO,CAAC,gBAAgB,EACxB,UAAU,CACV,CAAC;QACF,IAAI,CAAC,eAAe,EAAE,CAAC;YACtB,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,MAAM,YAAY,GAAG,6BAA6B,CAAC,kCAAkC,CACpF,OAAO,CAAC,gBAAgB,CAAC,QAAQ,EACjC,eAAe,CAAC,eAAe,CAC/B,CAAC;QACF,IAAI,CAAC,YAAY,EAAE,CAAC;YACnB,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,MAAM,cAAc,GAAG,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QACxD,IAAI,CAAC,cAAc,EAAE,CAAC;YACrB,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,MAAM,kBAAkB,GAAG,EAAE,CAAC,gBAAgB,CAC7C,YAAY,EACZ,cAAc,EACd,EAAE,CAAC,YAAY,CAAC,MAAM,EACtB,IAAI,CACJ,CAAC;QAEF,IAAI,OAAO,GAAG,kBAAkB,CAAC,UAAU;aACzC,MAAM,CAAC,CAAC,IAAI,EAAgC,EAAE,CAAC,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;aAC5E,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;aACvD,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,eAAe,CAAC,YAAY,CAAC,CAAC;QAE9F,OAAO,KAAK,6BAA6B,CAAC,oCAAoC,CAC7E,YAAY,EACZ,eAAe,CAAC,YAAY,EAC5B,IAAI,GAAG,EAAU,CACjB,CAAC;QAEF,IAAI,CAAC,OAAO,EAAE,CAAC;YACd,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,MAAM,oBAAoB,GACzB,6BAA6B,CAAC,oDAAoD,CACjF,OAAO,EACP,YAAY,CACZ,CAAC;QACH,IAAI,oBAAoB,KAAK,SAAS,EAAE,CAAC;YACxC,OAAO,oBAAoB,CAAC;QAC7B,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YAClB,OAAO,6BAA6B,CAAC,6CAA6C,CACjF,OAAO,CAAC,IAAI,EACZ,YAAY,CACZ,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IAClB,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,oCAAoC,CAClD,cAAsB,EACtB,YAAoB,EACpB,YAAyB;QAEzB,MAAM,wBAAwB,GAAG,SAAS,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;QAC7E,IAAI,YAAY,CAAC,GAAG,CAAC,wBAAwB,CAAC,EAAE,CAAC;YAChD,OAAO,SAAS,CAAC;QAClB,CAAC;QACD,YAAY,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QAE3C,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,EAAE,CAAC;YACb,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,MAAM,UAAU,GAAG,EAAE,CAAC,gBAAgB,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAE7F,MAAM,WAAW,GAAG,UAAU,CAAC,UAAU;aACvC,MAAM,CAAC,CAAC,IAAI,EAAgC,EAAE,CAAC,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;aAC5E,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;aACvD,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;QAC9E,IAAI,WAAW,EAAE,CAAC;YACjB,OAAO,WAAW,CAAC;QACpB,CAAC;QAED,MAAM,eAAe,GAAuB;YAC3C,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ;YAC9B,gBAAgB,EAAE,EAAE,CAAC,oBAAoB,CAAC,QAAQ;YAClD,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM;YAC9B,YAAY,EAAE,IAAI;SAClB,CAAC;QAEF,MAAM,gBAAgB,GAAG,UAAU,CAAC,UAAU;aAC5C,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,mBAAmB,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;aAC3F,OAAO,CAAC,SAAS,CAAC,EAAE;YACpB,MAAM,eAAe,GAAG,SAAS,CAAC,eAAe,CAAC;YAClD,OAAO,eAAe,IAAI,EAAE,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7F,CAAC,CAAC,CAAC;QAEJ,KAAK,MAAM,eAAe,IAAI,gBAAgB,EAAE,CAAC;YAChD,MAAM,kBAAkB,GAAG,EAAE,CAAC,iBAAiB,CAC9C,eAAe,EACf,cAAc,EACd,eAAe,EACf,EAAE,CAAC,GAAG,CACN,CAAC,cAAc,EAAE,gBAAgB,CAAC;YAEnC,IAAI,kBAAkB,EAAE,CAAC;gBACxB,MAAM,mBAAmB,GACxB,6BAA6B,CAAC,oCAAoC,CACjE,kBAAkB,EAClB,YAAY,EACZ,YAAY,CACZ,CAAC;gBACH,IAAI,mBAAmB,EAAE,CAAC;oBACzB,OAAO,mBAAmB,CAAC;gBAC5B,CAAC;YACF,CAAC;QACF,CAAC;QAED,OAAO,SAAS,CAAC;IAClB,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,0BAA0B,CACxC,UAAyB,EACzB,SAAiB;QAOjB,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;YAC/C,IAAI,EAAE,CAAC,mBAAmB,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,eAAe,CAAC,SAAS,CAAC,eAAe,CAAC,EAAE,CAAC;gBACxF,MAAM,QAAQ,GAAG,SAAS,CAAC,YAAY,EAAE,aAAa,CAAC;gBACvD,IAAI,QAAQ,IAAI,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC7C,MAAM,aAAa,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;oBAC/E,IAAI,aAAa,EAAE,CAAC;wBACnB,OAAO;4BACN,eAAe,EAAE,SAAS,CAAC,eAAe,CAAC,IAAI;4BAC/C,YAAY,EAAE,aAAa,CAAC,YAAY,EAAE,IAAI,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI;yBACzE,CAAC;oBACH,CAAC;gBACF,CAAC;YACF,CAAC;QACF,CAAC;QAED,OAAO,SAAS,CAAC;IAClB,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,kCAAkC,CAChD,wBAAgC,EAChC,eAAuB;QAEvB,MAAM,gCAAgC,GAAG,SAAS,CAAC,WAAW,CAAC,wBAAwB,CAAC,CAAC;QAEzF,IAAI,eAAe,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrC,OAAO,CACN,SAAS,CAAC,2BAA2B,CAAC,gCAAgC,EAAE,eAAe,CAAC;gBACxF,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC;oBAC/B,CAAC,CAAC,SAAS,CAAC,2BAA2B,CACrC,gCAAgC,EAChC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CACpC;oBACF,CAAC,CAAC,SAAS,CAAC,CACb,CAAC;QACH,CAAC;QAED,MAAM,eAAe,GAAuB;YAC3C,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ;YAC9B,gBAAgB,EAAE,EAAE,CAAC,oBAAoB,CAAC,QAAQ;YAClD,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM;YAC9B,YAAY,EAAE,IAAI;SAClB,CAAC;QAEF,OAAO,EAAE,CAAC,iBAAiB,CAC1B,eAAe,EACf,gCAAgC,EAChC,eAAe,EACf,EAAE,CAAC,GAAG,CACN,CAAC,cAAc,EAAE,gBAAgB,CAAC;IACpC,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,oDAAoD,CAClE,iBAAyC,EACzC,YAAoB;QAEpB,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,CAAC;YACpC,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,IAAI,UAAkD,CAAC;QACvD,IAAI,EAAE,CAAC,yBAAyB,CAAC,iBAAiB,CAAC,WAAW,CAAC,EAAE,CAAC;YACjE,UAAU,GAAG,iBAAiB,CAAC,WAAW,CAAC;QAC5C,CAAC;aAAM,IACN,EAAE,CAAC,cAAc,CAAC,iBAAiB,CAAC,WAAW,CAAC;YAChD,EAAE,CAAC,yBAAyB,CAAC,iBAAiB,CAAC,WAAW,CAAC,UAAU,CAAC,EACrE,CAAC;YACF,UAAU,GAAG,iBAAiB,CAAC,WAAW,CAAC,UAAU,CAAC;QACvD,CAAC;QAED,IAAI,CAAC,UAAU,EAAE,CAAC;YACjB,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,MAAM,IAAI,GAAG,UAAU,CAAC,UAAU;aAChC,MAAM,CAAC,CAAC,CAAC,EAA8B,EAAE,CAAC,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;aACrE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;QAErE,IAAI,CAAC,IAAI,EAAE,CAAC;YACX,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,IAAI,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YAC1C,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QAC9B,CAAC;QACD,IAAI,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YAC3C,OAAO,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC;QAED,OAAO,SAAS,CAAC;IAClB,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,6CAA6C,CAC3D,mBAAgC,EAChC,YAAoB;QAEpB,IAAI,EAAE,CAAC,uBAAuB,CAAC,mBAAmB,CAAC,EAAE,CAAC;YACrD,OAAO,6BAA6B,CAAC,6CAA6C,CACjF,mBAAmB,CAAC,IAAI,EACxB,YAAY,CACZ,CAAC;QACH,CAAC;QAED,IACC,EAAE,CAAC,kBAAkB,CAAC,mBAAmB,CAAC;YAC1C,mBAAmB,CAAC,QAAQ,KAAK,EAAE,CAAC,UAAU,CAAC,eAAe,EAC7D,CAAC;YACF,OAAO,6BAA6B,CAAC,6CAA6C,CACjF,mBAAmB,CAAC,IAAI,EACxB,YAAY,CACZ,CAAC;QACH,CAAC;QAED,IACC,EAAE,CAAC,mBAAmB,CAAC,mBAAmB,CAAC;YAC3C,EAAE,CAAC,YAAY,CAAC,mBAAmB,CAAC,QAAQ,CAAC;YAC7C,mBAAmB,CAAC,QAAQ,CAAC,IAAI,KAAK,UAAU;YAChD,EAAE,CAAC,UAAU,CAAC,mBAAmB,CAAC,aAAa,CAAC,EAC/C,CAAC;YACF,OAAO,6BAA6B,CAAC,6CAA6C,CACjF,mBAAmB,CAAC,aAAa,CAAC,CAAC,CAAC,EACpC,YAAY,CACZ,CAAC;QACH,CAAC;QAED,IAAI,EAAE,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,EAAE,CAAC;YAC/C,MAAM,iBAAiB,GAAG,mBAAmB,CAAC,OAAO,CAAC,IAAI,CACzD,CAAC,MAAM,EAAkC,EAAE;gBAC1C,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;oBACrD,OAAO,KAAK,CAAC;gBACd,CAAC;gBAED,OAAO,CACN,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,YAAY,CAAC;oBACnE,CAAC,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,YAAY,CAAC;oBACtE,CAAC,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,YAAY,CAAC,CACvE,CAAC;YACH,CAAC,CACD,CAAC;YAEF,IAAI,iBAAiB,EAAE,IAAI,EAAE,CAAC;gBAC7B,OAAO,6BAA6B,CAAC,+BAA+B,CACnE,iBAAiB,CAAC,IAAI,CACtB,CAAC;YACH,CAAC;QACF,CAAC;QAED,OAAO,SAAS,CAAC;IAClB,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,+BAA+B,CAC7C,QAAqB;QAErB,IAAI,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC;YACpC,IAAI,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC1C,OAAO,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC;YAC9B,CAAC;YAED,IAAI,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3C,OAAO,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACtC,CAAC;QACF,CAAC;QAED,OAAO,SAAS,CAAC;IAClB,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,qBAAqB,CAAC,SAAoC;QACxE,IAAI,CAAC,SAAS,EAAE,CAAC;YAChB,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,IAAI,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,CAAC;YAChC,OAAO,SAAS,CAAC,IAAI,CAAC;QACvB,CAAC;QAED,OAAO,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;IAC7B,CAAC;CACD","sourcesContent":["// Copyright 2026 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\n/* eslint-disable jsdoc/require-param, jsdoc/require-returns */\nimport { Is, StringHelper } from \"@twin.org/core\";\nimport type { IJsonSchema } from \"@twin.org/tools-models\";\nimport * as ts from \"typescript\";\nimport { DiagnosticReporter } from \"./diagnosticReporter.js\";\nimport { FileUtils } from \"./fileUtils.js\";\nimport { JsonSchemaBuilder } from \"./jsonSchemaBuilder.js\";\nimport { Resolver } from \"./resolver.js\";\nimport type { ITypeScriptToSchemaContext } from \"../models/ITypeScriptToSchemaContext.js\";\n\n/**\n * Static helpers for import type and type query schema resolution.\n */\nexport class ImportTypeQuerySchemaResolver {\n\t/**\n\t * Map import type nodes (e.g. import(\"pkg\").Type) to schema references.\n\t */\n\tpublic static mapImportTypeNodeToSchema(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.ImportTypeNode\n\t): IJsonSchema | undefined {\n\t\tif (\n\t\t\ttypeNode.isTypeOf ||\n\t\t\t!ts.isLiteralTypeNode(typeNode.argument) ||\n\t\t\t!ts.isStringLiteral(typeNode.argument.literal)\n\t\t) {\n\t\t\tDiagnosticReporter.report(\n\t\t\t\tcontext,\n\t\t\t\ttypeNode,\n\t\t\t\t\"jsonSchemaBuilder.diagnostic.unsupportedImportTypeForm\",\n\t\t\t\t{ argument: typeNode.getText() }\n\t\t\t);\n\t\t\treturn {};\n\t\t}\n\n\t\tconst moduleSpecifier = typeNode.argument.literal.text;\n\t\tconst typeName = ImportTypeQuerySchemaResolver.extractImportTypeName(typeNode.qualifier);\n\t\tif (!typeName) {\n\t\t\tDiagnosticReporter.report(\n\t\t\t\tcontext,\n\t\t\t\ttypeNode,\n\t\t\t\t\"jsonSchemaBuilder.diagnostic.unresolvedImportTypeQualifier\",\n\t\t\t\t{ argument: moduleSpecifier }\n\t\t\t);\n\t\t\treturn {};\n\t\t}\n\n\t\tconst title = StringHelper.stripPrefix(typeName);\n\t\tconst existingSchemaId = JsonSchemaBuilder.findExistingSchemaIdByTitle(context, title);\n\t\tconst resolvedSchemaId =\n\t\t\texistingSchemaId ??\n\t\t\tImportTypeQuerySchemaResolver.resolveImportTypeReferenceSchemaId(\n\t\t\t\tcontext,\n\t\t\t\tmoduleSpecifier,\n\t\t\t\ttypeName,\n\t\t\t\ttitle\n\t\t\t);\n\n\t\treturn {\n\t\t\t$ref: resolvedSchemaId ?? `${context.namespace}${title}`\n\t\t};\n\t}\n\n\t/**\n\t * Map a type query node (typeof expr) to schema by resolving the referenced variable.\n\t */\n\tpublic static mapTypeQueryNodeToSchema(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeQueryNode\n\t): IJsonSchema {\n\t\tif (ts.isQualifiedName(typeNode.exprName) && ts.isIdentifier(typeNode.exprName.left)) {\n\t\t\tconst localValue = JsonSchemaBuilder.resolveLocalConstObjectProperty(\n\t\t\t\tcontext,\n\t\t\t\ttypeNode.exprName.left.text,\n\t\t\t\ttypeNode.exprName.right.text\n\t\t\t);\n\t\t\tif (localValue !== undefined) {\n\t\t\t\treturn { const: localValue };\n\t\t\t}\n\n\t\t\tconst importedValue = ImportTypeQuerySchemaResolver.resolveConstObjectProperty(\n\t\t\t\tcontext,\n\t\t\t\ttypeNode.exprName.left.text,\n\t\t\t\ttypeNode.exprName.right.text\n\t\t\t);\n\t\t\tif (importedValue !== undefined) {\n\t\t\t\treturn { const: importedValue };\n\t\t\t}\n\n\t\t\tDiagnosticReporter.report(\n\t\t\t\tcontext,\n\t\t\t\ttypeNode,\n\t\t\t\t\"jsonSchemaBuilder.diagnostic.unresolvedTypeQueryTarget\",\n\t\t\t\t{ target: typeNode.getText() }\n\t\t\t);\n\t\t\treturn {};\n\t\t}\n\n\t\tconst exprName = ts.isIdentifier(typeNode.exprName) ? typeNode.exprName.text : undefined;\n\t\tif (!exprName || !context.activeSourceFile) {\n\t\t\tDiagnosticReporter.report(\n\t\t\t\tcontext,\n\t\t\t\ttypeNode,\n\t\t\t\t\"jsonSchemaBuilder.diagnostic.unresolvedTypeQueryTarget\",\n\t\t\t\t{ target: typeNode.getText() }\n\t\t\t);\n\t\t\treturn {};\n\t\t}\n\n\t\tconst localDeclaration = JsonSchemaBuilder.findVariableDeclaration(\n\t\t\tcontext.activeSourceFile,\n\t\t\texprName\n\t\t);\n\t\tif (localDeclaration) {\n\t\t\tif (localDeclaration.type) {\n\t\t\t\treturn JsonSchemaBuilder.mapTypeNodeToSchema(context, localDeclaration.type) ?? {};\n\t\t\t}\n\t\t\tif (localDeclaration.initializer) {\n\t\t\t\treturn JsonSchemaBuilder.inferSchemaFromExpression(context, localDeclaration.initializer);\n\t\t\t}\n\t\t}\n\n\t\tconst importedTypeQuerySchema = JsonSchemaBuilder.resolveImportedTypeQuerySchema(\n\t\t\tcontext,\n\t\t\texprName\n\t\t);\n\t\tif (importedTypeQuerySchema) {\n\t\t\treturn importedTypeQuerySchema;\n\t\t}\n\n\t\tDiagnosticReporter.report(\n\t\t\tcontext,\n\t\t\ttypeNode,\n\t\t\t\"jsonSchemaBuilder.diagnostic.unresolvedTypeQueryTarget\",\n\t\t\t{ target: exprName }\n\t\t);\n\n\t\treturn {};\n\t}\n\n\t/**\n\t * Resolve import-type references to local or external schema ids.\n\t */\n\tpublic static resolveImportTypeReferenceSchemaId(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tmoduleSpecifier: string,\n\t\ttypeName: string,\n\t\ttitle: string\n\t): string | undefined {\n\t\tconst mappedReference = JsonSchemaBuilder.resolveReferenceMappingTarget(\n\t\t\tcontext,\n\t\t\tmoduleSpecifier,\n\t\t\ttypeName\n\t\t);\n\n\t\tif (moduleSpecifier.startsWith(\".\")) {\n\t\t\tif (mappedReference?.schemaId) {\n\t\t\t\treturn mappedReference.schemaId;\n\t\t\t}\n\n\t\t\tconst activeFilePath = context.activeSourceFile?.fileName;\n\t\t\tif (!activeFilePath) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst resolvedImportPath = FileUtils.resolveImportSourceFilePath(\n\t\t\t\tactiveFilePath,\n\t\t\t\tmoduleSpecifier\n\t\t\t);\n\t\t\tif (!resolvedImportPath) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst importedSource = FileUtils.readFile(resolvedImportPath);\n\t\t\tif (!importedSource) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tJsonSchemaBuilder.parseAllObjectSchemas(context, resolvedImportPath, importedSource, []);\n\t\t\treturn context.schemas[context.packageName]?.[title]?.$id;\n\t\t}\n\n\t\tconst cachedSchemaId = context.schemas[moduleSpecifier]?.[title]?.$id;\n\t\tif (cachedSchemaId) {\n\t\t\treturn cachedSchemaId;\n\t\t}\n\n\t\tconst declarationResult = Resolver.resolveTypeDeclarationAst(moduleSpecifier, typeName);\n\t\tif (!declarationResult) {\n\t\t\treturn mappedReference?.schemaId;\n\t\t}\n\n\t\tconst externalContext: ITypeScriptToSchemaContext = {\n\t\t\tnamespace: mappedReference?.namespace ?? context.namespace,\n\t\t\tpackageName: moduleSpecifier,\n\t\t\tschemas: context.schemas,\n\t\t\tactiveSourceFile: context.activeSourceFile,\n\t\t\toptions: context.options\n\t\t};\n\n\t\tJsonSchemaBuilder.parseAllObjectSchemas(\n\t\t\texternalContext,\n\t\t\tdeclarationResult.sourceFile.fileName,\n\t\t\tdeclarationResult.sourceFile.getFullText(),\n\t\t\t[]\n\t\t);\n\n\t\treturn context.schemas[moduleSpecifier]?.[title]?.$id ?? mappedReference?.schemaId;\n\t}\n\n\t/**\n\t * Resolve a property value from a const object declaration in an imported source file.\n\t */\n\tprivate static resolveConstObjectProperty(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tobjectName: string,\n\t\tpropertyName: string\n\t): string | number | undefined {\n\t\tif (!context.activeSourceFile) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst importReference = ImportTypeQuerySchemaResolver.findImportedValueReference(\n\t\t\tcontext.activeSourceFile,\n\t\t\tobjectName\n\t\t);\n\t\tif (!importReference) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst resolvedPath = ImportTypeQuerySchemaResolver.resolveImportDeclarationSourceFile(\n\t\t\tcontext.activeSourceFile.fileName,\n\t\t\timportReference.moduleSpecifier\n\t\t);\n\t\tif (!resolvedPath) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst importedSource = FileUtils.readFile(resolvedPath);\n\t\tif (!importedSource) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst importedSourceFile = ts.createSourceFile(\n\t\t\tresolvedPath,\n\t\t\timportedSource,\n\t\t\tts.ScriptTarget.Latest,\n\t\t\ttrue\n\t\t);\n\n\t\tlet objDecl = importedSourceFile.statements\n\t\t\t.filter((stmt): stmt is ts.VariableStatement => ts.isVariableStatement(stmt))\n\t\t\t.flatMap(stmt => [...stmt.declarationList.declarations])\n\t\t\t.find(decl => ts.isIdentifier(decl.name) && decl.name.text === importReference.importedName);\n\n\t\tobjDecl ??= ImportTypeQuerySchemaResolver.findVariableDeclarationInModuleGraph(\n\t\t\tresolvedPath,\n\t\t\timportReference.importedName,\n\t\t\tnew Set<string>()\n\t\t);\n\n\t\tif (!objDecl) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst valueFromInitializer =\n\t\t\tImportTypeQuerySchemaResolver.extractConstObjectPropertyFromDeclarationInitializer(\n\t\t\t\tobjDecl,\n\t\t\t\tpropertyName\n\t\t\t);\n\t\tif (valueFromInitializer !== undefined) {\n\t\t\treturn valueFromInitializer;\n\t\t}\n\n\t\tif (objDecl.type) {\n\t\t\treturn ImportTypeQuerySchemaResolver.extractConstObjectPropertyFromDeclarationType(\n\t\t\t\tobjDecl.type,\n\t\t\t\tpropertyName\n\t\t\t);\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Find a variable declaration by traversing import and export chains.\n\t */\n\tprivate static findVariableDeclarationInModuleGraph(\n\t\tsourceFilePath: string,\n\t\tvariableName: string,\n\t\tvisitedFiles: Set<string>\n\t): ts.VariableDeclaration | undefined {\n\t\tconst normalizedSourceFilePath = FileUtils.normalizeFilePath(sourceFilePath);\n\t\tif (visitedFiles.has(normalizedSourceFilePath)) {\n\t\t\treturn undefined;\n\t\t}\n\t\tvisitedFiles.add(normalizedSourceFilePath);\n\n\t\tconst source = FileUtils.readFile(sourceFilePath);\n\t\tif (!source) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst sourceFile = ts.createSourceFile(sourceFilePath, source, ts.ScriptTarget.Latest, true);\n\n\t\tconst declaration = sourceFile.statements\n\t\t\t.filter((stmt): stmt is ts.VariableStatement => ts.isVariableStatement(stmt))\n\t\t\t.flatMap(stmt => [...stmt.declarationList.declarations])\n\t\t\t.find(decl => ts.isIdentifier(decl.name) && decl.name.text === variableName);\n\t\tif (declaration) {\n\t\t\treturn declaration;\n\t\t}\n\n\t\tconst compilerOptions: ts.CompilerOptions = {\n\t\t\tmodule: ts.ModuleKind.NodeNext,\n\t\t\tmoduleResolution: ts.ModuleResolutionKind.NodeNext,\n\t\t\ttarget: ts.ScriptTarget.ESNext,\n\t\t\tskipLibCheck: true\n\t\t};\n\n\t\tconst moduleSpecifiers = sourceFile.statements\n\t\t\t.filter(statement => ts.isExportDeclaration(statement) || ts.isImportDeclaration(statement))\n\t\t\t.flatMap(statement => {\n\t\t\t\tconst moduleSpecifier = statement.moduleSpecifier;\n\t\t\t\treturn moduleSpecifier && ts.isStringLiteral(moduleSpecifier) ? [moduleSpecifier.text] : [];\n\t\t\t});\n\n\t\tfor (const moduleSpecifier of moduleSpecifiers) {\n\t\t\tconst resolvedModulePath = ts.resolveModuleName(\n\t\t\t\tmoduleSpecifier,\n\t\t\t\tsourceFilePath,\n\t\t\t\tcompilerOptions,\n\t\t\t\tts.sys\n\t\t\t).resolvedModule?.resolvedFileName;\n\n\t\t\tif (resolvedModulePath) {\n\t\t\t\tconst declarationInModule =\n\t\t\t\t\tImportTypeQuerySchemaResolver.findVariableDeclarationInModuleGraph(\n\t\t\t\t\t\tresolvedModulePath,\n\t\t\t\t\t\tvariableName,\n\t\t\t\t\t\tvisitedFiles\n\t\t\t\t\t);\n\t\t\t\tif (declarationInModule) {\n\t\t\t\t\treturn declarationInModule;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Find an imported symbol reference by local identifier name.\n\t */\n\tprivate static findImportedValueReference(\n\t\tsourceFile: ts.SourceFile,\n\t\tlocalName: string\n\t):\n\t\t| {\n\t\t\t\tmoduleSpecifier: string;\n\t\t\t\timportedName: string;\n\t\t }\n\t\t| undefined {\n\t\tfor (const statement of sourceFile.statements) {\n\t\t\tif (ts.isImportDeclaration(statement) && ts.isStringLiteral(statement.moduleSpecifier)) {\n\t\t\t\tconst bindings = statement.importClause?.namedBindings;\n\t\t\t\tif (bindings && ts.isNamedImports(bindings)) {\n\t\t\t\t\tconst importElement = bindings.elements.find(el => el.name.text === localName);\n\t\t\t\t\tif (importElement) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tmoduleSpecifier: statement.moduleSpecifier.text,\n\t\t\t\t\t\t\timportedName: importElement.propertyName?.text ?? importElement.name.text\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Resolve an import declaration module specifier to a source file.\n\t */\n\tprivate static resolveImportDeclarationSourceFile(\n\t\tcontainingSourceFilePath: string,\n\t\tmoduleSpecifier: string\n\t): string | undefined {\n\t\tconst resolvedContainingSourceFilePath = FileUtils.resolvePath(containingSourceFilePath);\n\n\t\tif (moduleSpecifier.startsWith(\".\")) {\n\t\t\treturn (\n\t\t\t\tFileUtils.resolveImportSourceFilePath(resolvedContainingSourceFilePath, moduleSpecifier) ??\n\t\t\t\t(moduleSpecifier.endsWith(\".js\")\n\t\t\t\t\t? FileUtils.resolveImportSourceFilePath(\n\t\t\t\t\t\t\tresolvedContainingSourceFilePath,\n\t\t\t\t\t\t\t`${moduleSpecifier.slice(0, -3)}.ts`\n\t\t\t\t\t\t)\n\t\t\t\t\t: undefined)\n\t\t\t);\n\t\t}\n\n\t\tconst compilerOptions: ts.CompilerOptions = {\n\t\t\tmodule: ts.ModuleKind.NodeNext,\n\t\t\tmoduleResolution: ts.ModuleResolutionKind.NodeNext,\n\t\t\ttarget: ts.ScriptTarget.ESNext,\n\t\t\tskipLibCheck: true\n\t\t};\n\n\t\treturn ts.resolveModuleName(\n\t\t\tmoduleSpecifier,\n\t\t\tresolvedContainingSourceFilePath,\n\t\t\tcompilerOptions,\n\t\t\tts.sys\n\t\t).resolvedModule?.resolvedFileName;\n\t}\n\n\t/**\n\t * Extract a const-object property value from a declaration initializer.\n\t */\n\tprivate static extractConstObjectPropertyFromDeclarationInitializer(\n\t\tobjectDeclaration: ts.VariableDeclaration,\n\t\tpropertyName: string\n\t): string | number | undefined {\n\t\tif (!objectDeclaration.initializer) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tlet objLiteral: ts.ObjectLiteralExpression | undefined;\n\t\tif (ts.isObjectLiteralExpression(objectDeclaration.initializer)) {\n\t\t\tobjLiteral = objectDeclaration.initializer;\n\t\t} else if (\n\t\t\tts.isAsExpression(objectDeclaration.initializer) &&\n\t\t\tts.isObjectLiteralExpression(objectDeclaration.initializer.expression)\n\t\t) {\n\t\t\tobjLiteral = objectDeclaration.initializer.expression;\n\t\t}\n\n\t\tif (!objLiteral) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst prop = objLiteral.properties\n\t\t\t.filter((p): p is ts.PropertyAssignment => ts.isPropertyAssignment(p))\n\t\t\t.find(p => ts.isIdentifier(p.name) && p.name.text === propertyName);\n\n\t\tif (!prop) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (ts.isStringLiteral(prop.initializer)) {\n\t\t\treturn prop.initializer.text;\n\t\t}\n\t\tif (ts.isNumericLiteral(prop.initializer)) {\n\t\t\treturn Number(prop.initializer.text);\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Extract a const-object property value from a declaration type annotation.\n\t */\n\tprivate static extractConstObjectPropertyFromDeclarationType(\n\t\tdeclarationTypeNode: ts.TypeNode,\n\t\tpropertyName: string\n\t): string | number | undefined {\n\t\tif (ts.isParenthesizedTypeNode(declarationTypeNode)) {\n\t\t\treturn ImportTypeQuerySchemaResolver.extractConstObjectPropertyFromDeclarationType(\n\t\t\t\tdeclarationTypeNode.type,\n\t\t\t\tpropertyName\n\t\t\t);\n\t\t}\n\n\t\tif (\n\t\t\tts.isTypeOperatorNode(declarationTypeNode) &&\n\t\t\tdeclarationTypeNode.operator === ts.SyntaxKind.ReadonlyKeyword\n\t\t) {\n\t\t\treturn ImportTypeQuerySchemaResolver.extractConstObjectPropertyFromDeclarationType(\n\t\t\t\tdeclarationTypeNode.type,\n\t\t\t\tpropertyName\n\t\t\t);\n\t\t}\n\n\t\tif (\n\t\t\tts.isTypeReferenceNode(declarationTypeNode) &&\n\t\t\tts.isIdentifier(declarationTypeNode.typeName) &&\n\t\t\tdeclarationTypeNode.typeName.text === \"Readonly\" &&\n\t\t\tIs.arrayValue(declarationTypeNode.typeArguments)\n\t\t) {\n\t\t\treturn ImportTypeQuerySchemaResolver.extractConstObjectPropertyFromDeclarationType(\n\t\t\t\tdeclarationTypeNode.typeArguments[0],\n\t\t\t\tpropertyName\n\t\t\t);\n\t\t}\n\n\t\tif (ts.isTypeLiteralNode(declarationTypeNode)) {\n\t\t\tconst propertySignature = declarationTypeNode.members.find(\n\t\t\t\t(member): member is ts.PropertySignature => {\n\t\t\t\t\tif (!ts.isPropertySignature(member) || !member.name) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t(ts.isIdentifier(member.name) && member.name.text === propertyName) ||\n\t\t\t\t\t\t(ts.isStringLiteral(member.name) && member.name.text === propertyName) ||\n\t\t\t\t\t\t(ts.isNumericLiteral(member.name) && member.name.text === propertyName)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t);\n\n\t\t\tif (propertySignature?.type) {\n\t\t\t\treturn ImportTypeQuerySchemaResolver.extractLiteralValueFromTypeNode(\n\t\t\t\t\tpropertySignature.type\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Extract a literal value from a type node when possible.\n\t */\n\tprivate static extractLiteralValueFromTypeNode(\n\t\ttypeNode: ts.TypeNode\n\t): string | number | undefined {\n\t\tif (ts.isLiteralTypeNode(typeNode)) {\n\t\t\tif (ts.isStringLiteral(typeNode.literal)) {\n\t\t\t\treturn typeNode.literal.text;\n\t\t\t}\n\n\t\t\tif (ts.isNumericLiteral(typeNode.literal)) {\n\t\t\t\treturn Number(typeNode.literal.text);\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Extract a referenced type name from an import type qualifier.\n\t */\n\tprivate static extractImportTypeName(qualifier: ts.EntityName | undefined): string | undefined {\n\t\tif (!qualifier) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (ts.isIdentifier(qualifier)) {\n\t\t\treturn qualifier.text;\n\t\t}\n\n\t\treturn qualifier.right.text;\n\t}\n}\n"]}
1
+ {"version":3,"file":"importTypeQuerySchemaResolver.js","sourceRoot":"","sources":["../../../src/utils/importTypeQuerySchemaResolver.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2026 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { Is, StringHelper } from \"@twin.org/core\";\nimport type { IJsonSchema } from \"@twin.org/tools-models\";\nimport * as ts from \"typescript\";\nimport { DiagnosticReporter } from \"./diagnosticReporter.js\";\nimport { FileUtils } from \"./fileUtils.js\";\nimport { JsonSchemaBuilder } from \"./jsonSchemaBuilder.js\";\nimport { Resolver } from \"./resolver.js\";\nimport type { ITypeScriptToSchemaContext } from \"../models/ITypeScriptToSchemaContext.js\";\n\n/**\n * Static helpers for import type and type query schema resolution.\n */\nexport class ImportTypeQuerySchemaResolver {\n\t/**\n\t * Map import type nodes (e.g. import(\"pkg\").Type) to schema references.\n\t * @param context The generation context.\n\t * @param typeNode The import type node.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapImportTypeNodeToSchema(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.ImportTypeNode\n\t): IJsonSchema | undefined {\n\t\tif (\n\t\t\ttypeNode.isTypeOf ||\n\t\t\t!ts.isLiteralTypeNode(typeNode.argument) ||\n\t\t\t!ts.isStringLiteral(typeNode.argument.literal)\n\t\t) {\n\t\t\tDiagnosticReporter.report(\n\t\t\t\tcontext,\n\t\t\t\ttypeNode,\n\t\t\t\t\"jsonSchemaBuilder.diagnostic.unsupportedImportTypeForm\",\n\t\t\t\t{ argument: typeNode.getText() }\n\t\t\t);\n\t\t\treturn {};\n\t\t}\n\n\t\tconst moduleSpecifier = typeNode.argument.literal.text;\n\t\tconst typeName = ImportTypeQuerySchemaResolver.extractImportTypeName(typeNode.qualifier);\n\t\tif (!typeName) {\n\t\t\tDiagnosticReporter.report(\n\t\t\t\tcontext,\n\t\t\t\ttypeNode,\n\t\t\t\t\"jsonSchemaBuilder.diagnostic.unresolvedImportTypeQualifier\",\n\t\t\t\t{ argument: moduleSpecifier }\n\t\t\t);\n\t\t\treturn {};\n\t\t}\n\n\t\tconst title = StringHelper.stripPrefix(typeName);\n\t\tconst existingSchemaId = JsonSchemaBuilder.findExistingSchemaIdByTitle(context, title);\n\t\tconst resolvedSchemaId =\n\t\t\texistingSchemaId ??\n\t\t\tImportTypeQuerySchemaResolver.resolveImportTypeReferenceSchemaId(\n\t\t\t\tcontext,\n\t\t\t\tmoduleSpecifier,\n\t\t\t\ttypeName,\n\t\t\t\ttitle\n\t\t\t);\n\n\t\treturn {\n\t\t\t$ref: resolvedSchemaId ?? `${context.namespace}${title}`\n\t\t};\n\t}\n\n\t/**\n\t * Map a type query node (typeof expr) to schema by resolving the referenced variable.\n\t * @param context The generation context.\n\t * @param typeNode The type query node.\n\t * @returns The mapped schema.\n\t */\n\tpublic static mapTypeQueryNodeToSchema(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\ttypeNode: ts.TypeQueryNode\n\t): IJsonSchema {\n\t\tif (ts.isQualifiedName(typeNode.exprName) && ts.isIdentifier(typeNode.exprName.left)) {\n\t\t\tconst localValue = JsonSchemaBuilder.resolveLocalConstObjectProperty(\n\t\t\t\tcontext,\n\t\t\t\ttypeNode.exprName.left.text,\n\t\t\t\ttypeNode.exprName.right.text\n\t\t\t);\n\t\t\tif (localValue !== undefined) {\n\t\t\t\treturn { const: localValue };\n\t\t\t}\n\n\t\t\tconst importedValue = ImportTypeQuerySchemaResolver.resolveConstObjectProperty(\n\t\t\t\tcontext,\n\t\t\t\ttypeNode.exprName.left.text,\n\t\t\t\ttypeNode.exprName.right.text\n\t\t\t);\n\t\t\tif (importedValue !== undefined) {\n\t\t\t\treturn { const: importedValue };\n\t\t\t}\n\n\t\t\tDiagnosticReporter.report(\n\t\t\t\tcontext,\n\t\t\t\ttypeNode,\n\t\t\t\t\"jsonSchemaBuilder.diagnostic.unresolvedTypeQueryTarget\",\n\t\t\t\t{ target: typeNode.getText() }\n\t\t\t);\n\t\t\treturn {};\n\t\t}\n\n\t\tconst exprName = ts.isIdentifier(typeNode.exprName) ? typeNode.exprName.text : undefined;\n\t\tif (!exprName || !context.activeSourceFile) {\n\t\t\tDiagnosticReporter.report(\n\t\t\t\tcontext,\n\t\t\t\ttypeNode,\n\t\t\t\t\"jsonSchemaBuilder.diagnostic.unresolvedTypeQueryTarget\",\n\t\t\t\t{ target: typeNode.getText() }\n\t\t\t);\n\t\t\treturn {};\n\t\t}\n\n\t\tconst localDeclaration = JsonSchemaBuilder.findVariableDeclaration(\n\t\t\tcontext.activeSourceFile,\n\t\t\texprName\n\t\t);\n\t\tif (localDeclaration) {\n\t\t\tif (localDeclaration.type) {\n\t\t\t\treturn JsonSchemaBuilder.mapTypeNodeToSchema(context, localDeclaration.type) ?? {};\n\t\t\t}\n\t\t\tif (localDeclaration.initializer) {\n\t\t\t\treturn JsonSchemaBuilder.inferSchemaFromExpression(context, localDeclaration.initializer);\n\t\t\t}\n\t\t}\n\n\t\tconst importedTypeQuerySchema = JsonSchemaBuilder.resolveImportedTypeQuerySchema(\n\t\t\tcontext,\n\t\t\texprName\n\t\t);\n\t\tif (importedTypeQuerySchema) {\n\t\t\treturn importedTypeQuerySchema;\n\t\t}\n\n\t\tDiagnosticReporter.report(\n\t\t\tcontext,\n\t\t\ttypeNode,\n\t\t\t\"jsonSchemaBuilder.diagnostic.unresolvedTypeQueryTarget\",\n\t\t\t{ target: exprName }\n\t\t);\n\n\t\treturn {};\n\t}\n\n\t/**\n\t * Resolve import-type references to local or external schema ids.\n\t * @param context The generation context.\n\t * @param moduleSpecifier The import module specifier.\n\t * @param typeName The imported type name.\n\t * @param title The stripped schema title.\n\t * @returns The resolved schema id.\n\t */\n\tpublic static resolveImportTypeReferenceSchemaId(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tmoduleSpecifier: string,\n\t\ttypeName: string,\n\t\ttitle: string\n\t): string | undefined {\n\t\tconst mappedReference = JsonSchemaBuilder.resolveReferenceMappingTarget(\n\t\t\tcontext,\n\t\t\tmoduleSpecifier,\n\t\t\ttypeName\n\t\t);\n\n\t\tif (moduleSpecifier.startsWith(\".\")) {\n\t\t\tif (mappedReference?.schemaId) {\n\t\t\t\treturn mappedReference.schemaId;\n\t\t\t}\n\n\t\t\tconst activeFilePath = context.activeSourceFile?.fileName;\n\t\t\tif (!activeFilePath) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst resolvedImportPath = FileUtils.resolveImportSourceFilePath(\n\t\t\t\tactiveFilePath,\n\t\t\t\tmoduleSpecifier\n\t\t\t);\n\t\t\tif (!resolvedImportPath) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst importedSource = FileUtils.readFile(resolvedImportPath);\n\t\t\tif (!importedSource) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tJsonSchemaBuilder.parseAllObjectSchemas(context, resolvedImportPath, importedSource, []);\n\t\t\treturn context.schemas[context.packageName]?.[title]?.$id;\n\t\t}\n\n\t\tconst cachedSchemaId = context.schemas[moduleSpecifier]?.[title]?.$id;\n\t\tif (cachedSchemaId) {\n\t\t\treturn cachedSchemaId;\n\t\t}\n\n\t\tconst declarationResult = Resolver.resolveTypeDeclarationAst(\n\t\t\tmoduleSpecifier,\n\t\t\ttypeName,\n\t\t\tcontext.activeSourceFile?.fileName\n\t\t);\n\t\tif (!declarationResult) {\n\t\t\treturn mappedReference?.schemaId;\n\t\t}\n\n\t\tconst externalContext: ITypeScriptToSchemaContext = {\n\t\t\tnamespace: mappedReference?.namespace ?? context.namespace,\n\t\t\tpackageName: moduleSpecifier,\n\t\t\tschemas: context.schemas,\n\t\t\tactiveSourceFile: context.activeSourceFile,\n\t\t\toptions: context.options\n\t\t};\n\n\t\tJsonSchemaBuilder.parseAllObjectSchemas(\n\t\t\texternalContext,\n\t\t\tdeclarationResult.sourceFile.fileName,\n\t\t\tdeclarationResult.sourceFile.getFullText(),\n\t\t\t[]\n\t\t);\n\n\t\treturn context.schemas[moduleSpecifier]?.[title]?.$id ?? mappedReference?.schemaId;\n\t}\n\n\t/**\n\t * Resolve a property value from a const object declaration in an imported source file.\n\t * @param context The generation context.\n\t * @param objectName The imported object symbol name.\n\t * @param propertyName The property name to resolve from the object.\n\t * @returns The resolved literal property value.\n\t */\n\tprivate static resolveConstObjectProperty(\n\t\tcontext: ITypeScriptToSchemaContext,\n\t\tobjectName: string,\n\t\tpropertyName: string\n\t): string | number | undefined {\n\t\tif (!context.activeSourceFile) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst importReference = ImportTypeQuerySchemaResolver.findImportedValueReference(\n\t\t\tcontext.activeSourceFile,\n\t\t\tobjectName\n\t\t);\n\t\tif (!importReference) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst resolvedPath = ImportTypeQuerySchemaResolver.resolveImportDeclarationSourceFile(\n\t\t\tcontext.activeSourceFile.fileName,\n\t\t\timportReference.moduleSpecifier\n\t\t);\n\t\tif (!resolvedPath) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst importedSource = FileUtils.readFile(resolvedPath);\n\t\tif (!importedSource) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst importedSourceFile = ts.createSourceFile(\n\t\t\tresolvedPath,\n\t\t\timportedSource,\n\t\t\tts.ScriptTarget.Latest,\n\t\t\ttrue\n\t\t);\n\n\t\tlet objDecl = importedSourceFile.statements\n\t\t\t.filter((stmt): stmt is ts.VariableStatement => ts.isVariableStatement(stmt))\n\t\t\t.flatMap(stmt => [...stmt.declarationList.declarations])\n\t\t\t.find(decl => ts.isIdentifier(decl.name) && decl.name.text === importReference.importedName);\n\n\t\tobjDecl ??= ImportTypeQuerySchemaResolver.findVariableDeclarationInModuleGraph(\n\t\t\tresolvedPath,\n\t\t\timportReference.importedName,\n\t\t\tnew Set<string>()\n\t\t);\n\n\t\tif (!objDecl) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst valueFromInitializer =\n\t\t\tImportTypeQuerySchemaResolver.extractConstObjectPropertyFromDeclarationInitializer(\n\t\t\t\tobjDecl,\n\t\t\t\tpropertyName\n\t\t\t);\n\t\tif (valueFromInitializer !== undefined) {\n\t\t\treturn valueFromInitializer;\n\t\t}\n\n\t\tif (objDecl.type) {\n\t\t\treturn ImportTypeQuerySchemaResolver.extractConstObjectPropertyFromDeclarationType(\n\t\t\t\tobjDecl.type,\n\t\t\t\tpropertyName\n\t\t\t);\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Find a variable declaration by traversing import and export chains.\n\t * @param sourceFilePath The source file path to inspect.\n\t * @param variableName The variable name to find.\n\t * @param visitedFiles The set of visited files to prevent recursion cycles.\n\t * @returns The matched variable declaration.\n\t */\n\tprivate static findVariableDeclarationInModuleGraph(\n\t\tsourceFilePath: string,\n\t\tvariableName: string,\n\t\tvisitedFiles: Set<string>\n\t): ts.VariableDeclaration | undefined {\n\t\tconst normalizedSourceFilePath = FileUtils.normalizeFilePath(sourceFilePath);\n\t\tif (visitedFiles.has(normalizedSourceFilePath)) {\n\t\t\treturn undefined;\n\t\t}\n\t\tvisitedFiles.add(normalizedSourceFilePath);\n\n\t\tconst source = FileUtils.readFile(sourceFilePath);\n\t\tif (!source) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst sourceFile = ts.createSourceFile(sourceFilePath, source, ts.ScriptTarget.Latest, true);\n\n\t\tconst declaration = sourceFile.statements\n\t\t\t.filter((stmt): stmt is ts.VariableStatement => ts.isVariableStatement(stmt))\n\t\t\t.flatMap(stmt => [...stmt.declarationList.declarations])\n\t\t\t.find(decl => ts.isIdentifier(decl.name) && decl.name.text === variableName);\n\t\tif (declaration) {\n\t\t\treturn declaration;\n\t\t}\n\n\t\tconst compilerOptions: ts.CompilerOptions = {\n\t\t\tmodule: ts.ModuleKind.NodeNext,\n\t\t\tmoduleResolution: ts.ModuleResolutionKind.NodeNext,\n\t\t\ttarget: ts.ScriptTarget.ESNext,\n\t\t\tskipLibCheck: true\n\t\t};\n\n\t\tconst moduleSpecifiers = sourceFile.statements\n\t\t\t.filter(statement => ts.isExportDeclaration(statement) || ts.isImportDeclaration(statement))\n\t\t\t.flatMap(statement => {\n\t\t\t\tconst moduleSpecifier = statement.moduleSpecifier;\n\t\t\t\treturn moduleSpecifier && ts.isStringLiteral(moduleSpecifier) ? [moduleSpecifier.text] : [];\n\t\t\t});\n\n\t\tfor (const moduleSpecifier of moduleSpecifiers) {\n\t\t\tconst resolvedModulePath = ts.resolveModuleName(\n\t\t\t\tmoduleSpecifier,\n\t\t\t\tsourceFilePath,\n\t\t\t\tcompilerOptions,\n\t\t\t\tts.sys\n\t\t\t).resolvedModule?.resolvedFileName;\n\n\t\t\tif (resolvedModulePath) {\n\t\t\t\tconst declarationInModule =\n\t\t\t\t\tImportTypeQuerySchemaResolver.findVariableDeclarationInModuleGraph(\n\t\t\t\t\t\tresolvedModulePath,\n\t\t\t\t\t\tvariableName,\n\t\t\t\t\t\tvisitedFiles\n\t\t\t\t\t);\n\t\t\t\tif (declarationInModule) {\n\t\t\t\t\treturn declarationInModule;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Find an imported symbol reference by local identifier name.\n\t * @param sourceFile The active source file.\n\t * @param localName The local identifier name.\n\t * @returns The imported symbol reference.\n\t */\n\tprivate static findImportedValueReference(\n\t\tsourceFile: ts.SourceFile,\n\t\tlocalName: string\n\t):\n\t\t| {\n\t\t\t\tmoduleSpecifier: string;\n\t\t\t\timportedName: string;\n\t\t }\n\t\t| undefined {\n\t\tfor (const statement of sourceFile.statements) {\n\t\t\tif (ts.isImportDeclaration(statement) && ts.isStringLiteral(statement.moduleSpecifier)) {\n\t\t\t\tconst bindings = statement.importClause?.namedBindings;\n\t\t\t\tif (bindings && ts.isNamedImports(bindings)) {\n\t\t\t\t\tconst importElement = bindings.elements.find(el => el.name.text === localName);\n\t\t\t\t\tif (importElement) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tmoduleSpecifier: statement.moduleSpecifier.text,\n\t\t\t\t\t\t\timportedName: importElement.propertyName?.text ?? importElement.name.text\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Resolve an import declaration module specifier to a source file.\n\t * @param containingSourceFilePath The path of the file containing the import declaration.\n\t * @param moduleSpecifier The module specifier to resolve.\n\t * @returns The resolved source file path.\n\t */\n\tprivate static resolveImportDeclarationSourceFile(\n\t\tcontainingSourceFilePath: string,\n\t\tmoduleSpecifier: string\n\t): string | undefined {\n\t\tconst resolvedContainingSourceFilePath = FileUtils.resolvePath(containingSourceFilePath);\n\n\t\tif (moduleSpecifier.startsWith(\".\")) {\n\t\t\treturn (\n\t\t\t\tFileUtils.resolveImportSourceFilePath(resolvedContainingSourceFilePath, moduleSpecifier) ??\n\t\t\t\t(moduleSpecifier.endsWith(\".js\")\n\t\t\t\t\t? FileUtils.resolveImportSourceFilePath(\n\t\t\t\t\t\t\tresolvedContainingSourceFilePath,\n\t\t\t\t\t\t\t`${moduleSpecifier.slice(0, -3)}.ts`\n\t\t\t\t\t\t)\n\t\t\t\t\t: undefined)\n\t\t\t);\n\t\t}\n\n\t\tconst compilerOptions: ts.CompilerOptions = {\n\t\t\tmodule: ts.ModuleKind.NodeNext,\n\t\t\tmoduleResolution: ts.ModuleResolutionKind.NodeNext,\n\t\t\ttarget: ts.ScriptTarget.ESNext,\n\t\t\tskipLibCheck: true\n\t\t};\n\n\t\treturn ts.resolveModuleName(\n\t\t\tmoduleSpecifier,\n\t\t\tresolvedContainingSourceFilePath,\n\t\t\tcompilerOptions,\n\t\t\tts.sys\n\t\t).resolvedModule?.resolvedFileName;\n\t}\n\n\t/**\n\t * Extract a const-object property value from a declaration initializer.\n\t * @param objectDeclaration The variable declaration containing the object initializer.\n\t * @param propertyName The property name to resolve.\n\t * @returns The extracted literal property value.\n\t */\n\tprivate static extractConstObjectPropertyFromDeclarationInitializer(\n\t\tobjectDeclaration: ts.VariableDeclaration,\n\t\tpropertyName: string\n\t): string | number | undefined {\n\t\tif (!objectDeclaration.initializer) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tlet objLiteral: ts.ObjectLiteralExpression | undefined;\n\t\tif (ts.isObjectLiteralExpression(objectDeclaration.initializer)) {\n\t\t\tobjLiteral = objectDeclaration.initializer;\n\t\t} else if (\n\t\t\tts.isAsExpression(objectDeclaration.initializer) &&\n\t\t\tts.isObjectLiteralExpression(objectDeclaration.initializer.expression)\n\t\t) {\n\t\t\tobjLiteral = objectDeclaration.initializer.expression;\n\t\t}\n\n\t\tif (!objLiteral) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst prop = objLiteral.properties\n\t\t\t.filter((p): p is ts.PropertyAssignment => ts.isPropertyAssignment(p))\n\t\t\t.find(p => ts.isIdentifier(p.name) && p.name.text === propertyName);\n\n\t\tif (!prop) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (ts.isStringLiteral(prop.initializer)) {\n\t\t\treturn prop.initializer.text;\n\t\t}\n\t\tif (ts.isNumericLiteral(prop.initializer)) {\n\t\t\treturn Number(prop.initializer.text);\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Extract a const-object property value from a declaration type annotation.\n\t * @param declarationTypeNode The declaration type node to inspect.\n\t * @param propertyName The property name to resolve.\n\t * @returns The extracted literal property value.\n\t */\n\tprivate static extractConstObjectPropertyFromDeclarationType(\n\t\tdeclarationTypeNode: ts.TypeNode,\n\t\tpropertyName: string\n\t): string | number | undefined {\n\t\tif (ts.isParenthesizedTypeNode(declarationTypeNode)) {\n\t\t\treturn ImportTypeQuerySchemaResolver.extractConstObjectPropertyFromDeclarationType(\n\t\t\t\tdeclarationTypeNode.type,\n\t\t\t\tpropertyName\n\t\t\t);\n\t\t}\n\n\t\tif (\n\t\t\tts.isTypeOperatorNode(declarationTypeNode) &&\n\t\t\tdeclarationTypeNode.operator === ts.SyntaxKind.ReadonlyKeyword\n\t\t) {\n\t\t\treturn ImportTypeQuerySchemaResolver.extractConstObjectPropertyFromDeclarationType(\n\t\t\t\tdeclarationTypeNode.type,\n\t\t\t\tpropertyName\n\t\t\t);\n\t\t}\n\n\t\tif (\n\t\t\tts.isTypeReferenceNode(declarationTypeNode) &&\n\t\t\tts.isIdentifier(declarationTypeNode.typeName) &&\n\t\t\tdeclarationTypeNode.typeName.text === \"Readonly\" &&\n\t\t\tIs.arrayValue(declarationTypeNode.typeArguments)\n\t\t) {\n\t\t\treturn ImportTypeQuerySchemaResolver.extractConstObjectPropertyFromDeclarationType(\n\t\t\t\tdeclarationTypeNode.typeArguments[0],\n\t\t\t\tpropertyName\n\t\t\t);\n\t\t}\n\n\t\tif (ts.isTypeLiteralNode(declarationTypeNode)) {\n\t\t\tconst propertySignature = declarationTypeNode.members.find(\n\t\t\t\t(member): member is ts.PropertySignature => {\n\t\t\t\t\tif (!ts.isPropertySignature(member) || !member.name) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t(ts.isIdentifier(member.name) && member.name.text === propertyName) ||\n\t\t\t\t\t\t(ts.isStringLiteral(member.name) && member.name.text === propertyName) ||\n\t\t\t\t\t\t(ts.isNumericLiteral(member.name) && member.name.text === propertyName)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t);\n\n\t\t\tif (propertySignature?.type) {\n\t\t\t\treturn ImportTypeQuerySchemaResolver.extractLiteralValueFromTypeNode(\n\t\t\t\t\tpropertySignature.type\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Extract a literal value from a type node when possible.\n\t * @param typeNode The type node to inspect.\n\t * @returns The extracted literal value.\n\t */\n\tprivate static extractLiteralValueFromTypeNode(\n\t\ttypeNode: ts.TypeNode\n\t): string | number | undefined {\n\t\tif (ts.isLiteralTypeNode(typeNode)) {\n\t\t\tif (ts.isStringLiteral(typeNode.literal)) {\n\t\t\t\treturn typeNode.literal.text;\n\t\t\t}\n\n\t\t\tif (ts.isNumericLiteral(typeNode.literal)) {\n\t\t\t\treturn Number(typeNode.literal.text);\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Extract a referenced type name from an import type qualifier.\n\t * @param qualifier The import type qualifier.\n\t * @returns The extracted type name.\n\t */\n\tprivate static extractImportTypeName(qualifier: ts.EntityName | undefined): string | undefined {\n\t\tif (!qualifier) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (ts.isIdentifier(qualifier)) {\n\t\t\treturn qualifier.text;\n\t\t}\n\n\t\treturn qualifier.right.text;\n\t}\n}\n"]}
@@ -35,7 +35,7 @@ export class JsDoc {
35
35
  if (Is.string(jsDocTag.comment)) {
36
36
  return jsDocTag.comment;
37
37
  }
38
- if (Array.isArray(jsDocTag.comment)) {
38
+ if (Is.array(jsDocTag.comment)) {
39
39
  return jsDocTag.comment
40
40
  .map(part => part.text)
41
41
  .join("")
@@ -1 +1 @@
1
- {"version":3,"file":"jsDoc.js","sourceRoot":"","sources":["../../../src/utils/jsDoc.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2026 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { Is } from \"@twin.org/core\";\nimport * as ts from \"typescript\";\n\n/**\n * General-purpose utility methods for working with JsDoc.\n */\nexport class JsDoc {\n\t/**\n\t * Extract the JSDoc description comment for an AST node.\n\t * Only top-level JSDoc block comments are considered; inline tags are ignored.\n\t * @param node The node to inspect.\n\t * @returns The trimmed description text, or undefined when absent.\n\t */\n\tpublic static getNodeJsDocDescription(node: ts.Node): string | undefined {\n\t\t// /** Description text */ (JSDoc block attached to a declaration)\n\t\tconst jsDocNodes = ts\n\t\t\t.getJSDocCommentsAndTags(node)\n\t\t\t.filter(commentOrTag => ts.isJSDoc(commentOrTag));\n\t\tconst description = jsDocNodes\n\t\t\t.map(jsDocNode => ts.getTextOfJSDocComment(jsDocNode.comment)?.trim())\n\t\t\t.find((value): value is string => Boolean(value));\n\n\t\tif (description) {\n\t\t\treturn description;\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Convert a JSDoc tag's comment portion to a plain text string.\n\t * JSDoc tag comments may be plain strings or arrays of link/text parts.\n\t * @param jsDocTag The JSDoc tag.\n\t * @returns The comment text, or undefined when absent.\n\t */\n\tpublic static getJSDocTagCommentText(jsDocTag: ts.JSDocTag): string | undefined {\n\t\tif (Is.string(jsDocTag.comment)) {\n\t\t\treturn jsDocTag.comment;\n\t\t}\n\n\t\tif (Array.isArray(jsDocTag.comment)) {\n\t\t\treturn jsDocTag.comment\n\t\t\t\t.map(part => part.text)\n\t\t\t\t.join(\"\")\n\t\t\t\t.trim();\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Read all custom JSDoc tags matching a tag name from a node and convert them to key/value pairs.\n\t * Each matching tag's comment must be in the form \"key: value\"; entries that do not follow this\n\t * convention are silently skipped.\n\t * @param node The node to inspect.\n\t * @param tagName The tag name to filter by (e.g., 'json-schema').\n\t * @returns The extracted key/value pairs.\n\t */\n\tpublic static getNodeTags(node: ts.Node, tagName: string): { [id: string]: string } {\n\t\tconst output: { [id: string]: string } = {};\n\t\tfor (const jsDocTag of ts.getJSDocTags(node)) {\n\t\t\tif (jsDocTag.tagName.text === tagName) {\n\t\t\t\tconst commentText = JsDoc.getJSDocTagCommentText(jsDocTag);\n\t\t\t\tif (commentText) {\n\t\t\t\t\tconst separatorIndex = commentText.indexOf(\":\");\n\t\t\t\t\tif (separatorIndex > 0) {\n\t\t\t\t\t\tconst key = commentText.slice(0, separatorIndex).trim();\n\t\t\t\t\t\tconst value = commentText.slice(separatorIndex + 1).trim();\n\t\t\t\t\t\tif (key.length > 0) {\n\t\t\t\t\t\t\toutput[key] = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn output;\n\t}\n\n\t/**\n\t * Read the plain comment text for the first matching JSDoc tag on a node.\n\t * @param node The node to inspect.\n\t * @param tagName The tag name to filter by (e.g., 'default').\n\t * @returns The trimmed comment text, or undefined when absent.\n\t */\n\tpublic static getNodeTagComment(node: ts.Node, tagName: string): string | undefined {\n\t\tfor (const jsDocTag of ts.getJSDocTags(node)) {\n\t\t\tif (jsDocTag.tagName.text === tagName) {\n\t\t\t\tconst commentText = JsDoc.getJSDocTagCommentText(jsDocTag)?.trim();\n\t\t\t\tif (commentText) {\n\t\t\t\t\treturn commentText;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Parse a custom JSDoc tag value into JSON-compatible data.\n\t * Values that begin with a JSON token character ({, [, \", true, false, null) or look like a\n\t * number are parsed with JSON.parse. All other values are returned as plain strings.\n\t * @param value The raw value text.\n\t * @returns The parsed value.\n\t */\n\tpublic static parseTagValue(value: string): unknown {\n\t\tconst trimmedValue = value.trim();\n\t\tif (trimmedValue.length === 0) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\tconst startsWithJsonToken =\n\t\t\ttrimmedValue.startsWith(\"{\") ||\n\t\t\ttrimmedValue.startsWith(\"[\") ||\n\t\t\ttrimmedValue.startsWith('\"') ||\n\t\t\ttrimmedValue === \"true\" ||\n\t\t\ttrimmedValue === \"false\" ||\n\t\t\ttrimmedValue === \"null\" ||\n\t\t\t/^-?\\d+(\\.\\d+)?$/u.test(trimmedValue);\n\n\t\tif (!startsWithJsonToken) {\n\t\t\treturn trimmedValue;\n\t\t}\n\n\t\ttry {\n\t\t\treturn JSON.parse(trimmedValue);\n\t\t} catch {\n\t\t\treturn trimmedValue;\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"jsDoc.js","sourceRoot":"","sources":["../../../src/utils/jsDoc.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2026 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { Is } from \"@twin.org/core\";\nimport * as ts from \"typescript\";\n\n/**\n * General-purpose utility methods for working with JsDoc.\n */\nexport class JsDoc {\n\t/**\n\t * Extract the JSDoc description comment for an AST node.\n\t * Only top-level JSDoc block comments are considered; inline tags are ignored.\n\t * @param node The node to inspect.\n\t * @returns The trimmed description text, or undefined when absent.\n\t */\n\tpublic static getNodeJsDocDescription(node: ts.Node): string | undefined {\n\t\t// /** Description text */ (JSDoc block attached to a declaration)\n\t\tconst jsDocNodes = ts\n\t\t\t.getJSDocCommentsAndTags(node)\n\t\t\t.filter(commentOrTag => ts.isJSDoc(commentOrTag));\n\t\tconst description = jsDocNodes\n\t\t\t.map(jsDocNode => ts.getTextOfJSDocComment(jsDocNode.comment)?.trim())\n\t\t\t.find((value): value is string => Boolean(value));\n\n\t\tif (description) {\n\t\t\treturn description;\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Convert a JSDoc tag's comment portion to a plain text string.\n\t * JSDoc tag comments may be plain strings or arrays of link/text parts.\n\t * @param jsDocTag The JSDoc tag.\n\t * @returns The comment text, or undefined when absent.\n\t */\n\tpublic static getJSDocTagCommentText(jsDocTag: ts.JSDocTag): string | undefined {\n\t\tif (Is.string(jsDocTag.comment)) {\n\t\t\treturn jsDocTag.comment;\n\t\t}\n\n\t\tif (Is.array(jsDocTag.comment)) {\n\t\t\treturn jsDocTag.comment\n\t\t\t\t.map(part => part.text)\n\t\t\t\t.join(\"\")\n\t\t\t\t.trim();\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Read all custom JSDoc tags matching a tag name from a node and convert them to key/value pairs.\n\t * Each matching tag's comment must be in the form \"key: value\"; entries that do not follow this\n\t * convention are silently skipped.\n\t * @param node The node to inspect.\n\t * @param tagName The tag name to filter by (e.g., 'json-schema').\n\t * @returns The extracted key/value pairs.\n\t */\n\tpublic static getNodeTags(node: ts.Node, tagName: string): { [id: string]: string } {\n\t\tconst output: { [id: string]: string } = {};\n\t\tfor (const jsDocTag of ts.getJSDocTags(node)) {\n\t\t\tif (jsDocTag.tagName.text === tagName) {\n\t\t\t\tconst commentText = JsDoc.getJSDocTagCommentText(jsDocTag);\n\t\t\t\tif (commentText) {\n\t\t\t\t\tconst separatorIndex = commentText.indexOf(\":\");\n\t\t\t\t\tif (separatorIndex > 0) {\n\t\t\t\t\t\tconst key = commentText.slice(0, separatorIndex).trim();\n\t\t\t\t\t\tconst value = commentText.slice(separatorIndex + 1).trim();\n\t\t\t\t\t\tif (key.length > 0) {\n\t\t\t\t\t\t\toutput[key] = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn output;\n\t}\n\n\t/**\n\t * Read the plain comment text for the first matching JSDoc tag on a node.\n\t * @param node The node to inspect.\n\t * @param tagName The tag name to filter by (e.g., 'default').\n\t * @returns The trimmed comment text, or undefined when absent.\n\t */\n\tpublic static getNodeTagComment(node: ts.Node, tagName: string): string | undefined {\n\t\tfor (const jsDocTag of ts.getJSDocTags(node)) {\n\t\t\tif (jsDocTag.tagName.text === tagName) {\n\t\t\t\tconst commentText = JsDoc.getJSDocTagCommentText(jsDocTag)?.trim();\n\t\t\t\tif (commentText) {\n\t\t\t\t\treturn commentText;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Parse a custom JSDoc tag value into JSON-compatible data.\n\t * Values that begin with a JSON token character ({, [, \", true, false, null) or look like a\n\t * number are parsed with JSON.parse. All other values are returned as plain strings.\n\t * @param value The raw value text.\n\t * @returns The parsed value.\n\t */\n\tpublic static parseTagValue(value: string): unknown {\n\t\tconst trimmedValue = value.trim();\n\t\tif (trimmedValue.length === 0) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\tconst startsWithJsonToken =\n\t\t\ttrimmedValue.startsWith(\"{\") ||\n\t\t\ttrimmedValue.startsWith(\"[\") ||\n\t\t\ttrimmedValue.startsWith('\"') ||\n\t\t\ttrimmedValue === \"true\" ||\n\t\t\ttrimmedValue === \"false\" ||\n\t\t\ttrimmedValue === \"null\" ||\n\t\t\t/^-?\\d+(\\.\\d+)?$/u.test(trimmedValue);\n\n\t\tif (!startsWithJsonToken) {\n\t\t\treturn trimmedValue;\n\t\t}\n\n\t\ttry {\n\t\t\treturn JSON.parse(trimmedValue);\n\t\t} catch {\n\t\t\treturn trimmedValue;\n\t\t}\n\t}\n}\n"]}