@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/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 +192 -55
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +192 -55
- 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 +192 -55
- 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 +192 -55
- package/dist/index.js.map +1 -1
- package/dist/internals.cjs +176 -46
- 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 +176 -46
- package/dist/internals.js.map +1 -1
- package/package.json +1 -1
package/dist/internals.d.ts
CHANGED
|
@@ -16,7 +16,7 @@ export { canonicalizeTSDoc } from "./canonicalize/index.js";
|
|
|
16
16
|
export type { TSDocSource } from "./canonicalize/index.js";
|
|
17
17
|
export { createProgramContext, createProgramContextFromProgram, findClassByName, findInterfaceByName, findTypeAliasByName, analyzeNamedTypeToIRFromProgramContext, } from "./analyzer/program.js";
|
|
18
18
|
export { analyzeClassToIR, analyzeInterfaceToIR, analyzeTypeAliasToIR, } from "./analyzer/class-analyzer.js";
|
|
19
|
-
export type { IRClassAnalysis, FieldLayoutMetadata, AnalyzeTypeAliasToIRResult, } from "./analyzer/class-analyzer.js";
|
|
19
|
+
export type { DiscriminatorResolutionOptions, IRClassAnalysis, FieldLayoutMetadata, AnalyzeTypeAliasToIRResult, } from "./analyzer/class-analyzer.js";
|
|
20
20
|
export { generateClassSchemas } from "./generators/class-schema.js";
|
|
21
21
|
export type { ClassSchemas } from "./generators/class-schema.js";
|
|
22
22
|
export { generateJsonSchemaFromIR } from "./json-schema/ir-generator.js";
|
package/dist/internals.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"internals.d.ts","sourceRoot":"","sources":["../src/internals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAG/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,YAAY,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAG3D,OAAO,EACL,oBAAoB,EACpB,+BAA+B,EAC/B,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,sCAAsC,GACvC,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,8BAA8B,CAAC;AACtC,YAAY,EACV,eAAe,EACf,mBAAmB,EACnB,0BAA0B,GAC3B,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,YAAY,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAGjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,YAAY,EACV,+BAA+B,EAC/B,cAAc,GACf,MAAM,+BAA+B,CAAC;AAGvC,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAGrE,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,YAAY,EACV,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,YAAY,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAG/D,OAAO,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AACjG,YAAY,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC"}
|
|
1
|
+
{"version":3,"file":"internals.d.ts","sourceRoot":"","sources":["../src/internals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAG/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,YAAY,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAG3D,OAAO,EACL,oBAAoB,EACpB,+BAA+B,EAC/B,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,sCAAsC,GACvC,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,8BAA8B,CAAC;AACtC,YAAY,EACV,8BAA8B,EAC9B,eAAe,EACf,mBAAmB,EACnB,0BAA0B,GAC3B,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,YAAY,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAGjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,YAAY,EACV,+BAA+B,EAC/B,cAAc,GACf,MAAM,+BAA+B,CAAC;AAGvC,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAGrE,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,YAAY,EACV,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,YAAY,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAG/D,OAAO,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AACjG,YAAY,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC"}
|
package/dist/internals.js
CHANGED
|
@@ -1653,6 +1653,9 @@ function extractDefaultValueAnnotation(initializer, file = "") {
|
|
|
1653
1653
|
function isObjectType(type) {
|
|
1654
1654
|
return !!(type.flags & ts3.TypeFlags.Object);
|
|
1655
1655
|
}
|
|
1656
|
+
function isIntersectionType(type) {
|
|
1657
|
+
return !!(type.flags & ts3.TypeFlags.Intersection);
|
|
1658
|
+
}
|
|
1656
1659
|
function isTypeReference(type) {
|
|
1657
1660
|
return !!(type.flags & ts3.TypeFlags.Object) && !!(type.objectFlags & ts3.ObjectFlags.Reference);
|
|
1658
1661
|
}
|
|
@@ -1673,10 +1676,11 @@ function makeParseOptions(extensionRegistry, fieldType, checker, subjectType, ho
|
|
|
1673
1676
|
...hostType !== void 0 && { hostType }
|
|
1674
1677
|
};
|
|
1675
1678
|
}
|
|
1676
|
-
function createAnalyzerMetadataPolicy(input) {
|
|
1679
|
+
function createAnalyzerMetadataPolicy(input, discriminator) {
|
|
1677
1680
|
return {
|
|
1678
1681
|
raw: input,
|
|
1679
|
-
normalized: normalizeMetadataPolicy(input)
|
|
1682
|
+
normalized: normalizeMetadataPolicy(input),
|
|
1683
|
+
discriminator
|
|
1680
1684
|
};
|
|
1681
1685
|
}
|
|
1682
1686
|
function resolveNodeMetadata(metadataPolicy, declarationKind, logicalName, node, checker, extensionRegistry, buildContext) {
|
|
@@ -1715,8 +1719,11 @@ function resolveNodeMetadata(metadataPolicy, declarationKind, logicalName, node,
|
|
|
1715
1719
|
}
|
|
1716
1720
|
return resolvedMetadata;
|
|
1717
1721
|
}
|
|
1718
|
-
function analyzeClassToIR(classDecl, checker, file = "", extensionRegistry, metadataPolicy) {
|
|
1719
|
-
const normalizedMetadataPolicy = createAnalyzerMetadataPolicy(
|
|
1722
|
+
function analyzeClassToIR(classDecl, checker, file = "", extensionRegistry, metadataPolicy, discriminatorOptions) {
|
|
1723
|
+
const normalizedMetadataPolicy = createAnalyzerMetadataPolicy(
|
|
1724
|
+
metadataPolicy,
|
|
1725
|
+
discriminatorOptions
|
|
1726
|
+
);
|
|
1720
1727
|
const name = classDecl.name?.text ?? "AnonymousClass";
|
|
1721
1728
|
const fields = [];
|
|
1722
1729
|
const fieldLayouts = [];
|
|
@@ -1797,8 +1804,11 @@ function analyzeClassToIR(classDecl, checker, file = "", extensionRegistry, meta
|
|
|
1797
1804
|
staticMethods
|
|
1798
1805
|
};
|
|
1799
1806
|
}
|
|
1800
|
-
function analyzeInterfaceToIR(interfaceDecl, checker, file = "", extensionRegistry, metadataPolicy) {
|
|
1801
|
-
const normalizedMetadataPolicy = createAnalyzerMetadataPolicy(
|
|
1807
|
+
function analyzeInterfaceToIR(interfaceDecl, checker, file = "", extensionRegistry, metadataPolicy, discriminatorOptions) {
|
|
1808
|
+
const normalizedMetadataPolicy = createAnalyzerMetadataPolicy(
|
|
1809
|
+
metadataPolicy,
|
|
1810
|
+
discriminatorOptions
|
|
1811
|
+
);
|
|
1802
1812
|
const name = interfaceDecl.name.text;
|
|
1803
1813
|
const fields = [];
|
|
1804
1814
|
const typeRegistry = {};
|
|
@@ -1866,19 +1876,31 @@ function analyzeInterfaceToIR(interfaceDecl, checker, file = "", extensionRegist
|
|
|
1866
1876
|
staticMethods: []
|
|
1867
1877
|
};
|
|
1868
1878
|
}
|
|
1869
|
-
function analyzeTypeAliasToIR(typeAlias, checker, file = "", extensionRegistry, metadataPolicy) {
|
|
1870
|
-
|
|
1879
|
+
function analyzeTypeAliasToIR(typeAlias, checker, file = "", extensionRegistry, metadataPolicy, discriminatorOptions) {
|
|
1880
|
+
const members = getObjectLikeTypeAliasMembers(typeAlias.type);
|
|
1881
|
+
if (members === null) {
|
|
1871
1882
|
const sourceFile = typeAlias.getSourceFile();
|
|
1872
1883
|
const { line } = sourceFile.getLineAndCharacterOfPosition(typeAlias.getStart());
|
|
1873
1884
|
const kindDesc = ts3.SyntaxKind[typeAlias.type.kind] ?? "unknown";
|
|
1874
1885
|
return {
|
|
1875
1886
|
ok: false,
|
|
1876
|
-
error: `Type alias "${typeAlias.name.text}" at line ${String(line + 1)} is not an object type
|
|
1887
|
+
error: `Type alias "${typeAlias.name.text}" at line ${String(line + 1)} is not an object-like type alias (found ${kindDesc})`
|
|
1877
1888
|
};
|
|
1878
1889
|
}
|
|
1879
|
-
const
|
|
1880
|
-
|
|
1890
|
+
const normalizedMetadataPolicy = createAnalyzerMetadataPolicy(
|
|
1891
|
+
metadataPolicy,
|
|
1892
|
+
discriminatorOptions
|
|
1893
|
+
);
|
|
1881
1894
|
const name = typeAlias.name.text;
|
|
1895
|
+
const duplicatePropertyNames = findDuplicateObjectLikeTypeAliasPropertyNames(members);
|
|
1896
|
+
if (duplicatePropertyNames.length > 0) {
|
|
1897
|
+
const sourceFile = typeAlias.getSourceFile();
|
|
1898
|
+
const { line } = sourceFile.getLineAndCharacterOfPosition(typeAlias.getStart());
|
|
1899
|
+
return {
|
|
1900
|
+
ok: false,
|
|
1901
|
+
error: `Type alias "${name}" at line ${String(line + 1)} contains duplicate property names across object-like members: ${duplicatePropertyNames.join(", ")}`
|
|
1902
|
+
};
|
|
1903
|
+
}
|
|
1882
1904
|
const fields = [];
|
|
1883
1905
|
const typeRegistry = {};
|
|
1884
1906
|
const diagnostics = [];
|
|
@@ -1891,7 +1913,7 @@ function analyzeTypeAliasToIR(typeAlias, checker, file = "", extensionRegistry,
|
|
|
1891
1913
|
const annotations = [...typeAliasDoc.annotations];
|
|
1892
1914
|
diagnostics.push(...typeAliasDoc.diagnostics);
|
|
1893
1915
|
const visiting = /* @__PURE__ */ new Set();
|
|
1894
|
-
for (const member of
|
|
1916
|
+
for (const member of members) {
|
|
1895
1917
|
if (ts3.isPropertySignature(member)) {
|
|
1896
1918
|
const fieldNode = analyzeInterfacePropertyToIR(
|
|
1897
1919
|
member,
|
|
@@ -2000,15 +2022,43 @@ function isNullishSemanticType(type) {
|
|
|
2000
2022
|
}
|
|
2001
2023
|
return type.isUnion() && type.types.some((member) => isNullishSemanticType(member));
|
|
2002
2024
|
}
|
|
2003
|
-
function isStringLikeSemanticType(type) {
|
|
2025
|
+
function isStringLikeSemanticType(type, checker, seen = /* @__PURE__ */ new Set()) {
|
|
2026
|
+
if (seen.has(type)) {
|
|
2027
|
+
return false;
|
|
2028
|
+
}
|
|
2029
|
+
seen.add(type);
|
|
2004
2030
|
if (type.flags & ts3.TypeFlags.StringLike) {
|
|
2005
2031
|
return true;
|
|
2006
2032
|
}
|
|
2007
2033
|
if (type.isUnion()) {
|
|
2008
|
-
return type.types.length > 0 && type.types.every((member) => isStringLikeSemanticType(member));
|
|
2034
|
+
return type.types.length > 0 && type.types.every((member) => isStringLikeSemanticType(member, checker, seen));
|
|
2035
|
+
}
|
|
2036
|
+
const baseConstraint = checker.getBaseConstraintOfType(type);
|
|
2037
|
+
if (baseConstraint !== void 0 && baseConstraint !== type) {
|
|
2038
|
+
return isStringLikeSemanticType(baseConstraint, checker, seen);
|
|
2009
2039
|
}
|
|
2010
2040
|
return false;
|
|
2011
2041
|
}
|
|
2042
|
+
function getObjectLikeTypeAliasMembers(typeNode) {
|
|
2043
|
+
if (ts3.isParenthesizedTypeNode(typeNode)) {
|
|
2044
|
+
return getObjectLikeTypeAliasMembers(typeNode.type);
|
|
2045
|
+
}
|
|
2046
|
+
if (ts3.isTypeLiteralNode(typeNode)) {
|
|
2047
|
+
return [...typeNode.members];
|
|
2048
|
+
}
|
|
2049
|
+
if (ts3.isIntersectionTypeNode(typeNode)) {
|
|
2050
|
+
const members = [];
|
|
2051
|
+
for (const intersectionMember of typeNode.types) {
|
|
2052
|
+
const resolvedMembers = getObjectLikeTypeAliasMembers(intersectionMember);
|
|
2053
|
+
if (resolvedMembers === null) {
|
|
2054
|
+
return null;
|
|
2055
|
+
}
|
|
2056
|
+
members.push(...resolvedMembers);
|
|
2057
|
+
}
|
|
2058
|
+
return members;
|
|
2059
|
+
}
|
|
2060
|
+
return null;
|
|
2061
|
+
}
|
|
2012
2062
|
function extractDiscriminatorDirective(node, file, diagnostics) {
|
|
2013
2063
|
const discriminatorTags = getLeadingParsedTags(node).filter(
|
|
2014
2064
|
(tag) => tag.normalizedTagName === "discriminator"
|
|
@@ -2115,7 +2165,7 @@ function validateDiscriminatorDirective(node, checker, file, diagnostics) {
|
|
|
2115
2165
|
);
|
|
2116
2166
|
return null;
|
|
2117
2167
|
}
|
|
2118
|
-
if (!isStringLikeSemanticType(property.type)) {
|
|
2168
|
+
if (!isStringLikeSemanticType(property.type, checker)) {
|
|
2119
2169
|
diagnostics.push(
|
|
2120
2170
|
makeAnalysisDiagnostic(
|
|
2121
2171
|
"TYPE_MISMATCH",
|
|
@@ -2142,8 +2192,8 @@ function getConcreteTypeArgumentForDiscriminator(node, subjectType, checker, typ
|
|
|
2142
2192
|
const localTypeParameter = node.typeParameters?.[typeParameterIndex];
|
|
2143
2193
|
return localTypeParameter === void 0 ? null : checker.getTypeAtLocation(localTypeParameter);
|
|
2144
2194
|
}
|
|
2145
|
-
function resolveLiteralDiscriminatorPropertyValue(boundType,
|
|
2146
|
-
const propertySymbol = boundType.getProperty(
|
|
2195
|
+
function resolveLiteralDiscriminatorPropertyValue(boundType, propertyName, checker, provenance, diagnostics) {
|
|
2196
|
+
const propertySymbol = boundType.getProperty(propertyName);
|
|
2147
2197
|
if (propertySymbol === void 0) {
|
|
2148
2198
|
return void 0;
|
|
2149
2199
|
}
|
|
@@ -2174,6 +2224,9 @@ function resolveLiteralDiscriminatorPropertyValue(boundType, fieldName, checker,
|
|
|
2174
2224
|
}
|
|
2175
2225
|
return void 0;
|
|
2176
2226
|
}
|
|
2227
|
+
function getDiscriminatorIdentityPropertyNames(fieldName) {
|
|
2228
|
+
return fieldName === "object" ? ["object"] : [fieldName, "object"];
|
|
2229
|
+
}
|
|
2177
2230
|
function resolveDiscriminatorApiName(boundType, checker, metadataPolicy) {
|
|
2178
2231
|
const declaration = resolveNamedDiscriminatorDeclaration(boundType, checker);
|
|
2179
2232
|
if (declaration === null) {
|
|
@@ -2194,6 +2247,10 @@ function resolveDiscriminatorApiName(boundType, checker, metadataPolicy) {
|
|
|
2194
2247
|
);
|
|
2195
2248
|
return metadata?.apiName;
|
|
2196
2249
|
}
|
|
2250
|
+
function applyDiscriminatorApiNamePrefix(value, discriminatorOptions) {
|
|
2251
|
+
const prefix = discriminatorOptions?.apiNamePrefix;
|
|
2252
|
+
return prefix === void 0 || prefix === "" ? value : `${prefix}${value}`;
|
|
2253
|
+
}
|
|
2197
2254
|
function resolveNamedDiscriminatorDeclaration(type, checker, seen = /* @__PURE__ */ new Set()) {
|
|
2198
2255
|
if (seen.has(type)) {
|
|
2199
2256
|
return null;
|
|
@@ -2248,22 +2305,27 @@ function resolveDiscriminatorValue(boundType, fieldName, checker, provenance, di
|
|
|
2248
2305
|
return null;
|
|
2249
2306
|
}
|
|
2250
2307
|
}
|
|
2251
|
-
const
|
|
2252
|
-
|
|
2253
|
-
|
|
2254
|
-
|
|
2255
|
-
|
|
2256
|
-
|
|
2257
|
-
|
|
2258
|
-
|
|
2259
|
-
|
|
2308
|
+
for (const identityPropertyName of getDiscriminatorIdentityPropertyNames(fieldName)) {
|
|
2309
|
+
const literalIdentityValue = resolveLiteralDiscriminatorPropertyValue(
|
|
2310
|
+
boundType,
|
|
2311
|
+
identityPropertyName,
|
|
2312
|
+
checker,
|
|
2313
|
+
provenance,
|
|
2314
|
+
diagnostics
|
|
2315
|
+
);
|
|
2316
|
+
if (literalIdentityValue === null) {
|
|
2317
|
+
return null;
|
|
2318
|
+
}
|
|
2319
|
+
if (literalIdentityValue !== void 0) {
|
|
2320
|
+
return literalIdentityValue;
|
|
2321
|
+
}
|
|
2260
2322
|
}
|
|
2261
2323
|
const apiName = resolveDiscriminatorApiName(boundType, checker, metadataPolicy);
|
|
2262
2324
|
if (apiName?.source === "explicit") {
|
|
2263
|
-
return apiName.value;
|
|
2325
|
+
return applyDiscriminatorApiNamePrefix(apiName.value, metadataPolicy.discriminator);
|
|
2264
2326
|
}
|
|
2265
2327
|
if (apiName?.source === "inferred") {
|
|
2266
|
-
return apiName.value;
|
|
2328
|
+
return applyDiscriminatorApiNamePrefix(apiName.value, metadataPolicy.discriminator);
|
|
2267
2329
|
}
|
|
2268
2330
|
diagnostics.push(
|
|
2269
2331
|
makeAnalysisDiagnostic(
|
|
@@ -2326,15 +2388,20 @@ function buildInstantiatedReferenceName(baseName, typeArguments, checker) {
|
|
|
2326
2388
|
return renderedArguments.length === 0 ? baseName : `${baseName}__${renderedArguments.join("__")}`;
|
|
2327
2389
|
}
|
|
2328
2390
|
function extractReferenceTypeArguments(type, checker, file, typeRegistry, visiting, sourceNode, metadataPolicy, extensionRegistry, diagnostics) {
|
|
2329
|
-
const
|
|
2330
|
-
if (
|
|
2391
|
+
const sourceTypeNode = sourceNode === void 0 ? void 0 : extractTypeNodeFromSource(sourceNode);
|
|
2392
|
+
if (sourceTypeNode === void 0) {
|
|
2331
2393
|
return [];
|
|
2332
2394
|
}
|
|
2333
|
-
const
|
|
2334
|
-
|
|
2395
|
+
const unwrapParentheses = (typeNode) => ts3.isParenthesizedTypeNode(typeNode) ? unwrapParentheses(typeNode.type) : typeNode;
|
|
2396
|
+
const directTypeNode = unwrapParentheses(sourceTypeNode);
|
|
2397
|
+
const referenceTypeNode = ts3.isTypeReferenceNode(directTypeNode) ? directTypeNode : (() => {
|
|
2398
|
+
const resolvedTypeNode = resolveAliasedTypeNode(directTypeNode, checker);
|
|
2399
|
+
return ts3.isTypeReferenceNode(resolvedTypeNode) ? resolvedTypeNode : null;
|
|
2400
|
+
})();
|
|
2401
|
+
if (referenceTypeNode?.typeArguments === void 0) {
|
|
2335
2402
|
return [];
|
|
2336
2403
|
}
|
|
2337
|
-
return
|
|
2404
|
+
return referenceTypeNode.typeArguments.map((argumentNode) => {
|
|
2338
2405
|
const argumentType = checker.getTypeFromTypeNode(argumentNode);
|
|
2339
2406
|
return {
|
|
2340
2407
|
tsType: argumentType,
|
|
@@ -2448,10 +2515,10 @@ function analyzeFieldToIR(prop, checker, file, typeRegistry, visiting, diagnosti
|
|
|
2448
2515
|
};
|
|
2449
2516
|
}
|
|
2450
2517
|
function analyzeInterfacePropertyToIR(prop, checker, file, typeRegistry, visiting, diagnostics, hostType, metadataPolicy, extensionRegistry) {
|
|
2451
|
-
|
|
2518
|
+
const name = getAnalyzableObjectLikePropertyName(prop.name);
|
|
2519
|
+
if (name === null) {
|
|
2452
2520
|
return null;
|
|
2453
2521
|
}
|
|
2454
|
-
const name = prop.name.text;
|
|
2455
2522
|
const tsType = checker.getTypeAtLocation(prop);
|
|
2456
2523
|
const optional = prop.questionToken !== void 0;
|
|
2457
2524
|
const provenance = provenanceForNode(prop, file);
|
|
@@ -2507,6 +2574,31 @@ function analyzeInterfacePropertyToIR(prop, checker, file, typeRegistry, visitin
|
|
|
2507
2574
|
provenance
|
|
2508
2575
|
};
|
|
2509
2576
|
}
|
|
2577
|
+
function findDuplicateObjectLikeTypeAliasPropertyNames(members) {
|
|
2578
|
+
const seen = /* @__PURE__ */ new Set();
|
|
2579
|
+
const duplicates = /* @__PURE__ */ new Set();
|
|
2580
|
+
for (const member of members) {
|
|
2581
|
+
if (!ts3.isPropertySignature(member)) {
|
|
2582
|
+
continue;
|
|
2583
|
+
}
|
|
2584
|
+
const name = getAnalyzableObjectLikePropertyName(member.name);
|
|
2585
|
+
if (name === null) {
|
|
2586
|
+
continue;
|
|
2587
|
+
}
|
|
2588
|
+
if (seen.has(name)) {
|
|
2589
|
+
duplicates.add(name);
|
|
2590
|
+
continue;
|
|
2591
|
+
}
|
|
2592
|
+
seen.add(name);
|
|
2593
|
+
}
|
|
2594
|
+
return [...duplicates].sort();
|
|
2595
|
+
}
|
|
2596
|
+
function getAnalyzableObjectLikePropertyName(name) {
|
|
2597
|
+
if (!ts3.isIdentifier(name)) {
|
|
2598
|
+
return null;
|
|
2599
|
+
}
|
|
2600
|
+
return name.text;
|
|
2601
|
+
}
|
|
2510
2602
|
function applyEnumMemberDisplayNames(type, annotations) {
|
|
2511
2603
|
if (!annotations.some(
|
|
2512
2604
|
(annotation) => annotation.annotationKind === "displayName" && annotation.value.trim().startsWith(":")
|
|
@@ -2699,6 +2791,23 @@ function resolveTypeNode(type, checker, file, typeRegistry, visiting, sourceNode
|
|
|
2699
2791
|
diagnostics
|
|
2700
2792
|
);
|
|
2701
2793
|
}
|
|
2794
|
+
if (isIntersectionType(type)) {
|
|
2795
|
+
const sourceTypeNode = sourceNode === void 0 ? void 0 : extractTypeNodeFromSource(sourceNode);
|
|
2796
|
+
const resolvedSourceTypeNode = sourceTypeNode === void 0 ? void 0 : resolveAliasedTypeNode(sourceTypeNode, checker);
|
|
2797
|
+
if (resolvedSourceTypeNode !== void 0 && getObjectLikeTypeAliasMembers(resolvedSourceTypeNode) !== null) {
|
|
2798
|
+
return resolveObjectType(
|
|
2799
|
+
type,
|
|
2800
|
+
checker,
|
|
2801
|
+
file,
|
|
2802
|
+
typeRegistry,
|
|
2803
|
+
visiting,
|
|
2804
|
+
sourceNode,
|
|
2805
|
+
metadataPolicy,
|
|
2806
|
+
extensionRegistry,
|
|
2807
|
+
diagnostics
|
|
2808
|
+
);
|
|
2809
|
+
}
|
|
2810
|
+
}
|
|
2702
2811
|
if (isObjectType(type)) {
|
|
2703
2812
|
return resolveObjectType(
|
|
2704
2813
|
type,
|
|
@@ -2785,9 +2894,10 @@ function shouldEmitPrimitiveAliasDefinition(typeNode, checker) {
|
|
|
2785
2894
|
const resolved = checker.getTypeFromTypeNode(aliasDecl.type);
|
|
2786
2895
|
return !!(resolved.flags & (ts3.TypeFlags.String | ts3.TypeFlags.Number | ts3.TypeFlags.BigInt | ts3.TypeFlags.BigIntLiteral | ts3.TypeFlags.Boolean | ts3.TypeFlags.Null));
|
|
2787
2896
|
}
|
|
2788
|
-
function resolveAliasedPrimitiveTarget(type, checker, file, typeRegistry, visiting, metadataPolicy = createAnalyzerMetadataPolicy(void 0), extensionRegistry, diagnostics) {
|
|
2897
|
+
function resolveAliasedPrimitiveTarget(type, checker, file, typeRegistry, visiting, metadataPolicy = createAnalyzerMetadataPolicy(void 0), extensionRegistry, diagnostics, visitedAliases = /* @__PURE__ */ new Set()) {
|
|
2789
2898
|
const nestedAliasDecl = type.aliasSymbol?.declarations?.find(ts3.isTypeAliasDeclaration);
|
|
2790
|
-
if (nestedAliasDecl !== void 0) {
|
|
2899
|
+
if (nestedAliasDecl !== void 0 && !visitedAliases.has(nestedAliasDecl)) {
|
|
2900
|
+
visitedAliases.add(nestedAliasDecl);
|
|
2791
2901
|
return resolveAliasedPrimitiveTarget(
|
|
2792
2902
|
checker.getTypeFromTypeNode(nestedAliasDecl.type),
|
|
2793
2903
|
checker,
|
|
@@ -2796,9 +2906,25 @@ function resolveAliasedPrimitiveTarget(type, checker, file, typeRegistry, visiti
|
|
|
2796
2906
|
visiting,
|
|
2797
2907
|
metadataPolicy,
|
|
2798
2908
|
extensionRegistry,
|
|
2799
|
-
diagnostics
|
|
2909
|
+
diagnostics,
|
|
2910
|
+
visitedAliases
|
|
2800
2911
|
);
|
|
2801
2912
|
}
|
|
2913
|
+
if (type.flags & ts3.TypeFlags.String) {
|
|
2914
|
+
return { kind: "primitive", primitiveKind: "string" };
|
|
2915
|
+
}
|
|
2916
|
+
if (type.flags & ts3.TypeFlags.Number) {
|
|
2917
|
+
return { kind: "primitive", primitiveKind: "number" };
|
|
2918
|
+
}
|
|
2919
|
+
if (type.flags & (ts3.TypeFlags.BigInt | ts3.TypeFlags.BigIntLiteral)) {
|
|
2920
|
+
return { kind: "primitive", primitiveKind: "bigint" };
|
|
2921
|
+
}
|
|
2922
|
+
if (type.flags & ts3.TypeFlags.Boolean) {
|
|
2923
|
+
return { kind: "primitive", primitiveKind: "boolean" };
|
|
2924
|
+
}
|
|
2925
|
+
if (type.flags & ts3.TypeFlags.Null) {
|
|
2926
|
+
return { kind: "primitive", primitiveKind: "null" };
|
|
2927
|
+
}
|
|
2802
2928
|
return resolveTypeNode(
|
|
2803
2929
|
type,
|
|
2804
2930
|
checker,
|
|
@@ -3078,7 +3204,7 @@ function resolveObjectType(type, checker, file, typeRegistry, visiting, sourceNo
|
|
|
3078
3204
|
};
|
|
3079
3205
|
}
|
|
3080
3206
|
}
|
|
3081
|
-
const recordNode = tryResolveRecordType(
|
|
3207
|
+
const recordNode = isObjectType(type) ? tryResolveRecordType(
|
|
3082
3208
|
type,
|
|
3083
3209
|
checker,
|
|
3084
3210
|
file,
|
|
@@ -3087,7 +3213,7 @@ function resolveObjectType(type, checker, file, typeRegistry, visiting, sourceNo
|
|
|
3087
3213
|
metadataPolicy,
|
|
3088
3214
|
extensionRegistry,
|
|
3089
3215
|
collectedDiagnostics
|
|
3090
|
-
);
|
|
3216
|
+
) : null;
|
|
3091
3217
|
if (recordNode) {
|
|
3092
3218
|
visiting.delete(type);
|
|
3093
3219
|
if (registryTypeName !== void 0 && shouldRegisterNamedType) {
|
|
@@ -3284,9 +3410,10 @@ function getNamedTypeFieldNodeInfoMap(type, checker, file, typeRegistry, visitin
|
|
|
3284
3410
|
);
|
|
3285
3411
|
}
|
|
3286
3412
|
const typeAliasDecl = declarations.find(ts3.isTypeAliasDeclaration);
|
|
3287
|
-
|
|
3413
|
+
const typeAliasMembers = typeAliasDecl === void 0 ? null : getObjectLikeTypeAliasMembers(typeAliasDecl.type);
|
|
3414
|
+
if (typeAliasDecl && typeAliasMembers !== null) {
|
|
3288
3415
|
return buildFieldNodeInfoMap(
|
|
3289
|
-
|
|
3416
|
+
typeAliasMembers,
|
|
3290
3417
|
checker,
|
|
3291
3418
|
file,
|
|
3292
3419
|
typeRegistry,
|
|
@@ -3577,7 +3704,7 @@ function findInterfaceByName(sourceFile, interfaceName) {
|
|
|
3577
3704
|
function findTypeAliasByName(sourceFile, aliasName) {
|
|
3578
3705
|
return findNodeByName(sourceFile, aliasName, ts4.isTypeAliasDeclaration, (n) => n.name.text);
|
|
3579
3706
|
}
|
|
3580
|
-
function analyzeNamedTypeToIRFromProgramContext(ctx, filePath, typeName, extensionRegistry, metadataPolicy) {
|
|
3707
|
+
function analyzeNamedTypeToIRFromProgramContext(ctx, filePath, typeName, extensionRegistry, metadataPolicy, discriminatorOptions) {
|
|
3581
3708
|
const analysisFilePath = path.resolve(filePath);
|
|
3582
3709
|
const classDecl = findClassByName(ctx.sourceFile, typeName);
|
|
3583
3710
|
if (classDecl !== null) {
|
|
@@ -3586,7 +3713,8 @@ function analyzeNamedTypeToIRFromProgramContext(ctx, filePath, typeName, extensi
|
|
|
3586
3713
|
ctx.checker,
|
|
3587
3714
|
analysisFilePath,
|
|
3588
3715
|
extensionRegistry,
|
|
3589
|
-
metadataPolicy
|
|
3716
|
+
metadataPolicy,
|
|
3717
|
+
discriminatorOptions
|
|
3590
3718
|
);
|
|
3591
3719
|
}
|
|
3592
3720
|
const interfaceDecl = findInterfaceByName(ctx.sourceFile, typeName);
|
|
@@ -3596,7 +3724,8 @@ function analyzeNamedTypeToIRFromProgramContext(ctx, filePath, typeName, extensi
|
|
|
3596
3724
|
ctx.checker,
|
|
3597
3725
|
analysisFilePath,
|
|
3598
3726
|
extensionRegistry,
|
|
3599
|
-
metadataPolicy
|
|
3727
|
+
metadataPolicy,
|
|
3728
|
+
discriminatorOptions
|
|
3600
3729
|
);
|
|
3601
3730
|
}
|
|
3602
3731
|
const typeAlias = findTypeAliasByName(ctx.sourceFile, typeName);
|
|
@@ -3606,7 +3735,8 @@ function analyzeNamedTypeToIRFromProgramContext(ctx, filePath, typeName, extensi
|
|
|
3606
3735
|
ctx.checker,
|
|
3607
3736
|
analysisFilePath,
|
|
3608
3737
|
extensionRegistry,
|
|
3609
|
-
metadataPolicy
|
|
3738
|
+
metadataPolicy,
|
|
3739
|
+
discriminatorOptions
|
|
3610
3740
|
);
|
|
3611
3741
|
if (result.ok) {
|
|
3612
3742
|
return result.analysis;
|