@doccov/sdk 0.5.8 → 0.5.9
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/index.js +199 -0
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1989,6 +1989,199 @@ var BUILTIN_TYPE_SCHEMAS = {
|
|
|
1989
1989
|
BigInt64Array: { type: "string", format: "byte" },
|
|
1990
1990
|
BigUint64Array: { type: "string", format: "byte" }
|
|
1991
1991
|
};
|
|
1992
|
+
var TYPEBOX_PRIMITIVE_MAP = {
|
|
1993
|
+
TString: { type: "string" },
|
|
1994
|
+
TNumber: { type: "number" },
|
|
1995
|
+
TBoolean: { type: "boolean" },
|
|
1996
|
+
TInteger: { type: "integer" },
|
|
1997
|
+
TNull: { type: "null" },
|
|
1998
|
+
TAny: {},
|
|
1999
|
+
TUnknown: {},
|
|
2000
|
+
TNever: { not: {} },
|
|
2001
|
+
TVoid: { type: "null" },
|
|
2002
|
+
TUndefined: { type: "null" }
|
|
2003
|
+
};
|
|
2004
|
+
function isTypeBoxSchemaType(symbolName) {
|
|
2005
|
+
return /^T[A-Z][a-zA-Z]*$/.test(symbolName);
|
|
2006
|
+
}
|
|
2007
|
+
function formatTypeBoxSchema(type, typeChecker, typeRefs, referencedTypes, visited) {
|
|
2008
|
+
const symbol = type.getSymbol();
|
|
2009
|
+
if (!symbol)
|
|
2010
|
+
return null;
|
|
2011
|
+
const symbolName = symbol.getName();
|
|
2012
|
+
if (TYPEBOX_PRIMITIVE_MAP[symbolName]) {
|
|
2013
|
+
return { ...TYPEBOX_PRIMITIVE_MAP[symbolName] };
|
|
2014
|
+
}
|
|
2015
|
+
const objectType = type;
|
|
2016
|
+
if (!(objectType.objectFlags & ts2.ObjectFlags.Reference)) {
|
|
2017
|
+
return null;
|
|
2018
|
+
}
|
|
2019
|
+
const typeRef = type;
|
|
2020
|
+
const typeArgs = typeRef.typeArguments;
|
|
2021
|
+
switch (symbolName) {
|
|
2022
|
+
case "TObject": {
|
|
2023
|
+
if (!typeArgs || typeArgs.length === 0) {
|
|
2024
|
+
return { type: "object" };
|
|
2025
|
+
}
|
|
2026
|
+
const propsType = typeArgs[0];
|
|
2027
|
+
const properties = {};
|
|
2028
|
+
const required = [];
|
|
2029
|
+
for (const prop of propsType.getProperties()) {
|
|
2030
|
+
const propName = prop.getName();
|
|
2031
|
+
const propType = getPropertyType(prop, propsType, typeChecker);
|
|
2032
|
+
const propSymbol = propType.getSymbol();
|
|
2033
|
+
const propSymbolName = propSymbol?.getName();
|
|
2034
|
+
if (propSymbolName && typeRefs.has(propSymbolName)) {
|
|
2035
|
+
properties[propName] = { $ref: `#/types/${propSymbolName}` };
|
|
2036
|
+
} else if (propSymbolName && isTypeBoxSchemaType(propSymbolName)) {
|
|
2037
|
+
const nested = formatTypeBoxSchema(propType, typeChecker, typeRefs, referencedTypes, visited);
|
|
2038
|
+
properties[propName] = nested ?? { type: "object" };
|
|
2039
|
+
} else {
|
|
2040
|
+
properties[propName] = formatTypeReference(propType, typeChecker, typeRefs, referencedTypes, visited);
|
|
2041
|
+
}
|
|
2042
|
+
if (propSymbolName !== "TOptional") {
|
|
2043
|
+
required.push(propName);
|
|
2044
|
+
}
|
|
2045
|
+
}
|
|
2046
|
+
const schema = { type: "object", properties };
|
|
2047
|
+
if (required.length > 0) {
|
|
2048
|
+
schema.required = required;
|
|
2049
|
+
}
|
|
2050
|
+
return schema;
|
|
2051
|
+
}
|
|
2052
|
+
case "TArray": {
|
|
2053
|
+
if (!typeArgs || typeArgs.length === 0) {
|
|
2054
|
+
return { type: "array" };
|
|
2055
|
+
}
|
|
2056
|
+
const itemType = typeArgs[0];
|
|
2057
|
+
const itemSymbol = itemType.getSymbol();
|
|
2058
|
+
const itemSymbolName = itemSymbol?.getName();
|
|
2059
|
+
let items;
|
|
2060
|
+
if (itemSymbolName && typeRefs.has(itemSymbolName)) {
|
|
2061
|
+
items = { $ref: `#/types/${itemSymbolName}` };
|
|
2062
|
+
} else if (itemSymbolName && isTypeBoxSchemaType(itemSymbolName)) {
|
|
2063
|
+
items = formatTypeBoxSchema(itemType, typeChecker, typeRefs, referencedTypes, visited) ?? { type: "object" };
|
|
2064
|
+
} else {
|
|
2065
|
+
items = formatTypeReference(itemType, typeChecker, typeRefs, referencedTypes, visited);
|
|
2066
|
+
}
|
|
2067
|
+
return { type: "array", items };
|
|
2068
|
+
}
|
|
2069
|
+
case "TUnion": {
|
|
2070
|
+
if (!typeArgs || typeArgs.length === 0) {
|
|
2071
|
+
return { anyOf: [] };
|
|
2072
|
+
}
|
|
2073
|
+
const tupleType = typeArgs[0];
|
|
2074
|
+
const members = [];
|
|
2075
|
+
if (tupleType.isUnion()) {
|
|
2076
|
+
for (const memberType of tupleType.types) {
|
|
2077
|
+
const memberSymbol = memberType.getSymbol();
|
|
2078
|
+
const memberSymbolName = memberSymbol?.getName();
|
|
2079
|
+
if (memberSymbolName && typeRefs.has(memberSymbolName)) {
|
|
2080
|
+
members.push({ $ref: `#/types/${memberSymbolName}` });
|
|
2081
|
+
} else if (memberSymbolName && isTypeBoxSchemaType(memberSymbolName)) {
|
|
2082
|
+
members.push(formatTypeBoxSchema(memberType, typeChecker, typeRefs, referencedTypes, visited) ?? { type: "object" });
|
|
2083
|
+
} else {
|
|
2084
|
+
members.push(formatTypeReference(memberType, typeChecker, typeRefs, referencedTypes, visited));
|
|
2085
|
+
}
|
|
2086
|
+
}
|
|
2087
|
+
} else if (tupleType.typeArguments) {
|
|
2088
|
+
for (const memberType of tupleType.typeArguments) {
|
|
2089
|
+
const memberSymbol = memberType.getSymbol();
|
|
2090
|
+
const memberSymbolName = memberSymbol?.getName();
|
|
2091
|
+
if (memberSymbolName && typeRefs.has(memberSymbolName)) {
|
|
2092
|
+
members.push({ $ref: `#/types/${memberSymbolName}` });
|
|
2093
|
+
} else if (memberSymbolName && isTypeBoxSchemaType(memberSymbolName)) {
|
|
2094
|
+
members.push(formatTypeBoxSchema(memberType, typeChecker, typeRefs, referencedTypes, visited) ?? { type: "object" });
|
|
2095
|
+
} else {
|
|
2096
|
+
members.push(formatTypeReference(memberType, typeChecker, typeRefs, referencedTypes, visited));
|
|
2097
|
+
}
|
|
2098
|
+
}
|
|
2099
|
+
}
|
|
2100
|
+
return { anyOf: members };
|
|
2101
|
+
}
|
|
2102
|
+
case "TIntersect": {
|
|
2103
|
+
if (!typeArgs || typeArgs.length === 0) {
|
|
2104
|
+
return { allOf: [] };
|
|
2105
|
+
}
|
|
2106
|
+
const tupleType = typeArgs[0];
|
|
2107
|
+
const members = [];
|
|
2108
|
+
if (tupleType.typeArguments) {
|
|
2109
|
+
for (const memberType of tupleType.typeArguments) {
|
|
2110
|
+
const memberSymbol = memberType.getSymbol();
|
|
2111
|
+
const memberSymbolName = memberSymbol?.getName();
|
|
2112
|
+
if (memberSymbolName && typeRefs.has(memberSymbolName)) {
|
|
2113
|
+
members.push({ $ref: `#/types/${memberSymbolName}` });
|
|
2114
|
+
} else if (memberSymbolName && isTypeBoxSchemaType(memberSymbolName)) {
|
|
2115
|
+
members.push(formatTypeBoxSchema(memberType, typeChecker, typeRefs, referencedTypes, visited) ?? { type: "object" });
|
|
2116
|
+
} else {
|
|
2117
|
+
members.push(formatTypeReference(memberType, typeChecker, typeRefs, referencedTypes, visited));
|
|
2118
|
+
}
|
|
2119
|
+
}
|
|
2120
|
+
}
|
|
2121
|
+
return { allOf: members };
|
|
2122
|
+
}
|
|
2123
|
+
case "TOptional": {
|
|
2124
|
+
if (!typeArgs || typeArgs.length === 0) {
|
|
2125
|
+
return {};
|
|
2126
|
+
}
|
|
2127
|
+
const innerType = typeArgs[0];
|
|
2128
|
+
const innerSymbol = innerType.getSymbol();
|
|
2129
|
+
const innerSymbolName = innerSymbol?.getName();
|
|
2130
|
+
if (innerSymbolName && typeRefs.has(innerSymbolName)) {
|
|
2131
|
+
return { $ref: `#/types/${innerSymbolName}` };
|
|
2132
|
+
} else if (innerSymbolName && isTypeBoxSchemaType(innerSymbolName)) {
|
|
2133
|
+
return formatTypeBoxSchema(innerType, typeChecker, typeRefs, referencedTypes, visited) ?? { type: "object" };
|
|
2134
|
+
}
|
|
2135
|
+
return formatTypeReference(innerType, typeChecker, typeRefs, referencedTypes, visited);
|
|
2136
|
+
}
|
|
2137
|
+
case "TLiteral": {
|
|
2138
|
+
if (!typeArgs || typeArgs.length === 0) {
|
|
2139
|
+
return { enum: [] };
|
|
2140
|
+
}
|
|
2141
|
+
const literalType = typeArgs[0];
|
|
2142
|
+
if (literalType.isLiteral()) {
|
|
2143
|
+
const value = literalType.value;
|
|
2144
|
+
return { enum: [value] };
|
|
2145
|
+
}
|
|
2146
|
+
const literalStr = typeChecker.typeToString(literalType);
|
|
2147
|
+
if (literalStr.startsWith('"') && literalStr.endsWith('"')) {
|
|
2148
|
+
return { enum: [literalStr.slice(1, -1)] };
|
|
2149
|
+
}
|
|
2150
|
+
return { enum: [literalStr] };
|
|
2151
|
+
}
|
|
2152
|
+
case "TRecord": {
|
|
2153
|
+
if (!typeArgs || typeArgs.length < 2) {
|
|
2154
|
+
return { type: "object", additionalProperties: true };
|
|
2155
|
+
}
|
|
2156
|
+
const valueType = typeArgs[1];
|
|
2157
|
+
const valueSymbol = valueType.getSymbol();
|
|
2158
|
+
const valueSymbolName = valueSymbol?.getName();
|
|
2159
|
+
let additionalProperties;
|
|
2160
|
+
if (valueSymbolName && typeRefs.has(valueSymbolName)) {
|
|
2161
|
+
additionalProperties = { $ref: `#/types/${valueSymbolName}` };
|
|
2162
|
+
} else if (valueSymbolName && isTypeBoxSchemaType(valueSymbolName)) {
|
|
2163
|
+
additionalProperties = formatTypeBoxSchema(valueType, typeChecker, typeRefs, referencedTypes, visited) ?? true;
|
|
2164
|
+
} else {
|
|
2165
|
+
additionalProperties = formatTypeReference(valueType, typeChecker, typeRefs, referencedTypes, visited);
|
|
2166
|
+
}
|
|
2167
|
+
return { type: "object", additionalProperties };
|
|
2168
|
+
}
|
|
2169
|
+
case "TRef": {
|
|
2170
|
+
if (!typeArgs || typeArgs.length === 0) {
|
|
2171
|
+
return { $ref: "#/types/unknown" };
|
|
2172
|
+
}
|
|
2173
|
+
const refType = typeArgs[0];
|
|
2174
|
+
const refSymbol = refType.getSymbol();
|
|
2175
|
+
const refSymbolName = refSymbol?.getName();
|
|
2176
|
+
if (refSymbolName) {
|
|
2177
|
+
return { $ref: `#/types/${refSymbolName}` };
|
|
2178
|
+
}
|
|
2179
|
+
return { type: "object" };
|
|
2180
|
+
}
|
|
2181
|
+
default:
|
|
2182
|
+
return null;
|
|
2183
|
+
}
|
|
2184
|
+
}
|
|
1992
2185
|
function isObjectLiteralType(type) {
|
|
1993
2186
|
if (!(type.getFlags() & ts2.TypeFlags.Object)) {
|
|
1994
2187
|
return false;
|
|
@@ -2404,6 +2597,12 @@ function formatTypeReference(type, typeChecker, typeRefs, referencedTypes, visit
|
|
|
2404
2597
|
if (builtInSchema) {
|
|
2405
2598
|
return { ...builtInSchema };
|
|
2406
2599
|
}
|
|
2600
|
+
if (isTypeBoxSchemaType(symbolName)) {
|
|
2601
|
+
const typeBoxSchema = formatTypeBoxSchema(type, typeChecker, typeRefs, referencedTypes, visited);
|
|
2602
|
+
if (typeBoxSchema) {
|
|
2603
|
+
return typeBoxSchema;
|
|
2604
|
+
}
|
|
2605
|
+
}
|
|
2407
2606
|
if (referencedTypes && !isBuiltInType(symbolName)) {
|
|
2408
2607
|
referencedTypes.add(symbolName);
|
|
2409
2608
|
return { $ref: `#/types/${symbolName}` };
|