@formspec/build 0.1.0-alpha.33 → 0.1.0-alpha.35

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/dist/cli.js CHANGED
@@ -3013,6 +3013,9 @@ import {
3013
3013
  function isObjectType(type) {
3014
3014
  return !!(type.flags & ts3.TypeFlags.Object);
3015
3015
  }
3016
+ function isIntersectionType(type) {
3017
+ return !!(type.flags & ts3.TypeFlags.Intersection);
3018
+ }
3016
3019
  function isTypeReference(type) {
3017
3020
  return !!(type.flags & ts3.TypeFlags.Object) && !!(type.objectFlags & ts3.ObjectFlags.Reference);
3018
3021
  }
@@ -3028,10 +3031,11 @@ function makeParseOptions(extensionRegistry, fieldType, checker, subjectType, ho
3028
3031
  ...hostType !== void 0 && { hostType }
3029
3032
  };
3030
3033
  }
3031
- function createAnalyzerMetadataPolicy(input) {
3034
+ function createAnalyzerMetadataPolicy(input, discriminator) {
3032
3035
  return {
3033
3036
  raw: input,
3034
- normalized: normalizeMetadataPolicy(input)
3037
+ normalized: normalizeMetadataPolicy(input),
3038
+ discriminator
3035
3039
  };
3036
3040
  }
3037
3041
  function resolveNodeMetadata(metadataPolicy, declarationKind, logicalName, node, checker, extensionRegistry, buildContext) {
@@ -3099,8 +3103,11 @@ function analyzeDeclarationRootInfo(declaration, checker, file = "", extensionRe
3099
3103
  diagnostics: docResult.diagnostics
3100
3104
  };
3101
3105
  }
3102
- function analyzeClassToIR(classDecl, checker, file = "", extensionRegistry, metadataPolicy) {
3103
- const normalizedMetadataPolicy = createAnalyzerMetadataPolicy(metadataPolicy);
3106
+ function analyzeClassToIR(classDecl, checker, file = "", extensionRegistry, metadataPolicy, discriminatorOptions) {
3107
+ const normalizedMetadataPolicy = createAnalyzerMetadataPolicy(
3108
+ metadataPolicy,
3109
+ discriminatorOptions
3110
+ );
3104
3111
  const name = classDecl.name?.text ?? "AnonymousClass";
3105
3112
  const fields = [];
3106
3113
  const fieldLayouts = [];
@@ -3181,8 +3188,11 @@ function analyzeClassToIR(classDecl, checker, file = "", extensionRegistry, meta
3181
3188
  staticMethods
3182
3189
  };
3183
3190
  }
3184
- function analyzeInterfaceToIR(interfaceDecl, checker, file = "", extensionRegistry, metadataPolicy) {
3185
- const normalizedMetadataPolicy = createAnalyzerMetadataPolicy(metadataPolicy);
3191
+ function analyzeInterfaceToIR(interfaceDecl, checker, file = "", extensionRegistry, metadataPolicy, discriminatorOptions) {
3192
+ const normalizedMetadataPolicy = createAnalyzerMetadataPolicy(
3193
+ metadataPolicy,
3194
+ discriminatorOptions
3195
+ );
3186
3196
  const name = interfaceDecl.name.text;
3187
3197
  const fields = [];
3188
3198
  const typeRegistry = {};
@@ -3250,19 +3260,31 @@ function analyzeInterfaceToIR(interfaceDecl, checker, file = "", extensionRegist
3250
3260
  staticMethods: []
3251
3261
  };
3252
3262
  }
3253
- function analyzeTypeAliasToIR(typeAlias, checker, file = "", extensionRegistry, metadataPolicy) {
3254
- if (!ts3.isTypeLiteralNode(typeAlias.type)) {
3263
+ function analyzeTypeAliasToIR(typeAlias, checker, file = "", extensionRegistry, metadataPolicy, discriminatorOptions) {
3264
+ const members = getObjectLikeTypeAliasMembers(typeAlias.type);
3265
+ if (members === null) {
3255
3266
  const sourceFile = typeAlias.getSourceFile();
3256
3267
  const { line } = sourceFile.getLineAndCharacterOfPosition(typeAlias.getStart());
3257
3268
  const kindDesc = ts3.SyntaxKind[typeAlias.type.kind] ?? "unknown";
3258
3269
  return {
3259
3270
  ok: false,
3260
- error: `Type alias "${typeAlias.name.text}" at line ${String(line + 1)} is not an object type literal (found ${kindDesc})`
3271
+ error: `Type alias "${typeAlias.name.text}" at line ${String(line + 1)} is not an object-like type alias (found ${kindDesc})`
3261
3272
  };
3262
3273
  }
3263
- const typeLiteral = typeAlias.type;
3264
- const normalizedMetadataPolicy = createAnalyzerMetadataPolicy(metadataPolicy);
3274
+ const normalizedMetadataPolicy = createAnalyzerMetadataPolicy(
3275
+ metadataPolicy,
3276
+ discriminatorOptions
3277
+ );
3265
3278
  const name = typeAlias.name.text;
3279
+ const duplicatePropertyNames = findDuplicateObjectLikeTypeAliasPropertyNames(members);
3280
+ if (duplicatePropertyNames.length > 0) {
3281
+ const sourceFile = typeAlias.getSourceFile();
3282
+ const { line } = sourceFile.getLineAndCharacterOfPosition(typeAlias.getStart());
3283
+ return {
3284
+ ok: false,
3285
+ error: `Type alias "${name}" at line ${String(line + 1)} contains duplicate property names across object-like members: ${duplicatePropertyNames.join(", ")}`
3286
+ };
3287
+ }
3266
3288
  const fields = [];
3267
3289
  const typeRegistry = {};
3268
3290
  const diagnostics = [];
@@ -3275,7 +3297,7 @@ function analyzeTypeAliasToIR(typeAlias, checker, file = "", extensionRegistry,
3275
3297
  const annotations = [...typeAliasDoc.annotations];
3276
3298
  diagnostics.push(...typeAliasDoc.diagnostics);
3277
3299
  const visiting = /* @__PURE__ */ new Set();
3278
- for (const member of typeLiteral.members) {
3300
+ for (const member of members) {
3279
3301
  if (ts3.isPropertySignature(member)) {
3280
3302
  const fieldNode = analyzeInterfacePropertyToIR(
3281
3303
  member,
@@ -3384,15 +3406,43 @@ function isNullishSemanticType(type) {
3384
3406
  }
3385
3407
  return type.isUnion() && type.types.some((member) => isNullishSemanticType(member));
3386
3408
  }
3387
- function isStringLikeSemanticType(type) {
3409
+ function isStringLikeSemanticType(type, checker, seen = /* @__PURE__ */ new Set()) {
3410
+ if (seen.has(type)) {
3411
+ return false;
3412
+ }
3413
+ seen.add(type);
3388
3414
  if (type.flags & ts3.TypeFlags.StringLike) {
3389
3415
  return true;
3390
3416
  }
3391
3417
  if (type.isUnion()) {
3392
- return type.types.length > 0 && type.types.every((member) => isStringLikeSemanticType(member));
3418
+ return type.types.length > 0 && type.types.every((member) => isStringLikeSemanticType(member, checker, seen));
3419
+ }
3420
+ const baseConstraint = checker.getBaseConstraintOfType(type);
3421
+ if (baseConstraint !== void 0 && baseConstraint !== type) {
3422
+ return isStringLikeSemanticType(baseConstraint, checker, seen);
3393
3423
  }
3394
3424
  return false;
3395
3425
  }
3426
+ function getObjectLikeTypeAliasMembers(typeNode) {
3427
+ if (ts3.isParenthesizedTypeNode(typeNode)) {
3428
+ return getObjectLikeTypeAliasMembers(typeNode.type);
3429
+ }
3430
+ if (ts3.isTypeLiteralNode(typeNode)) {
3431
+ return [...typeNode.members];
3432
+ }
3433
+ if (ts3.isIntersectionTypeNode(typeNode)) {
3434
+ const members = [];
3435
+ for (const intersectionMember of typeNode.types) {
3436
+ const resolvedMembers = getObjectLikeTypeAliasMembers(intersectionMember);
3437
+ if (resolvedMembers === null) {
3438
+ return null;
3439
+ }
3440
+ members.push(...resolvedMembers);
3441
+ }
3442
+ return members;
3443
+ }
3444
+ return null;
3445
+ }
3396
3446
  function extractDiscriminatorDirective(node, file, diagnostics) {
3397
3447
  const discriminatorTags = getLeadingParsedTags(node).filter(
3398
3448
  (tag) => tag.normalizedTagName === "discriminator"
@@ -3499,7 +3549,7 @@ function validateDiscriminatorDirective(node, checker, file, diagnostics) {
3499
3549
  );
3500
3550
  return null;
3501
3551
  }
3502
- if (!isStringLikeSemanticType(property.type)) {
3552
+ if (!isStringLikeSemanticType(property.type, checker)) {
3503
3553
  diagnostics.push(
3504
3554
  makeAnalysisDiagnostic(
3505
3555
  "TYPE_MISMATCH",
@@ -3526,8 +3576,8 @@ function getConcreteTypeArgumentForDiscriminator(node, subjectType, checker, typ
3526
3576
  const localTypeParameter = node.typeParameters?.[typeParameterIndex];
3527
3577
  return localTypeParameter === void 0 ? null : checker.getTypeAtLocation(localTypeParameter);
3528
3578
  }
3529
- function resolveLiteralDiscriminatorPropertyValue(boundType, fieldName, checker, provenance, diagnostics) {
3530
- const propertySymbol = boundType.getProperty(fieldName);
3579
+ function resolveLiteralDiscriminatorPropertyValue(boundType, propertyName, checker, provenance, diagnostics) {
3580
+ const propertySymbol = boundType.getProperty(propertyName);
3531
3581
  if (propertySymbol === void 0) {
3532
3582
  return void 0;
3533
3583
  }
@@ -3558,6 +3608,9 @@ function resolveLiteralDiscriminatorPropertyValue(boundType, fieldName, checker,
3558
3608
  }
3559
3609
  return void 0;
3560
3610
  }
3611
+ function getDiscriminatorIdentityPropertyNames(fieldName) {
3612
+ return fieldName === "object" ? ["object"] : [fieldName, "object"];
3613
+ }
3561
3614
  function resolveDiscriminatorApiName(boundType, checker, metadataPolicy) {
3562
3615
  const declaration = resolveNamedDiscriminatorDeclaration(boundType, checker);
3563
3616
  if (declaration === null) {
@@ -3578,6 +3631,10 @@ function resolveDiscriminatorApiName(boundType, checker, metadataPolicy) {
3578
3631
  );
3579
3632
  return metadata?.apiName;
3580
3633
  }
3634
+ function applyDiscriminatorApiNamePrefix(value, discriminatorOptions) {
3635
+ const prefix = discriminatorOptions?.apiNamePrefix;
3636
+ return prefix === void 0 || prefix === "" ? value : `${prefix}${value}`;
3637
+ }
3581
3638
  function resolveNamedDiscriminatorDeclaration(type, checker, seen = /* @__PURE__ */ new Set()) {
3582
3639
  if (seen.has(type)) {
3583
3640
  return null;
@@ -3632,22 +3689,27 @@ function resolveDiscriminatorValue(boundType, fieldName, checker, provenance, di
3632
3689
  return null;
3633
3690
  }
3634
3691
  }
3635
- const literalIdentityValue = resolveLiteralDiscriminatorPropertyValue(
3636
- boundType,
3637
- fieldName,
3638
- checker,
3639
- provenance,
3640
- diagnostics
3641
- );
3642
- if (literalIdentityValue !== void 0) {
3643
- return literalIdentityValue;
3692
+ for (const identityPropertyName of getDiscriminatorIdentityPropertyNames(fieldName)) {
3693
+ const literalIdentityValue = resolveLiteralDiscriminatorPropertyValue(
3694
+ boundType,
3695
+ identityPropertyName,
3696
+ checker,
3697
+ provenance,
3698
+ diagnostics
3699
+ );
3700
+ if (literalIdentityValue === null) {
3701
+ return null;
3702
+ }
3703
+ if (literalIdentityValue !== void 0) {
3704
+ return literalIdentityValue;
3705
+ }
3644
3706
  }
3645
3707
  const apiName = resolveDiscriminatorApiName(boundType, checker, metadataPolicy);
3646
3708
  if (apiName?.source === "explicit") {
3647
- return apiName.value;
3709
+ return applyDiscriminatorApiNamePrefix(apiName.value, metadataPolicy.discriminator);
3648
3710
  }
3649
3711
  if (apiName?.source === "inferred") {
3650
- return apiName.value;
3712
+ return applyDiscriminatorApiNamePrefix(apiName.value, metadataPolicy.discriminator);
3651
3713
  }
3652
3714
  diagnostics.push(
3653
3715
  makeAnalysisDiagnostic(
@@ -3710,15 +3772,20 @@ function buildInstantiatedReferenceName(baseName, typeArguments, checker) {
3710
3772
  return renderedArguments.length === 0 ? baseName : `${baseName}__${renderedArguments.join("__")}`;
3711
3773
  }
3712
3774
  function extractReferenceTypeArguments(type, checker, file, typeRegistry, visiting, sourceNode, metadataPolicy, extensionRegistry, diagnostics) {
3713
- const typeNode = sourceNode === void 0 ? void 0 : extractTypeNodeFromSource(sourceNode);
3714
- if (typeNode === void 0) {
3775
+ const sourceTypeNode = sourceNode === void 0 ? void 0 : extractTypeNodeFromSource(sourceNode);
3776
+ if (sourceTypeNode === void 0) {
3715
3777
  return [];
3716
3778
  }
3717
- const resolvedTypeNode = resolveAliasedTypeNode(typeNode, checker);
3718
- if (!ts3.isTypeReferenceNode(resolvedTypeNode) || resolvedTypeNode.typeArguments === void 0) {
3779
+ const unwrapParentheses = (typeNode) => ts3.isParenthesizedTypeNode(typeNode) ? unwrapParentheses(typeNode.type) : typeNode;
3780
+ const directTypeNode = unwrapParentheses(sourceTypeNode);
3781
+ const referenceTypeNode = ts3.isTypeReferenceNode(directTypeNode) ? directTypeNode : (() => {
3782
+ const resolvedTypeNode = resolveAliasedTypeNode(directTypeNode, checker);
3783
+ return ts3.isTypeReferenceNode(resolvedTypeNode) ? resolvedTypeNode : null;
3784
+ })();
3785
+ if (referenceTypeNode?.typeArguments === void 0) {
3719
3786
  return [];
3720
3787
  }
3721
- return resolvedTypeNode.typeArguments.map((argumentNode) => {
3788
+ return referenceTypeNode.typeArguments.map((argumentNode) => {
3722
3789
  const argumentType = checker.getTypeFromTypeNode(argumentNode);
3723
3790
  return {
3724
3791
  tsType: argumentType,
@@ -3832,10 +3899,10 @@ function analyzeFieldToIR(prop, checker, file, typeRegistry, visiting, diagnosti
3832
3899
  };
3833
3900
  }
3834
3901
  function analyzeInterfacePropertyToIR(prop, checker, file, typeRegistry, visiting, diagnostics, hostType, metadataPolicy, extensionRegistry) {
3835
- if (!ts3.isIdentifier(prop.name)) {
3902
+ const name = getAnalyzableObjectLikePropertyName(prop.name);
3903
+ if (name === null) {
3836
3904
  return null;
3837
3905
  }
3838
- const name = prop.name.text;
3839
3906
  const tsType = checker.getTypeAtLocation(prop);
3840
3907
  const optional = prop.questionToken !== void 0;
3841
3908
  const provenance = provenanceForNode(prop, file);
@@ -3891,6 +3958,31 @@ function analyzeInterfacePropertyToIR(prop, checker, file, typeRegistry, visitin
3891
3958
  provenance
3892
3959
  };
3893
3960
  }
3961
+ function findDuplicateObjectLikeTypeAliasPropertyNames(members) {
3962
+ const seen = /* @__PURE__ */ new Set();
3963
+ const duplicates = /* @__PURE__ */ new Set();
3964
+ for (const member of members) {
3965
+ if (!ts3.isPropertySignature(member)) {
3966
+ continue;
3967
+ }
3968
+ const name = getAnalyzableObjectLikePropertyName(member.name);
3969
+ if (name === null) {
3970
+ continue;
3971
+ }
3972
+ if (seen.has(name)) {
3973
+ duplicates.add(name);
3974
+ continue;
3975
+ }
3976
+ seen.add(name);
3977
+ }
3978
+ return [...duplicates].sort();
3979
+ }
3980
+ function getAnalyzableObjectLikePropertyName(name) {
3981
+ if (!ts3.isIdentifier(name)) {
3982
+ return null;
3983
+ }
3984
+ return name.text;
3985
+ }
3894
3986
  function applyEnumMemberDisplayNames(type, annotations) {
3895
3987
  if (!annotations.some(
3896
3988
  (annotation) => annotation.annotationKind === "displayName" && annotation.value.trim().startsWith(":")
@@ -4083,6 +4175,23 @@ function resolveTypeNode(type, checker, file, typeRegistry, visiting, sourceNode
4083
4175
  diagnostics
4084
4176
  );
4085
4177
  }
4178
+ if (isIntersectionType(type)) {
4179
+ const sourceTypeNode = sourceNode === void 0 ? void 0 : extractTypeNodeFromSource(sourceNode);
4180
+ const resolvedSourceTypeNode = sourceTypeNode === void 0 ? void 0 : resolveAliasedTypeNode(sourceTypeNode, checker);
4181
+ if (resolvedSourceTypeNode !== void 0 && getObjectLikeTypeAliasMembers(resolvedSourceTypeNode) !== null) {
4182
+ return resolveObjectType(
4183
+ type,
4184
+ checker,
4185
+ file,
4186
+ typeRegistry,
4187
+ visiting,
4188
+ sourceNode,
4189
+ metadataPolicy,
4190
+ extensionRegistry,
4191
+ diagnostics
4192
+ );
4193
+ }
4194
+ }
4086
4195
  if (isObjectType(type)) {
4087
4196
  return resolveObjectType(
4088
4197
  type,
@@ -4169,9 +4278,10 @@ function shouldEmitPrimitiveAliasDefinition(typeNode, checker) {
4169
4278
  const resolved = checker.getTypeFromTypeNode(aliasDecl.type);
4170
4279
  return !!(resolved.flags & (ts3.TypeFlags.String | ts3.TypeFlags.Number | ts3.TypeFlags.BigInt | ts3.TypeFlags.BigIntLiteral | ts3.TypeFlags.Boolean | ts3.TypeFlags.Null));
4171
4280
  }
4172
- function resolveAliasedPrimitiveTarget(type, checker, file, typeRegistry, visiting, metadataPolicy = createAnalyzerMetadataPolicy(void 0), extensionRegistry, diagnostics) {
4281
+ function resolveAliasedPrimitiveTarget(type, checker, file, typeRegistry, visiting, metadataPolicy = createAnalyzerMetadataPolicy(void 0), extensionRegistry, diagnostics, visitedAliases = /* @__PURE__ */ new Set()) {
4173
4282
  const nestedAliasDecl = type.aliasSymbol?.declarations?.find(ts3.isTypeAliasDeclaration);
4174
- if (nestedAliasDecl !== void 0) {
4283
+ if (nestedAliasDecl !== void 0 && !visitedAliases.has(nestedAliasDecl)) {
4284
+ visitedAliases.add(nestedAliasDecl);
4175
4285
  return resolveAliasedPrimitiveTarget(
4176
4286
  checker.getTypeFromTypeNode(nestedAliasDecl.type),
4177
4287
  checker,
@@ -4180,9 +4290,25 @@ function resolveAliasedPrimitiveTarget(type, checker, file, typeRegistry, visiti
4180
4290
  visiting,
4181
4291
  metadataPolicy,
4182
4292
  extensionRegistry,
4183
- diagnostics
4293
+ diagnostics,
4294
+ visitedAliases
4184
4295
  );
4185
4296
  }
4297
+ if (type.flags & ts3.TypeFlags.String) {
4298
+ return { kind: "primitive", primitiveKind: "string" };
4299
+ }
4300
+ if (type.flags & ts3.TypeFlags.Number) {
4301
+ return { kind: "primitive", primitiveKind: "number" };
4302
+ }
4303
+ if (type.flags & (ts3.TypeFlags.BigInt | ts3.TypeFlags.BigIntLiteral)) {
4304
+ return { kind: "primitive", primitiveKind: "bigint" };
4305
+ }
4306
+ if (type.flags & ts3.TypeFlags.Boolean) {
4307
+ return { kind: "primitive", primitiveKind: "boolean" };
4308
+ }
4309
+ if (type.flags & ts3.TypeFlags.Null) {
4310
+ return { kind: "primitive", primitiveKind: "null" };
4311
+ }
4186
4312
  return resolveTypeNode(
4187
4313
  type,
4188
4314
  checker,
@@ -4462,7 +4588,7 @@ function resolveObjectType(type, checker, file, typeRegistry, visiting, sourceNo
4462
4588
  };
4463
4589
  }
4464
4590
  }
4465
- const recordNode = tryResolveRecordType(
4591
+ const recordNode = isObjectType(type) ? tryResolveRecordType(
4466
4592
  type,
4467
4593
  checker,
4468
4594
  file,
@@ -4471,7 +4597,7 @@ function resolveObjectType(type, checker, file, typeRegistry, visiting, sourceNo
4471
4597
  metadataPolicy,
4472
4598
  extensionRegistry,
4473
4599
  collectedDiagnostics
4474
- );
4600
+ ) : null;
4475
4601
  if (recordNode) {
4476
4602
  visiting.delete(type);
4477
4603
  if (registryTypeName !== void 0 && shouldRegisterNamedType) {
@@ -4668,9 +4794,10 @@ function getNamedTypeFieldNodeInfoMap(type, checker, file, typeRegistry, visitin
4668
4794
  );
4669
4795
  }
4670
4796
  const typeAliasDecl = declarations.find(ts3.isTypeAliasDeclaration);
4671
- if (typeAliasDecl && ts3.isTypeLiteralNode(typeAliasDecl.type)) {
4797
+ const typeAliasMembers = typeAliasDecl === void 0 ? null : getObjectLikeTypeAliasMembers(typeAliasDecl.type);
4798
+ if (typeAliasDecl && typeAliasMembers !== null) {
4672
4799
  return buildFieldNodeInfoMap(
4673
- typeAliasDecl.type.members,
4800
+ typeAliasMembers,
4674
4801
  checker,
4675
4802
  file,
4676
4803
  typeRegistry,
@@ -4977,17 +5104,18 @@ function findInterfaceByName(sourceFile, interfaceName) {
4977
5104
  function findTypeAliasByName(sourceFile, aliasName) {
4978
5105
  return findNodeByName(sourceFile, aliasName, ts4.isTypeAliasDeclaration, (n) => n.name.text);
4979
5106
  }
4980
- function analyzeNamedTypeToIR(filePath, typeName, extensionRegistry, metadataPolicy) {
5107
+ function analyzeNamedTypeToIR(filePath, typeName, extensionRegistry, metadataPolicy, discriminatorOptions) {
4981
5108
  const ctx = createProgramContext(filePath);
4982
5109
  return analyzeNamedTypeToIRFromProgramContext(
4983
5110
  ctx,
4984
5111
  filePath,
4985
5112
  typeName,
4986
5113
  extensionRegistry,
4987
- metadataPolicy
5114
+ metadataPolicy,
5115
+ discriminatorOptions
4988
5116
  );
4989
5117
  }
4990
- function analyzeNamedTypeToIRFromProgramContext(ctx, filePath, typeName, extensionRegistry, metadataPolicy) {
5118
+ function analyzeNamedTypeToIRFromProgramContext(ctx, filePath, typeName, extensionRegistry, metadataPolicy, discriminatorOptions) {
4991
5119
  const analysisFilePath = path.resolve(filePath);
4992
5120
  const classDecl = findClassByName(ctx.sourceFile, typeName);
4993
5121
  if (classDecl !== null) {
@@ -4996,7 +5124,8 @@ function analyzeNamedTypeToIRFromProgramContext(ctx, filePath, typeName, extensi
4996
5124
  ctx.checker,
4997
5125
  analysisFilePath,
4998
5126
  extensionRegistry,
4999
- metadataPolicy
5127
+ metadataPolicy,
5128
+ discriminatorOptions
5000
5129
  );
5001
5130
  }
5002
5131
  const interfaceDecl = findInterfaceByName(ctx.sourceFile, typeName);
@@ -5006,7 +5135,8 @@ function analyzeNamedTypeToIRFromProgramContext(ctx, filePath, typeName, extensi
5006
5135
  ctx.checker,
5007
5136
  analysisFilePath,
5008
5137
  extensionRegistry,
5009
- metadataPolicy
5138
+ metadataPolicy,
5139
+ discriminatorOptions
5010
5140
  );
5011
5141
  }
5012
5142
  const typeAlias = findTypeAliasByName(ctx.sourceFile, typeName);
@@ -5016,7 +5146,8 @@ function analyzeNamedTypeToIRFromProgramContext(ctx, filePath, typeName, extensi
5016
5146
  ctx.checker,
5017
5147
  analysisFilePath,
5018
5148
  extensionRegistry,
5019
- metadataPolicy
5149
+ metadataPolicy,
5150
+ discriminatorOptions
5020
5151
  );
5021
5152
  if (result.ok) {
5022
5153
  return result.analysis;
@@ -5173,7 +5304,8 @@ function generateSchemasFromClass(options) {
5173
5304
  ctx.checker,
5174
5305
  options.filePath,
5175
5306
  options.extensionRegistry,
5176
- options.metadata
5307
+ options.metadata,
5308
+ options.discriminator
5177
5309
  );
5178
5310
  return generateClassSchemas(
5179
5311
  analysis,
@@ -5199,7 +5331,8 @@ function generateSchemasFromProgram(options) {
5199
5331
  options.filePath,
5200
5332
  options.typeName,
5201
5333
  options.extensionRegistry,
5202
- options.metadata
5334
+ options.metadata,
5335
+ options.discriminator
5203
5336
  );
5204
5337
  return generateClassSchemas(
5205
5338
  analysis,
@@ -5435,7 +5568,7 @@ function generateSchemasFromResolvedType(options, skipNamedDeclaration = false,
5435
5568
  typeRegistry,
5436
5569
  /* @__PURE__ */ new Set(),
5437
5570
  options.sourceNode,
5438
- createAnalyzerMetadataPolicy(options.metadata),
5571
+ createAnalyzerMetadataPolicy(options.metadata, options.discriminator),
5439
5572
  options.extensionRegistry,
5440
5573
  diagnostics
5441
5574
  );
@@ -5484,7 +5617,8 @@ function generateSchemasFromDeclaration(options) {
5484
5617
  options.context.checker,
5485
5618
  filePath,
5486
5619
  options.extensionRegistry,
5487
- options.metadata
5620
+ options.metadata,
5621
+ options.discriminator
5488
5622
  ),
5489
5623
  filePath,
5490
5624
  options
@@ -5497,7 +5631,8 @@ function generateSchemasFromDeclaration(options) {
5497
5631
  options.context.checker,
5498
5632
  filePath,
5499
5633
  options.extensionRegistry,
5500
- options.metadata
5634
+ options.metadata,
5635
+ options.discriminator
5501
5636
  ),
5502
5637
  filePath,
5503
5638
  options
@@ -5509,7 +5644,8 @@ function generateSchemasFromDeclaration(options) {
5509
5644
  options.context.checker,
5510
5645
  filePath,
5511
5646
  options.extensionRegistry,
5512
- options.metadata
5647
+ options.metadata,
5648
+ options.discriminator
5513
5649
  );
5514
5650
  if (analyzedAlias.ok) {
5515
5651
  return generateSchemasFromAnalysis(analyzedAlias.analysis, filePath, options);
@@ -5584,7 +5720,8 @@ function buildMixedAuthoringSchemas(options) {
5584
5720
  filePath,
5585
5721
  typeName,
5586
5722
  schemaOptions.extensionRegistry,
5587
- schemaOptions.metadata
5723
+ schemaOptions.metadata,
5724
+ schemaOptions.discriminator
5588
5725
  );
5589
5726
  const composedAnalysis = composeAnalysisWithOverlays(analysis, overlays, schemaOptions.metadata);
5590
5727
  const ir = canonicalizeTSDoc(