@formspec/build 0.1.0-alpha.36 → 0.1.0-alpha.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -76,7 +76,7 @@ Public helpers in this workflow:
76
76
  - `resolveModuleExportDeclaration(context, exportName?)` - Resolve only schema-source declarations (`class`, `interface`, `type` alias).
77
77
  - `generateSchemasFromDeclaration(...)` - Generate from a resolved schema-source declaration.
78
78
  - `generateSchemasFromParameter(...)` - Generate from a method or function parameter declaration.
79
- - `generateSchemasFromReturnType(...)` - Generate from a method or function return type.
79
+ - `generateSchemasFromReturnType(...)` - Generate from a method or function return type, unwrapping awaited `Promise<T>`-style returns before generation.
80
80
  - `generateSchemasFromType(...)` - Generate directly from a resolved `ts.Type`.
81
81
 
82
82
  Use `resolveModuleExportDeclaration(...)` when your tooling wants to hand a resolved
@@ -11,6 +11,7 @@ import type { FieldNode, TypeNode, AnnotationNode, TypeDefinition, JsonValue, Re
11
11
  import type { ExtensionRegistry } from "../extensions/index.js";
12
12
  import type { MetadataPolicyInput } from "@formspec/core";
13
13
  import { normalizeMetadataPolicy } from "../metadata/index.js";
14
+ export declare function isResolvableObjectLikeAliasTypeNode(typeNode: ts.TypeNode): boolean;
14
15
  /**
15
16
  * Layout metadata extracted from `@Group` and `@ShowWhen` TSDoc tags.
16
17
  * One entry per field, in the same order as `fields`.
@@ -47,6 +48,7 @@ export interface IRClassAnalysis {
47
48
  /** Static methods */
48
49
  readonly staticMethods: readonly MethodInfo[];
49
50
  }
51
+ export type AnalyzeTypeAliasToIRFailureKind = "duplicate-properties" | "not-object-like";
50
52
  /**
51
53
  * Result of analyzing a type alias into IR — either success or error.
52
54
  */
@@ -55,6 +57,7 @@ export type AnalyzeTypeAliasToIRResult = {
55
57
  readonly analysis: IRClassAnalysis;
56
58
  } | {
57
59
  readonly ok: false;
60
+ readonly kind: AnalyzeTypeAliasToIRFailureKind;
58
61
  readonly error: string;
59
62
  };
