@formspec/build 0.1.0-alpha.33 → 0.1.0-alpha.34
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/analyzer/class-analyzer.d.ts +19 -4
- package/dist/analyzer/class-analyzer.d.ts.map +1 -1
- package/dist/analyzer/program.d.ts +3 -3
- package/dist/analyzer/program.d.ts.map +1 -1
- package/dist/build-alpha.d.ts +17 -0
- package/dist/build-beta.d.ts +17 -0
- package/dist/build-internal.d.ts +17 -0
- package/dist/build.d.ts +17 -0
- package/dist/cli.cjs +172 -52
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +172 -52
- package/dist/cli.js.map +1 -1
- package/dist/generators/class-schema.d.ts +4 -1
- package/dist/generators/class-schema.d.ts.map +1 -1
- package/dist/generators/discovered-schema.d.ts.map +1 -1
- package/dist/generators/mixed-authoring.d.ts.map +1 -1
- package/dist/index.cjs +172 -52
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +172 -52
- package/dist/index.js.map +1 -1
- package/dist/internals.cjs +156 -43
- package/dist/internals.cjs.map +1 -1
- package/dist/internals.d.ts +1 -1
- package/dist/internals.d.ts.map +1 -1
- package/dist/internals.js +156 -43
- package/dist/internals.js.map +1 -1
- package/package.json +3 -3
package/dist/cli.cjs
CHANGED
|
@@ -3000,6 +3000,9 @@ var init_jsdoc_constraints = __esm({
|
|
|
3000
3000
|
function isObjectType(type) {
|
|
3001
3001
|
return !!(type.flags & ts3.TypeFlags.Object);
|
|
3002
3002
|
}
|
|
3003
|
+
function isIntersectionType(type) {
|
|
3004
|
+
return !!(type.flags & ts3.TypeFlags.Intersection);
|
|
3005
|
+
}
|
|
3003
3006
|
function isTypeReference(type) {
|
|
3004
3007
|
return !!(type.flags & ts3.TypeFlags.Object) && !!(type.objectFlags & ts3.ObjectFlags.Reference);
|
|
3005
3008
|
}
|
|
@@ -3015,10 +3018,11 @@ function makeParseOptions(extensionRegistry, fieldType, checker, subjectType, ho
|
|
|
3015
3018
|
...hostType !== void 0 && { hostType }
|
|
3016
3019
|
};
|
|
3017
3020
|
}
|
|
3018
|
-
function createAnalyzerMetadataPolicy(input) {
|
|
3021
|
+
function createAnalyzerMetadataPolicy(input, discriminator) {
|
|
3019
3022
|
return {
|
|
3020
3023
|
raw: input,
|
|
3021
|
-
normalized: normalizeMetadataPolicy(input)
|
|
3024
|
+
normalized: normalizeMetadataPolicy(input),
|
|
3025
|
+
discriminator
|
|
3022
3026
|
};
|
|
3023
3027
|
}
|
|
3024
3028
|
function resolveNodeMetadata(metadataPolicy, declarationKind, logicalName, node, checker, extensionRegistry, buildContext) {
|
|
@@ -3086,8 +3090,11 @@ function analyzeDeclarationRootInfo(declaration, checker, file = "", extensionRe
|
|
|
3086
3090
|
diagnostics: docResult.diagnostics
|
|
3087
3091
|
};
|
|
3088
3092
|
}
|
|
3089
|
-
function analyzeClassToIR(classDecl, checker, file = "", extensionRegistry, metadataPolicy) {
|
|
3090
|
-
const normalizedMetadataPolicy = createAnalyzerMetadataPolicy(
|
|
3093
|
+
function analyzeClassToIR(classDecl, checker, file = "", extensionRegistry, metadataPolicy, discriminatorOptions) {
|
|
3094
|
+
const normalizedMetadataPolicy = createAnalyzerMetadataPolicy(
|
|
3095
|
+
metadataPolicy,
|
|
3096
|
+
discriminatorOptions
|
|
3097
|
+
);
|
|
3091
3098
|
const name = classDecl.name?.text ?? "AnonymousClass";
|
|
3092
3099
|
const fields = [];
|
|
3093
3100
|
const fieldLayouts = [];
|
|
@@ -3168,8 +3175,11 @@ function analyzeClassToIR(classDecl, checker, file = "", extensionRegistry, meta
|
|
|
3168
3175
|
staticMethods
|
|
3169
3176
|
};
|
|
3170
3177
|
}
|
|
3171
|
-
function analyzeInterfaceToIR(interfaceDecl, checker, file = "", extensionRegistry, metadataPolicy) {
|
|
3172
|
-
const normalizedMetadataPolicy = createAnalyzerMetadataPolicy(
|
|
3178
|
+
function analyzeInterfaceToIR(interfaceDecl, checker, file = "", extensionRegistry, metadataPolicy, discriminatorOptions) {
|
|
3179
|
+
const normalizedMetadataPolicy = createAnalyzerMetadataPolicy(
|
|
3180
|
+
metadataPolicy,
|
|
3181
|
+
discriminatorOptions
|
|
3182
|
+
);
|
|
3173
3183
|
const name = interfaceDecl.name.text;
|
|
3174
3184
|
const fields = [];
|
|
3175
3185
|
const typeRegistry = {};
|
|
@@ -3237,19 +3247,31 @@ function analyzeInterfaceToIR(interfaceDecl, checker, file = "", extensionRegist
|
|
|
3237
3247
|
staticMethods: []
|
|
3238
3248
|
};
|
|
3239
3249
|
}
|
|
3240
|
-
function analyzeTypeAliasToIR(typeAlias, checker, file = "", extensionRegistry, metadataPolicy) {
|
|
3241
|
-
|
|
3250
|
+
function analyzeTypeAliasToIR(typeAlias, checker, file = "", extensionRegistry, metadataPolicy, discriminatorOptions) {
|
|
3251
|
+
const members = getObjectLikeTypeAliasMembers(typeAlias.type);
|
|
3252
|
+
if (members === null) {
|
|
3242
3253
|
const sourceFile = typeAlias.getSourceFile();
|
|
3243
3254
|
const { line } = sourceFile.getLineAndCharacterOfPosition(typeAlias.getStart());
|
|
3244
3255
|
const kindDesc = ts3.SyntaxKind[typeAlias.type.kind] ?? "unknown";
|
|
3245
3256
|
return {
|
|
3246
3257
|
ok: false,
|
|
3247
|
-
error: `Type alias "${typeAlias.name.text}" at line ${String(line + 1)} is not an object type
|
|
3258
|
+
error: `Type alias "${typeAlias.name.text}" at line ${String(line + 1)} is not an object-like type alias (found ${kindDesc})`
|
|
3248
3259
|
};
|
|
3249
3260
|
}
|
|
3250
|
-
const
|
|
3251
|
-
|
|
3261
|
+
const normalizedMetadataPolicy = createAnalyzerMetadataPolicy(
|
|
3262
|
+
metadataPolicy,
|
|
3263
|
+
discriminatorOptions
|
|
3264
|
+
);
|
|
3252
3265
|
const name = typeAlias.name.text;
|
|
3266
|
+
const duplicatePropertyNames = findDuplicateObjectLikeTypeAliasPropertyNames(members);
|
|
3267
|
+
if (duplicatePropertyNames.length > 0) {
|
|
3268
|
+
const sourceFile = typeAlias.getSourceFile();
|
|
3269
|
+
const { line } = sourceFile.getLineAndCharacterOfPosition(typeAlias.getStart());
|
|
3270
|
+
return {
|
|
3271
|
+
ok: false,
|
|
3272
|
+
error: `Type alias "${name}" at line ${String(line + 1)} contains duplicate property names across object-like members: ${duplicatePropertyNames.join(", ")}`
|
|
3273
|
+
};
|
|
3274
|
+
}
|
|
3253
3275
|
const fields = [];
|
|
3254
3276
|
const typeRegistry = {};
|
|
3255
3277
|
const diagnostics = [];
|
|
@@ -3262,7 +3284,7 @@ function analyzeTypeAliasToIR(typeAlias, checker, file = "", extensionRegistry,
|
|
|
3262
3284
|
const annotations = [...typeAliasDoc.annotations];
|
|
3263
3285
|
diagnostics.push(...typeAliasDoc.diagnostics);
|
|
3264
3286
|
const visiting = /* @__PURE__ */ new Set();
|
|
3265
|
-
for (const member of
|
|
3287
|
+
for (const member of members) {
|
|
3266
3288
|
if (ts3.isPropertySignature(member)) {
|
|
3267
3289
|
const fieldNode = analyzeInterfacePropertyToIR(
|
|
3268
3290
|
member,
|
|
@@ -3371,15 +3393,43 @@ function isNullishSemanticType(type) {
|
|
|
3371
3393
|
}
|
|
3372
3394
|
return type.isUnion() && type.types.some((member) => isNullishSemanticType(member));
|
|
3373
3395
|
}
|
|
3374
|
-
function isStringLikeSemanticType(type) {
|
|
3396
|
+
function isStringLikeSemanticType(type, checker, seen = /* @__PURE__ */ new Set()) {
|
|
3397
|
+
if (seen.has(type)) {
|
|
3398
|
+
return false;
|
|
3399
|
+
}
|
|
3400
|
+
seen.add(type);
|
|
3375
3401
|
if (type.flags & ts3.TypeFlags.StringLike) {
|
|
3376
3402
|
return true;
|
|
3377
3403
|
}
|
|
3378
3404
|
if (type.isUnion()) {
|
|
3379
|
-
return type.types.length > 0 && type.types.every((member) => isStringLikeSemanticType(member));
|
|
3405
|
+
return type.types.length > 0 && type.types.every((member) => isStringLikeSemanticType(member, checker, seen));
|
|
3406
|
+
}
|
|
3407
|
+
const baseConstraint = checker.getBaseConstraintOfType(type);
|
|
3408
|
+
if (baseConstraint !== void 0 && baseConstraint !== type) {
|
|
3409
|
+
return isStringLikeSemanticType(baseConstraint, checker, seen);
|
|
3380
3410
|
}
|
|
3381
3411
|
return false;
|
|
3382
3412
|
}
|
|
3413
|
+
function getObjectLikeTypeAliasMembers(typeNode) {
|
|
3414
|
+
if (ts3.isParenthesizedTypeNode(typeNode)) {
|
|
3415
|
+
return getObjectLikeTypeAliasMembers(typeNode.type);
|
|
3416
|
+
}
|
|
3417
|
+
if (ts3.isTypeLiteralNode(typeNode)) {
|
|
3418
|
+
return [...typeNode.members];
|
|
3419
|
+
}
|
|
3420
|
+
if (ts3.isIntersectionTypeNode(typeNode)) {
|
|
3421
|
+
const members = [];
|
|
3422
|
+
for (const intersectionMember of typeNode.types) {
|
|
3423
|
+
const resolvedMembers = getObjectLikeTypeAliasMembers(intersectionMember);
|
|
3424
|
+
if (resolvedMembers === null) {
|
|
3425
|
+
return null;
|
|
3426
|
+
}
|
|
3427
|
+
members.push(...resolvedMembers);
|
|
3428
|
+
}
|
|
3429
|
+
return members;
|
|
3430
|
+
}
|
|
3431
|
+
return null;
|
|
3432
|
+
}
|
|
3383
3433
|
function extractDiscriminatorDirective(node, file, diagnostics) {
|
|
3384
3434
|
const discriminatorTags = getLeadingParsedTags(node).filter(
|
|
3385
3435
|
(tag) => tag.normalizedTagName === "discriminator"
|
|
@@ -3486,7 +3536,7 @@ function validateDiscriminatorDirective(node, checker, file, diagnostics) {
|
|
|
3486
3536
|
);
|
|
3487
3537
|
return null;
|
|
3488
3538
|
}
|
|
3489
|
-
if (!isStringLikeSemanticType(property.type)) {
|
|
3539
|
+
if (!isStringLikeSemanticType(property.type, checker)) {
|
|
3490
3540
|
diagnostics.push(
|
|
3491
3541
|
makeAnalysisDiagnostic(
|
|
3492
3542
|
"TYPE_MISMATCH",
|
|
@@ -3513,8 +3563,8 @@ function getConcreteTypeArgumentForDiscriminator(node, subjectType, checker, typ
|
|
|
3513
3563
|
const localTypeParameter = node.typeParameters?.[typeParameterIndex];
|
|
3514
3564
|
return localTypeParameter === void 0 ? null : checker.getTypeAtLocation(localTypeParameter);
|
|
3515
3565
|
}
|
|
3516
|
-
function resolveLiteralDiscriminatorPropertyValue(boundType,
|
|
3517
|
-
const propertySymbol = boundType.getProperty(
|
|
3566
|
+
function resolveLiteralDiscriminatorPropertyValue(boundType, propertyName, checker, provenance, diagnostics) {
|
|
3567
|
+
const propertySymbol = boundType.getProperty(propertyName);
|
|
3518
3568
|
if (propertySymbol === void 0) {
|
|
3519
3569
|
return void 0;
|
|
3520
3570
|
}
|
|
@@ -3545,6 +3595,9 @@ function resolveLiteralDiscriminatorPropertyValue(boundType, fieldName, checker,
|
|
|
3545
3595
|
}
|
|
3546
3596
|
return void 0;
|
|
3547
3597
|
}
|
|
3598
|
+
function getDiscriminatorIdentityPropertyNames(fieldName) {
|
|
3599
|
+
return fieldName === "object" ? ["object"] : [fieldName, "object"];
|
|
3600
|
+
}
|
|
3548
3601
|
function resolveDiscriminatorApiName(boundType, checker, metadataPolicy) {
|
|
3549
3602
|
const declaration = resolveNamedDiscriminatorDeclaration(boundType, checker);
|
|
3550
3603
|
if (declaration === null) {
|
|
@@ -3565,6 +3618,10 @@ function resolveDiscriminatorApiName(boundType, checker, metadataPolicy) {
|
|
|
3565
3618
|
);
|
|
3566
3619
|
return metadata?.apiName;
|
|
3567
3620
|
}
|
|
3621
|
+
function applyDiscriminatorApiNamePrefix(value, discriminatorOptions) {
|
|
3622
|
+
const prefix = discriminatorOptions?.apiNamePrefix;
|
|
3623
|
+
return prefix === void 0 || prefix === "" ? value : `${prefix}${value}`;
|
|
3624
|
+
}
|
|
3568
3625
|
function resolveNamedDiscriminatorDeclaration(type, checker, seen = /* @__PURE__ */ new Set()) {
|
|
3569
3626
|
if (seen.has(type)) {
|
|
3570
3627
|
return null;
|
|
@@ -3619,22 +3676,27 @@ function resolveDiscriminatorValue(boundType, fieldName, checker, provenance, di
|
|
|
3619
3676
|
return null;
|
|
3620
3677
|
}
|
|
3621
3678
|
}
|
|
3622
|
-
const
|
|
3623
|
-
|
|
3624
|
-
|
|
3625
|
-
|
|
3626
|
-
|
|
3627
|
-
|
|
3628
|
-
|
|
3629
|
-
|
|
3630
|
-
|
|
3679
|
+
for (const identityPropertyName of getDiscriminatorIdentityPropertyNames(fieldName)) {
|
|
3680
|
+
const literalIdentityValue = resolveLiteralDiscriminatorPropertyValue(
|
|
3681
|
+
boundType,
|
|
3682
|
+
identityPropertyName,
|
|
3683
|
+
checker,
|
|
3684
|
+
provenance,
|
|
3685
|
+
diagnostics
|
|
3686
|
+
);
|
|
3687
|
+
if (literalIdentityValue === null) {
|
|
3688
|
+
return null;
|
|
3689
|
+
}
|
|
3690
|
+
if (literalIdentityValue !== void 0) {
|
|
3691
|
+
return literalIdentityValue;
|
|
3692
|
+
}
|
|
3631
3693
|
}
|
|
3632
3694
|
const apiName = resolveDiscriminatorApiName(boundType, checker, metadataPolicy);
|
|
3633
3695
|
if (apiName?.source === "explicit") {
|
|
3634
|
-
return apiName.value;
|
|
3696
|
+
return applyDiscriminatorApiNamePrefix(apiName.value, metadataPolicy.discriminator);
|
|
3635
3697
|
}
|
|
3636
3698
|
if (apiName?.source === "inferred") {
|
|
3637
|
-
return apiName.value;
|
|
3699
|
+
return applyDiscriminatorApiNamePrefix(apiName.value, metadataPolicy.discriminator);
|
|
3638
3700
|
}
|
|
3639
3701
|
diagnostics.push(
|
|
3640
3702
|
makeAnalysisDiagnostic(
|
|
@@ -3697,15 +3759,20 @@ function buildInstantiatedReferenceName(baseName, typeArguments, checker) {
|
|
|
3697
3759
|
return renderedArguments.length === 0 ? baseName : `${baseName}__${renderedArguments.join("__")}`;
|
|
3698
3760
|
}
|
|
3699
3761
|
function extractReferenceTypeArguments(type, checker, file, typeRegistry, visiting, sourceNode, metadataPolicy, extensionRegistry, diagnostics) {
|
|
3700
|
-
const
|
|
3701
|
-
if (
|
|
3762
|
+
const sourceTypeNode = sourceNode === void 0 ? void 0 : extractTypeNodeFromSource(sourceNode);
|
|
3763
|
+
if (sourceTypeNode === void 0) {
|
|
3702
3764
|
return [];
|
|
3703
3765
|
}
|
|
3704
|
-
const
|
|
3705
|
-
|
|
3766
|
+
const unwrapParentheses = (typeNode) => ts3.isParenthesizedTypeNode(typeNode) ? unwrapParentheses(typeNode.type) : typeNode;
|
|
3767
|
+
const directTypeNode = unwrapParentheses(sourceTypeNode);
|
|
3768
|
+
const referenceTypeNode = ts3.isTypeReferenceNode(directTypeNode) ? directTypeNode : (() => {
|
|
3769
|
+
const resolvedTypeNode = resolveAliasedTypeNode(directTypeNode, checker);
|
|
3770
|
+
return ts3.isTypeReferenceNode(resolvedTypeNode) ? resolvedTypeNode : null;
|
|
3771
|
+
})();
|
|
3772
|
+
if (referenceTypeNode?.typeArguments === void 0) {
|
|
3706
3773
|
return [];
|
|
3707
3774
|
}
|
|
3708
|
-
return
|
|
3775
|
+
return referenceTypeNode.typeArguments.map((argumentNode) => {
|
|
3709
3776
|
const argumentType = checker.getTypeFromTypeNode(argumentNode);
|
|
3710
3777
|
return {
|
|
3711
3778
|
tsType: argumentType,
|
|
@@ -3819,10 +3886,10 @@ function analyzeFieldToIR(prop, checker, file, typeRegistry, visiting, diagnosti
|
|
|
3819
3886
|
};
|
|
3820
3887
|
}
|
|
3821
3888
|
function analyzeInterfacePropertyToIR(prop, checker, file, typeRegistry, visiting, diagnostics, hostType, metadataPolicy, extensionRegistry) {
|
|
3822
|
-
|
|
3889
|
+
const name = getAnalyzableObjectLikePropertyName(prop.name);
|
|
3890
|
+
if (name === null) {
|
|
3823
3891
|
return null;
|
|
3824
3892
|
}
|
|
3825
|
-
const name = prop.name.text;
|
|
3826
3893
|
const tsType = checker.getTypeAtLocation(prop);
|
|
3827
3894
|
const optional = prop.questionToken !== void 0;
|
|
3828
3895
|
const provenance = provenanceForNode(prop, file);
|
|
@@ -3878,6 +3945,31 @@ function analyzeInterfacePropertyToIR(prop, checker, file, typeRegistry, visitin
|
|
|
3878
3945
|
provenance
|
|
3879
3946
|
};
|
|
3880
3947
|
}
|
|
3948
|
+
function findDuplicateObjectLikeTypeAliasPropertyNames(members) {
|
|
3949
|
+
const seen = /* @__PURE__ */ new Set();
|
|
3950
|
+
const duplicates = /* @__PURE__ */ new Set();
|
|
3951
|
+
for (const member of members) {
|
|
3952
|
+
if (!ts3.isPropertySignature(member)) {
|
|
3953
|
+
continue;
|
|
3954
|
+
}
|
|
3955
|
+
const name = getAnalyzableObjectLikePropertyName(member.name);
|
|
3956
|
+
if (name === null) {
|
|
3957
|
+
continue;
|
|
3958
|
+
}
|
|
3959
|
+
if (seen.has(name)) {
|
|
3960
|
+
duplicates.add(name);
|
|
3961
|
+
continue;
|
|
3962
|
+
}
|
|
3963
|
+
seen.add(name);
|
|
3964
|
+
}
|
|
3965
|
+
return [...duplicates].sort();
|
|
3966
|
+
}
|
|
3967
|
+
function getAnalyzableObjectLikePropertyName(name) {
|
|
3968
|
+
if (!ts3.isIdentifier(name)) {
|
|
3969
|
+
return null;
|
|
3970
|
+
}
|
|
3971
|
+
return name.text;
|
|
3972
|
+
}
|
|
3881
3973
|
function applyEnumMemberDisplayNames(type, annotations) {
|
|
3882
3974
|
if (!annotations.some(
|
|
3883
3975
|
(annotation) => annotation.annotationKind === "displayName" && annotation.value.trim().startsWith(":")
|
|
@@ -4070,6 +4162,23 @@ function resolveTypeNode(type, checker, file, typeRegistry, visiting, sourceNode
|
|
|
4070
4162
|
diagnostics
|
|
4071
4163
|
);
|
|
4072
4164
|
}
|
|
4165
|
+
if (isIntersectionType(type)) {
|
|
4166
|
+
const sourceTypeNode = sourceNode === void 0 ? void 0 : extractTypeNodeFromSource(sourceNode);
|
|
4167
|
+
const resolvedSourceTypeNode = sourceTypeNode === void 0 ? void 0 : resolveAliasedTypeNode(sourceTypeNode, checker);
|
|
4168
|
+
if (resolvedSourceTypeNode !== void 0 && getObjectLikeTypeAliasMembers(resolvedSourceTypeNode) !== null) {
|
|
4169
|
+
return resolveObjectType(
|
|
4170
|
+
type,
|
|
4171
|
+
checker,
|
|
4172
|
+
file,
|
|
4173
|
+
typeRegistry,
|
|
4174
|
+
visiting,
|
|
4175
|
+
sourceNode,
|
|
4176
|
+
metadataPolicy,
|
|
4177
|
+
extensionRegistry,
|
|
4178
|
+
diagnostics
|
|
4179
|
+
);
|
|
4180
|
+
}
|
|
4181
|
+
}
|
|
4073
4182
|
if (isObjectType(type)) {
|
|
4074
4183
|
return resolveObjectType(
|
|
4075
4184
|
type,
|
|
@@ -4449,7 +4558,7 @@ function resolveObjectType(type, checker, file, typeRegistry, visiting, sourceNo
|
|
|
4449
4558
|
};
|
|
4450
4559
|
}
|
|
4451
4560
|
}
|
|
4452
|
-
const recordNode = tryResolveRecordType(
|
|
4561
|
+
const recordNode = isObjectType(type) ? tryResolveRecordType(
|
|
4453
4562
|
type,
|
|
4454
4563
|
checker,
|
|
4455
4564
|
file,
|
|
@@ -4458,7 +4567,7 @@ function resolveObjectType(type, checker, file, typeRegistry, visiting, sourceNo
|
|
|
4458
4567
|
metadataPolicy,
|
|
4459
4568
|
extensionRegistry,
|
|
4460
4569
|
collectedDiagnostics
|
|
4461
|
-
);
|
|
4570
|
+
) : null;
|
|
4462
4571
|
if (recordNode) {
|
|
4463
4572
|
visiting.delete(type);
|
|
4464
4573
|
if (registryTypeName !== void 0 && shouldRegisterNamedType) {
|
|
@@ -4655,9 +4764,10 @@ function getNamedTypeFieldNodeInfoMap(type, checker, file, typeRegistry, visitin
|
|
|
4655
4764
|
);
|
|
4656
4765
|
}
|
|
4657
4766
|
const typeAliasDecl = declarations.find(ts3.isTypeAliasDeclaration);
|
|
4658
|
-
|
|
4767
|
+
const typeAliasMembers = typeAliasDecl === void 0 ? null : getObjectLikeTypeAliasMembers(typeAliasDecl.type);
|
|
4768
|
+
if (typeAliasDecl && typeAliasMembers !== null) {
|
|
4659
4769
|
return buildFieldNodeInfoMap(
|
|
4660
|
-
|
|
4770
|
+
typeAliasMembers,
|
|
4661
4771
|
checker,
|
|
4662
4772
|
file,
|
|
4663
4773
|
typeRegistry,
|
|
@@ -4964,17 +5074,18 @@ function findInterfaceByName(sourceFile, interfaceName) {
|
|
|
4964
5074
|
function findTypeAliasByName(sourceFile, aliasName) {
|
|
4965
5075
|
return findNodeByName(sourceFile, aliasName, ts4.isTypeAliasDeclaration, (n) => n.name.text);
|
|
4966
5076
|
}
|
|
4967
|
-
function analyzeNamedTypeToIR(filePath, typeName, extensionRegistry, metadataPolicy) {
|
|
5077
|
+
function analyzeNamedTypeToIR(filePath, typeName, extensionRegistry, metadataPolicy, discriminatorOptions) {
|
|
4968
5078
|
const ctx = createProgramContext(filePath);
|
|
4969
5079
|
return analyzeNamedTypeToIRFromProgramContext(
|
|
4970
5080
|
ctx,
|
|
4971
5081
|
filePath,
|
|
4972
5082
|
typeName,
|
|
4973
5083
|
extensionRegistry,
|
|
4974
|
-
metadataPolicy
|
|
5084
|
+
metadataPolicy,
|
|
5085
|
+
discriminatorOptions
|
|
4975
5086
|
);
|
|
4976
5087
|
}
|
|
4977
|
-
function analyzeNamedTypeToIRFromProgramContext(ctx, filePath, typeName, extensionRegistry, metadataPolicy) {
|
|
5088
|
+
function analyzeNamedTypeToIRFromProgramContext(ctx, filePath, typeName, extensionRegistry, metadataPolicy, discriminatorOptions) {
|
|
4978
5089
|
const analysisFilePath = path.resolve(filePath);
|
|
4979
5090
|
const classDecl = findClassByName(ctx.sourceFile, typeName);
|
|
4980
5091
|
if (classDecl !== null) {
|
|
@@ -4983,7 +5094,8 @@ function analyzeNamedTypeToIRFromProgramContext(ctx, filePath, typeName, extensi
|
|
|
4983
5094
|
ctx.checker,
|
|
4984
5095
|
analysisFilePath,
|
|
4985
5096
|
extensionRegistry,
|
|
4986
|
-
metadataPolicy
|
|
5097
|
+
metadataPolicy,
|
|
5098
|
+
discriminatorOptions
|
|
4987
5099
|
);
|
|
4988
5100
|
}
|
|
4989
5101
|
const interfaceDecl = findInterfaceByName(ctx.sourceFile, typeName);
|
|
@@ -4993,7 +5105,8 @@ function analyzeNamedTypeToIRFromProgramContext(ctx, filePath, typeName, extensi
|
|
|
4993
5105
|
ctx.checker,
|
|
4994
5106
|
analysisFilePath,
|
|
4995
5107
|
extensionRegistry,
|
|
4996
|
-
metadataPolicy
|
|
5108
|
+
metadataPolicy,
|
|
5109
|
+
discriminatorOptions
|
|
4997
5110
|
);
|
|
4998
5111
|
}
|
|
4999
5112
|
const typeAlias = findTypeAliasByName(ctx.sourceFile, typeName);
|
|
@@ -5003,7 +5116,8 @@ function analyzeNamedTypeToIRFromProgramContext(ctx, filePath, typeName, extensi
|
|
|
5003
5116
|
ctx.checker,
|
|
5004
5117
|
analysisFilePath,
|
|
5005
5118
|
extensionRegistry,
|
|
5006
|
-
metadataPolicy
|
|
5119
|
+
metadataPolicy,
|
|
5120
|
+
discriminatorOptions
|
|
5007
5121
|
);
|
|
5008
5122
|
if (result.ok) {
|
|
5009
5123
|
return result.analysis;
|
|
@@ -5161,7 +5275,8 @@ function generateSchemasFromClass(options) {
|
|
|
5161
5275
|
ctx.checker,
|
|
5162
5276
|
options.filePath,
|
|
5163
5277
|
options.extensionRegistry,
|
|
5164
|
-
options.metadata
|
|
5278
|
+
options.metadata,
|
|
5279
|
+
options.discriminator
|
|
5165
5280
|
);
|
|
5166
5281
|
return generateClassSchemas(
|
|
5167
5282
|
analysis,
|
|
@@ -5187,7 +5302,8 @@ function generateSchemasFromProgram(options) {
|
|
|
5187
5302
|
options.filePath,
|
|
5188
5303
|
options.typeName,
|
|
5189
5304
|
options.extensionRegistry,
|
|
5190
|
-
options.metadata
|
|
5305
|
+
options.metadata,
|
|
5306
|
+
options.discriminator
|
|
5191
5307
|
);
|
|
5192
5308
|
return generateClassSchemas(
|
|
5193
5309
|
analysis,
|
|
@@ -5424,7 +5540,7 @@ function generateSchemasFromResolvedType(options, skipNamedDeclaration = false,
|
|
|
5424
5540
|
typeRegistry,
|
|
5425
5541
|
/* @__PURE__ */ new Set(),
|
|
5426
5542
|
options.sourceNode,
|
|
5427
|
-
createAnalyzerMetadataPolicy(options.metadata),
|
|
5543
|
+
createAnalyzerMetadataPolicy(options.metadata, options.discriminator),
|
|
5428
5544
|
options.extensionRegistry,
|
|
5429
5545
|
diagnostics
|
|
5430
5546
|
);
|
|
@@ -5473,7 +5589,8 @@ function generateSchemasFromDeclaration(options) {
|
|
|
5473
5589
|
options.context.checker,
|
|
5474
5590
|
filePath,
|
|
5475
5591
|
options.extensionRegistry,
|
|
5476
|
-
options.metadata
|
|
5592
|
+
options.metadata,
|
|
5593
|
+
options.discriminator
|
|
5477
5594
|
),
|
|
5478
5595
|
filePath,
|
|
5479
5596
|
options
|
|
@@ -5486,7 +5603,8 @@ function generateSchemasFromDeclaration(options) {
|
|
|
5486
5603
|
options.context.checker,
|
|
5487
5604
|
filePath,
|
|
5488
5605
|
options.extensionRegistry,
|
|
5489
|
-
options.metadata
|
|
5606
|
+
options.metadata,
|
|
5607
|
+
options.discriminator
|
|
5490
5608
|
),
|
|
5491
5609
|
filePath,
|
|
5492
5610
|
options
|
|
@@ -5498,7 +5616,8 @@ function generateSchemasFromDeclaration(options) {
|
|
|
5498
5616
|
options.context.checker,
|
|
5499
5617
|
filePath,
|
|
5500
5618
|
options.extensionRegistry,
|
|
5501
|
-
options.metadata
|
|
5619
|
+
options.metadata,
|
|
5620
|
+
options.discriminator
|
|
5502
5621
|
);
|
|
5503
5622
|
if (analyzedAlias.ok) {
|
|
5504
5623
|
return generateSchemasFromAnalysis(analyzedAlias.analysis, filePath, options);
|
|
@@ -5576,7 +5695,8 @@ function buildMixedAuthoringSchemas(options) {
|
|
|
5576
5695
|
filePath,
|
|
5577
5696
|
typeName,
|
|
5578
5697
|
schemaOptions.extensionRegistry,
|
|
5579
|
-
schemaOptions.metadata
|
|
5698
|
+
schemaOptions.metadata,
|
|
5699
|
+
schemaOptions.discriminator
|
|
5580
5700
|
);
|
|
5581
5701
|
const composedAnalysis = composeAnalysisWithOverlays(analysis, overlays, schemaOptions.metadata);
|
|
5582
5702
|
const ir = canonicalizeTSDoc(
|