60
63
  export interface DeclarationRootInfo {
@@ -95,6 +98,7 @@ export declare function analyzeInterfaceToIR(interfaceDecl: ts.InterfaceDeclarat
95
98
  * Analyzes a type alias declaration and produces canonical IR FieldNodes.
96
99
  */
97
100
  export declare function analyzeTypeAliasToIR(typeAlias: ts.TypeAliasDeclaration, checker: ts.TypeChecker, file?: string, extensionRegistry?: ExtensionRegistry, metadataPolicy?: MetadataPolicyInput, discriminatorOptions?: DiscriminatorResolutionOptions): AnalyzeTypeAliasToIRResult;
101
+ export declare function getAnalyzableObjectLikePropertyName(name: ts.PropertyName): string | null;
98
102
  /**
99
103
  * Resolves a TypeScript type to a canonical IR TypeNode.
100
104
  */
@@ -1 +1 @@
1
- {"version":3,"file":"class-analyzer.d.ts","sourceRoot":"","sources":["../../src/analyzer/class-analyzer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"class-analyzer.d.ts","sourceRoot":"","sources":["../../src/analyzer/class-analyzer.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../../src/analyzer/program.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAEjC,OAAO,EAIL,KAAK,8BAA8B,EACnC,KAAK,eAAe,EACrB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAE1D;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,6BAA6B;IAC7B,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC;IACpB,uCAAuC;IACvC,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC;IACxB,qCAAqC;IACrC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC;CAC3B;AAED;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,EAAE,CAAC,OAAO,EACnB,QAAQ,EAAE,MAAM,GACf,cAAc,CAahB;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CA6DrE;AA6BD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,EAAE,CAAC,UAAU,EACzB,SAAS,EAAE,MAAM,GAChB,EAAE,CAAC,gBAAgB,GAAG,IAAI,CAE5B;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,EAAE,CAAC,UAAU,EACzB,aAAa,EAAE,MAAM,GACpB,EAAE,CAAC,oBAAoB,GAAG,IAAI,CAEhC;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,EAAE,CAAC,UAAU,EACzB,SAAS,EAAE,MAAM,GAChB,EAAE,CAAC,oBAAoB,GAAG,IAAI,CAEhC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,iBAAiB,CAAC,EAAE,iBAAiB,EACrC,cAAc,CAAC,EAAE,mBAAmB,EACpC,oBAAoB,CAAC,EAAE,8BAA8B,GACpD,eAAe,CAUjB;AAED;;GAEG;AACH,wBAAgB,sCAAsC,CACpD,GAAG,EAAE,cAAc,EACnB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,iBAAiB,CAAC,EAAE,iBAAiB,EACrC,cAAc,CAAC,EAAE,mBAAmB,EACpC,oBAAoB,CAAC,EAAE,8BAA8B,GACpD,eAAe,CA8CjB"}
1
+ {"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../../src/analyzer/program.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAIjC,OAAO,EASL,KAAK,8BAA8B,EACnC,KAAK,eAAe,EAErB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAE1D;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,6BAA6B;IAC7B,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC;IACpB,uCAAuC;IACvC,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC;IACxB,qCAAqC;IACrC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC;CAC3B;AAED;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,EAAE,CAAC,OAAO,EACnB,QAAQ,EAAE,MAAM,GACf,cAAc,CAahB;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CA6DrE;AA6BD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,EAAE,CAAC,UAAU,EACzB,SAAS,EAAE,MAAM,GAChB,EAAE,CAAC,gBAAgB,GAAG,IAAI,CAE5B;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,EAAE,CAAC,UAAU,EACzB,aAAa,EAAE,MAAM,GACpB,EAAE,CAAC,oBAAoB,GAAG,IAAI,CAEhC;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,EAAE,CAAC,UAAU,EACzB,SAAS,EAAE,MAAM,GAChB,EAAE,CAAC,oBAAoB,GAAG,IAAI,CAEhC;AAiID;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,iBAAiB,CAAC,EAAE,iBAAiB,EACrC,cAAc,CAAC,EAAE,mBAAmB,EACpC,oBAAoB,CAAC,EAAE,8BAA8B,GACpD,eAAe,CAUjB;AAED;;GAEG;AACH,wBAAgB,sCAAsC,CACpD,GAAG,EAAE,cAAc,EACnB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,iBAAiB,CAAC,EAAE,iBAAiB,EACrC,cAAc,CAAC,EAAE,mBAAmB,EACpC,oBAAoB,CAAC,EAAE,8BAA8B,GACpD,eAAe,CAkGjB"}
@@ -554,6 +554,8 @@ export declare interface GenerateSchemasFromProgramOptions extends StaticSchemaG
554
554
  /**
555
555
  * Generates schemas for a method or function return type.
556
556
  *
557
+ * Awaited `Promise<T>`-style return types are unwrapped before generation.
558
+ *
557
559
  * @public
558
560
  */
559
561
  export declare function generateSchemasFromReturnType(options: GenerateSchemasFromReturnTypeOptions): DiscoveredTypeSchemas;
@@ -554,6 +554,8 @@ export declare interface GenerateSchemasFromProgramOptions extends StaticSchemaG
554
554
  /**
555
555
  * Generates schemas for a method or function return type.
556
556
  *
557
+ * Awaited `Promise<T>`-style return types are unwrapped before generation.
558
+ *
557
559
  * @public
558
560
  */
559
561
  export declare function generateSchemasFromReturnType(options: GenerateSchemasFromReturnTypeOptions): DiscoveredTypeSchemas;
@@ -554,6 +554,8 @@ export declare interface GenerateSchemasFromProgramOptions extends StaticSchemaG
554
554
  /**
555
555
  * Generates schemas for a method or function return type.
556
556
  *
557
+ * Awaited `Promise<T>`-style return types are unwrapped before generation.
558
+ *
557
559
  * @public
558
560
  */
559
561
  export declare function generateSchemasFromReturnType(options: GenerateSchemasFromReturnTypeOptions): DiscoveredTypeSchemas;
package/dist/build.d.ts CHANGED
@@ -554,6 +554,8 @@ export declare interface GenerateSchemasFromProgramOptions extends StaticSchemaG
554
554
  /**
555
555
  * Generates schemas for a method or function return type.
556
556
  *
557
+ * Awaited `Promise<T>`-style return types are unwrapped before generation.
558
+ *
557
559
  * @public
558
560
  */
559
561
  export declare function generateSchemasFromReturnType(options: GenerateSchemasFromReturnTypeOptions): DiscoveredTypeSchemas;
package/dist/cli.cjs CHANGED
@@ -3003,6 +3003,21 @@ function isObjectType(type) {
3003
3003
  function isIntersectionType(type) {
3004
3004
  return !!(type.flags & ts3.TypeFlags.Intersection);
3005
3005
  }
3006
+ function isResolvableObjectLikeAliasTypeNode(typeNode) {
3007
+ if (ts3.isParenthesizedTypeNode(typeNode)) {
3008
+ return isResolvableObjectLikeAliasTypeNode(typeNode.type);
3009
+ }
3010
+ if (ts3.isTypeLiteralNode(typeNode) || ts3.isTypeReferenceNode(typeNode)) {
3011
+ return true;
3012
+ }
3013
+ return ts3.isIntersectionTypeNode(typeNode) && typeNode.types.length > 0 && typeNode.types.every((member) => isResolvableObjectLikeAliasTypeNode(member));
3014
+ }
3015
+ function isSemanticallyPlainObjectLikeType(type, checker) {
3016
+ if (isIntersectionType(type)) {
3017
+ return type.types.length > 0 && type.types.every((member) => isSemanticallyPlainObjectLikeType(member, checker));
3018
+ }
3019
+ return isObjectType(type) && checker.getSignaturesOfType(type, ts3.SignatureKind.Call).length === 0 && checker.getSignaturesOfType(type, ts3.SignatureKind.Construct).length === 0 && !checker.isArrayType(type) && !checker.isTupleType(type);
3020
+ }
3006
3021
  function isTypeReference(type) {
3007
3022
  return !!(type.flags & ts3.TypeFlags.Object) && !!(type.objectFlags & ts3.ObjectFlags.Reference);
3008
3023
  }
@@ -3255,6 +3270,7 @@ function analyzeTypeAliasToIR(typeAlias, checker, file = "", extensionRegistry,
3255
3270
  const kindDesc = ts3.SyntaxKind[typeAlias.type.kind] ?? "unknown";
3256
3271
  return {
3257
3272
  ok: false,
3273
+ kind: "not-object-like",
3258
3274
  error: `Type alias "${typeAlias.name.text}" at line ${String(line + 1)} is not an object-like type alias (found ${kindDesc})`
3259
3275
  };
3260
3276
  }
@@ -3269,6 +3285,7 @@ function analyzeTypeAliasToIR(typeAlias, checker, file = "", extensionRegistry,
3269
3285
  const { line } = sourceFile.getLineAndCharacterOfPosition(typeAlias.getStart());
3270
3286
  return {
3271
3287
  ok: false,
3288
+ kind: "duplicate-properties",
3272
3289
  error: `Type alias "${name}" at line ${String(line + 1)} contains duplicate property names across object-like members: ${duplicatePropertyNames.join(", ")}`
3273
3290
  };
3274
3291
  }
@@ -3965,10 +3982,10 @@ function findDuplicateObjectLikeTypeAliasPropertyNames(members) {
3965
3982
  return [...duplicates].sort();
3966
3983
  }
3967
3984
  function getAnalyzableObjectLikePropertyName(name) {
3968
- if (!ts3.isIdentifier(name)) {
3969
- return null;
3985
+ if (ts3.isIdentifier(name) || ts3.isStringLiteral(name) || ts3.isNumericLiteral(name)) {
3986
+ return name.text;
3970
3987
  }
3971
- return name.text;
3988
+ return null;
3972
3989
  }
3973
3990
  function applyEnumMemberDisplayNames(type, annotations) {
3974
3991
  if (!annotations.some(
@@ -4178,6 +4195,19 @@ function resolveTypeNode(type, checker, file, typeRegistry, visiting, sourceNode
4178
4195
  diagnostics
4179
4196
  );
4180
4197
  }
4198
+ if (resolvedSourceTypeNode !== void 0 && isResolvableObjectLikeAliasTypeNode(resolvedSourceTypeNode) && isSemanticallyPlainObjectLikeType(type, checker)) {
4199
+ return resolveObjectType(
4200
+ type,
4201
+ checker,
4202
+ file,
4203
+ typeRegistry,
4204
+ visiting,
4205
+ sourceNode,
4206
+ metadataPolicy,
4207
+ extensionRegistry,
4208
+ diagnostics
4209
+ );
4210
+ }
4181
4211
  }
4182
4212
  if (isObjectType(type)) {
4183
4213
  return resolveObjectType(
@@ -5101,6 +5131,95 @@ function findInterfaceByName(sourceFile, interfaceName) {
5101
5131
  function findTypeAliasByName(sourceFile, aliasName) {
5102
5132
  return findNodeByName(sourceFile, aliasName, ts4.isTypeAliasDeclaration, (n) => n.name.text);
5103
5133
  }
5134
+ function getResolvedObjectRootType(rootType, typeRegistry) {
5135
+ if (rootType.kind === "object") {
5136
+ return rootType;
5137
+ }
5138
+ if (rootType.kind !== "reference") {
5139
+ return null;
5140
+ }
5141
+ const definition = typeRegistry[rootType.name];
5142
+ return definition?.type.kind === "object" ? definition.type : null;
5143
+ }
5144
+ function createResolvedObjectAliasAnalysis(name, rootType, typeRegistry, rootInfo, diagnostics) {
5145
+ const resolvedRootType = getResolvedObjectRootType(rootType, typeRegistry);
5146
+ if (resolvedRootType === null) {
5147
+ return null;
5148
+ }
5149
+ const fields = resolvedRootType.properties.map((property) => ({
5150
+ kind: "field",
5151
+ name: property.name,
5152
+ ...property.metadata !== void 0 && { metadata: property.metadata },
5153
+ type: property.type,
5154
+ required: !property.optional,
5155
+ constraints: property.constraints,
5156
+ annotations: property.annotations,
5157
+ provenance: property.provenance
5158
+ }));
5159
+ return {
5160
+ name,
5161
+ ...rootInfo.metadata !== void 0 && { metadata: rootInfo.metadata },
5162
+ fields,
5163
+ fieldLayouts: fields.map(() => ({})),
5164
+ typeRegistry,
5165
+ ...rootInfo.annotations.length > 0 && { annotations: [...rootInfo.annotations] },
5166
+ ...diagnostics.length > 0 && { diagnostics: [...diagnostics] },
5167
+ instanceMethods: [],
5168
+ staticMethods: []
5169
+ };
5170
+ }
5171
+ function containsTypeReferenceInObjectLikeAlias(typeNode) {
5172
+ if (ts4.isParenthesizedTypeNode(typeNode)) {
5173
+ return containsTypeReferenceInObjectLikeAlias(typeNode.type);
5174
+ }
5175
+ if (ts4.isTypeReferenceNode(typeNode)) {
5176
+ return true;
5177
+ }
5178
+ return ts4.isIntersectionTypeNode(typeNode) && typeNode.types.some((member) => containsTypeReferenceInObjectLikeAlias(member));
5179
+ }
5180
+ function collectFallbackAliasMemberPropertyNames(typeNode, checker) {
5181
+ if (ts4.isParenthesizedTypeNode(typeNode)) {
5182
+ return collectFallbackAliasMemberPropertyNames(typeNode.type, checker);
5183
+ }
5184
+ if (ts4.isTypeLiteralNode(typeNode)) {
5185
+ const propertyNames = [];
5186
+ for (const member of typeNode.members) {
5187
+ if (!ts4.isPropertySignature(member)) {
5188
+ continue;
5189
+ }
5190
+ const propertyName = getAnalyzableObjectLikePropertyName(member.name);
5191
+ if (propertyName !== null) {
5192
+ propertyNames.push(propertyName);
5193
+ }
5194
+ }
5195
+ return propertyNames;
5196
+ }
5197
+ if (ts4.isTypeReferenceNode(typeNode)) {
5198
+ return checker.getTypeFromTypeNode(typeNode).getProperties().map((property) => property.getName());
5199
+ }
5200
+ return null;
5201
+ }
5202
+ function findFallbackAliasDuplicatePropertyNames(typeNode, checker) {
5203
+ if (!ts4.isIntersectionTypeNode(typeNode)) {
5204
+ return [];
5205
+ }
5206
+ const seen = /* @__PURE__ */ new Set();
5207
+ const duplicates = /* @__PURE__ */ new Set();
5208
+ for (const member of typeNode.types) {
5209
+ const propertyNames = collectFallbackAliasMemberPropertyNames(member, checker);
5210
+ if (propertyNames === null) {
5211
+ continue;
5212
+ }
5213
+ for (const propertyName of propertyNames) {
5214
+ if (seen.has(propertyName)) {
5215
+ duplicates.add(propertyName);
5216
+ } else {
5217
+ seen.add(propertyName);
5218
+ }
5219
+ }
5220
+ }
5221
+ return [...duplicates].sort();
5222
+ }
5104
5223
  function analyzeNamedTypeToIR(filePath, typeName, extensionRegistry, metadataPolicy, discriminatorOptions) {
5105
5224
  const ctx = createProgramContext(filePath);
5106
5225
  return analyzeNamedTypeToIRFromProgramContext(
@@ -5149,6 +5268,51 @@ function analyzeNamedTypeToIRFromProgramContext(ctx, filePath, typeName, extensi
5149
5268
  if (result.ok) {
5150
5269
  return result.analysis;
5151
5270
  }
5271
+ const fallbackEligible = result.kind === "not-object-like" && isResolvableObjectLikeAliasTypeNode(typeAlias.type) && containsTypeReferenceInObjectLikeAlias(typeAlias.type);
5272
+ if (!fallbackEligible) {
5273
+ throw new Error(result.error);
5274
+ }
5275
+ const duplicatePropertyNames = findFallbackAliasDuplicatePropertyNames(
5276
+ typeAlias.type,
5277
+ ctx.checker
5278
+ );
5279
+ if (duplicatePropertyNames.length > 0) {
5280
+ const sourceFile = typeAlias.getSourceFile();
5281
+ const { line } = sourceFile.getLineAndCharacterOfPosition(typeAlias.getStart());
5282
+ throw new Error(
5283
+ `Type alias "${typeAlias.name.text}" at line ${String(line + 1)} contains duplicate property names across object-like members: ${duplicatePropertyNames.join(", ")}`
5284
+ );
5285
+ }
5286
+ const rootInfo = analyzeDeclarationRootInfo(
5287
+ typeAlias,
5288
+ ctx.checker,
5289
+ analysisFilePath,
5290
+ extensionRegistry,
5291
+ metadataPolicy
5292
+ );
5293
+ const diagnostics = [...rootInfo.diagnostics];
5294
+ const typeRegistry = {};
5295
+ const rootType = resolveTypeNode(
5296
+ ctx.checker.getTypeAtLocation(typeAlias),
5297
+ ctx.checker,
5298
+ analysisFilePath,
5299
+ typeRegistry,
5300
+ /* @__PURE__ */ new Set(),
5301
+ typeAlias,
5302
+ createAnalyzerMetadataPolicy(metadataPolicy, discriminatorOptions),
5303
+ extensionRegistry,
5304
+ diagnostics
5305
+ );
5306
+ const fallbackAnalysis = createResolvedObjectAliasAnalysis(
5307
+ typeAlias.name.text,
5308
+ rootType,
5309
+ typeRegistry,
5310
+ rootInfo,
5311
+ diagnostics
5312
+ );
5313
+ if (fallbackAnalysis !== null) {
5314
+ return fallbackAnalysis;
5315
+ }
5152
5316
  throw new Error(result.error);
5153
5317
  }
5154
5318
  throw new Error(
@@ -5693,15 +5857,36 @@ function generateSchemasFromParameter(options) {
5693
5857
  }
5694
5858
  function generateSchemasFromReturnType(options) {
5695
5859
  const signature = options.context.checker.getSignatureFromDeclaration(options.declaration);
5696
- const type = signature !== void 0 ? options.context.checker.getReturnTypeOfSignature(signature) : options.context.checker.getTypeAtLocation(options.declaration);
5860
+ const returnType = signature !== void 0 ? options.context.checker.getReturnTypeOfSignature(signature) : options.context.checker.getTypeAtLocation(options.declaration);
5861
+ const type = unwrapPromiseType(options.context.checker, returnType);
5862
+ const sourceNode = type !== returnType ? unwrapPromiseTypeNode(options.declaration.type) ?? options.declaration.type ?? options.declaration : options.declaration.type ?? options.declaration;
5697
5863
  const fallbackName = options.declaration.name !== void 0 && ts7.isIdentifier(options.declaration.name) ? `${options.declaration.name.text}ReturnType` : "ReturnType";
5698
5864
  return generateSchemasFromResolvedType({
5699
5865
  ...options,
5700
5866
  type,
5701
- sourceNode: options.declaration.type ?? options.declaration,
5867
+ sourceNode,
5702
5868
  name: fallbackName
5703
5869
  });
5704
5870
  }
5871
+ function unwrapPromiseType(checker, type) {
5872
+ if (!("getAwaitedType" in checker) || typeof checker.getAwaitedType !== "function") {
5873
+ return type;
5874
+ }
5875
+ return checker.getAwaitedType(type) ?? type;
5876
+ }
5877
+ function unwrapPromiseTypeNode(typeNode) {
5878
+ if (typeNode === void 0) {
5879
+ return void 0;
5880
+ }
5881
+ if (ts7.isParenthesizedTypeNode(typeNode)) {
5882
+ const unwrapped = unwrapPromiseTypeNode(typeNode.type);
5883
+ return unwrapped ?? typeNode;
5884
+ }
5885
+ return isPromiseTypeReferenceNode(typeNode) ? typeNode.typeArguments[0] : typeNode;
5886
+ }
5887
+ function isPromiseTypeReferenceNode(typeNode) {
5888
+ return ts7.isTypeReferenceNode(typeNode) && ts7.isIdentifier(typeNode.typeName) && typeNode.typeName.text === "Promise" && typeNode.typeArguments !== void 0 && typeNode.typeArguments.length > 0;
5889
+ }
5705
5890
  var ts7, import_internals6;
5706
5891
  var init_discovered_schema = __esm({
5707
5892
  "src/generators/discovered-schema.ts"() {