@doccov/sdk 0.3.3 → 0.3.5

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.
Files changed (2) hide show
  1. package/dist/index.js +104 -6
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1618,6 +1618,20 @@ function withDescription(schema, description) {
1618
1618
  description
1619
1619
  };
1620
1620
  }
1621
+ function getPropertyType(prop, parentType, typeChecker) {
1622
+ if (prop.valueDeclaration) {
1623
+ return typeChecker.getTypeOfSymbolAtLocation(prop, prop.valueDeclaration);
1624
+ }
1625
+ const propType = typeChecker.getTypeOfPropertyOfType(parentType, prop.getName());
1626
+ if (propType) {
1627
+ return propType;
1628
+ }
1629
+ const decl = prop.declarations?.[0];
1630
+ if (decl) {
1631
+ return typeChecker.getTypeOfSymbolAtLocation(prop, decl);
1632
+ }
1633
+ return typeChecker.getAnyType();
1634
+ }
1621
1635
  function propertiesToSchema(properties, description) {
1622
1636
  const schema = {
1623
1637
  type: "object",
@@ -1958,7 +1972,7 @@ function formatTypeReference(type, typeChecker, typeRefs, referencedTypes, visit
1958
1972
  };
1959
1973
  const required = [];
1960
1974
  for (const prop of properties) {
1961
- const propType = typeChecker.getTypeOfSymbolAtLocation(prop, prop.valueDeclaration);
1975
+ const propType = getPropertyType(prop, type, typeChecker);
1962
1976
  const propName = prop.getName();
1963
1977
  objSchema.properties[propName] = formatTypeReference(propType, typeChecker, typeRefs, referencedTypes, visited);
1964
1978
  if (!(prop.flags & ts2.SymbolFlags.Optional)) {
@@ -2043,7 +2057,7 @@ function structureParameter(param, paramDecl, paramType, typeChecker, typeRefs,
2043
2057
  const isAnonymousObject = isObjectLiteralType(subType) || symbol2?.getName().startsWith("__");
2044
2058
  if (isAnonymousObject) {
2045
2059
  for (const prop of subType.getProperties()) {
2046
- const propType = typeChecker.getTypeOfSymbolAtLocation(prop, prop.valueDeclaration);
2060
+ const propType = getPropertyType(prop, subType, typeChecker);
2047
2061
  let description = "";
2048
2062
  if (functionDoc) {
2049
2063
  const propName = prop.getName();
@@ -2063,7 +2077,7 @@ function structureParameter(param, paramDecl, paramType, typeChecker, typeRefs,
2063
2077
  const _symbolName = symbol2.getName();
2064
2078
  if (!isBuiltInType(_symbolName)) {
2065
2079
  for (const prop of subType.getProperties()) {
2066
- const propType = typeChecker.getTypeOfSymbolAtLocation(prop, prop.valueDeclaration);
2080
+ const propType = getPropertyType(prop, subType, typeChecker);
2067
2081
  properties.push({
2068
2082
  name: prop.getName(),
2069
2083
  type: formatTypeReference(propType, typeChecker, typeRefs, referencedTypes),
@@ -2094,7 +2108,7 @@ function structureParameter(param, paramDecl, paramType, typeChecker, typeRefs,
2094
2108
  if (isObjectLiteralType(subType) || symbol2?.getName().startsWith("__")) {
2095
2109
  const properties = [];
2096
2110
  for (const prop of subType.getProperties()) {
2097
- const propType = typeChecker.getTypeOfSymbolAtLocation(prop, prop.valueDeclaration);
2111
+ const propType = getPropertyType(prop, subType, typeChecker);
2098
2112
  properties.push({
2099
2113
  name: prop.getName(),
2100
2114
  type: formatTypeReference(propType, typeChecker, typeRefs, referencedTypes),
@@ -2128,7 +2142,7 @@ function structureParameter(param, paramDecl, paramType, typeChecker, typeRefs,
2128
2142
  if ((symbol?.getName().startsWith("__") || isObjectLiteralType(paramType)) && paramType.getProperties().length > 0) {
2129
2143
  const properties = [];
2130
2144
  for (const prop of paramType.getProperties()) {
2131
- const propType = typeChecker.getTypeOfSymbolAtLocation(prop, prop.valueDeclaration);
2145
+ const propType = getPropertyType(prop, paramType, typeChecker);
2132
2146
  properties.push({
2133
2147
  name: prop.getName(),
2134
2148
  type: formatTypeReference(propType, typeChecker, typeRefs, referencedTypes),
@@ -2825,7 +2839,8 @@ function serializeCallSignatures(signatures, symbol, context, parsedDoc) {
2825
2839
  return signatures.map((signature) => {
2826
2840
  const parameters = signature.getParameters().map((param) => {
2827
2841
  const paramDecl = param.declarations?.find(ts2.isParameter);
2828
- const paramType = paramDecl ? paramDecl.type != null ? checker.getTypeFromTypeNode(paramDecl.type) : checker.getTypeAtLocation(paramDecl) : checker.getTypeOfSymbolAtLocation(param, symbol?.declarations?.[0] ?? signature.declaration ?? param.declarations?.[0] ?? param.valueDeclaration);
2842
+ const location = symbol?.declarations?.[0] ?? signature.declaration ?? param.declarations?.[0] ?? param.valueDeclaration;
2843
+ const paramType = paramDecl ? paramDecl.type != null ? checker.getTypeFromTypeNode(paramDecl.type) : checker.getTypeAtLocation(paramDecl) : location ? checker.getTypeOfSymbolAtLocation(param, location) : checker.getAnyType();
2829
2844
  collectReferencedTypes(paramType, checker, referencedTypes);
2830
2845
  if (paramDecl?.type) {
2831
2846
  collectReferencedTypesFromNode(paramDecl.type, checker, referencedTypes);
@@ -2895,6 +2910,86 @@ function serializeFunctionExport(declaration, symbol, context) {
2895
2910
  }
2896
2911
 
2897
2912
  // src/analysis/serializers/interfaces.ts
2913
+ function serializeInterfaceMembers(declaration, checker, typeRefs, referencedTypes) {
2914
+ const members = [];
2915
+ for (const member of declaration.members) {
2916
+ if (ts2.isPropertySignature(member)) {
2917
+ const memberName = member.name?.getText();
2918
+ if (!memberName)
2919
+ continue;
2920
+ const memberSymbol = member.name ? checker.getSymbolAtLocation(member.name) : undefined;
2921
+ const memberDoc = memberSymbol ? parseJSDocComment(memberSymbol, checker) : null;
2922
+ const memberType = member.type ? checker.getTypeAtLocation(member.type) : checker.getAnyType();
2923
+ collectReferencedTypes(memberType, checker, referencedTypes);
2924
+ const schema = formatTypeReference(memberType, checker, typeRefs, referencedTypes);
2925
+ const flags = {};
2926
+ if (member.questionToken) {
2927
+ flags.optional = true;
2928
+ }
2929
+ if (member.modifiers?.some((mod) => mod.kind === ts2.SyntaxKind.ReadonlyKeyword)) {
2930
+ flags.readonly = true;
2931
+ }
2932
+ members.push({
2933
+ id: memberName,
2934
+ name: memberName,
2935
+ kind: "property",
2936
+ schema,
2937
+ description: memberDoc?.description ?? (memberSymbol ? getJSDocComment(memberSymbol, checker) : undefined),
2938
+ flags: Object.keys(flags).length > 0 ? flags : undefined,
2939
+ tags: memberDoc?.tags
2940
+ });
2941
+ } else if (ts2.isMethodSignature(member)) {
2942
+ const methodName = member.name?.getText();
2943
+ if (!methodName)
2944
+ continue;
2945
+ const memberSymbol = member.name ? checker.getSymbolAtLocation(member.name) : undefined;
2946
+ const methodDoc = memberSymbol ? parseJSDocComment(memberSymbol, checker) : null;
2947
+ const signature = checker.getSignatureFromDeclaration(member);
2948
+ if (signature) {
2949
+ const parameters = signature.getParameters().map((param) => {
2950
+ const paramDecl = param.declarations?.find(ts2.isParameter);
2951
+ const paramType = paramDecl ? checker.getTypeAtLocation(paramDecl) : checker.getTypeOfSymbolAtLocation(param, member);
2952
+ collectReferencedTypes(paramType, checker, referencedTypes);
2953
+ if (paramDecl) {
2954
+ const paramDoc = getParameterDocumentation(param, paramDecl, checker);
2955
+ return structureParameter(param, paramDecl, paramType, checker, typeRefs, null, paramDoc, referencedTypes);
2956
+ }
2957
+ return {
2958
+ name: param.getName(),
2959
+ required: !(param.flags & ts2.SymbolFlags.Optional),
2960
+ schema: formatTypeReference(paramType, checker, typeRefs, referencedTypes)
2961
+ };
2962
+ });
2963
+ const returnType = signature.getReturnType();
2964
+ if (returnType) {
2965
+ collectReferencedTypes(returnType, checker, referencedTypes);
2966
+ }
2967
+ const flags = {};
2968
+ if (member.questionToken) {
2969
+ flags.optional = true;
2970
+ }
2971
+ members.push({
2972
+ id: methodName,
2973
+ name: methodName,
2974
+ kind: "method",
2975
+ signatures: [
2976
+ {
2977
+ parameters,
2978
+ returns: {
2979
+ schema: returnType ? formatTypeReference(returnType, checker, typeRefs, referencedTypes) : { type: "void" }
2980
+ },
2981
+ description: methodDoc?.description
2982
+ }
2983
+ ],
2984
+ description: methodDoc?.description ?? (memberSymbol ? getJSDocComment(memberSymbol, checker) : undefined),
2985
+ flags: Object.keys(flags).length > 0 ? flags : undefined,
2986
+ tags: methodDoc?.tags
2987
+ });
2988
+ }
2989
+ }
2990
+ }
2991
+ return members;
2992
+ }
2898
2993
  function serializeInterface(declaration, symbol, context) {
2899
2994
  const { checker, typeRegistry } = context;
2900
2995
  const parsedDoc = parseJSDocComment(symbol, checker);
@@ -2903,6 +2998,7 @@ function serializeInterface(declaration, symbol, context) {
2903
2998
  const referencedTypes = typeRegistry.getReferencedTypes();
2904
2999
  const typeRefs = typeRegistry.getTypeRefs();
2905
3000
  const typeParameters = serializeTypeParameterDeclarations(declaration.typeParameters, checker, referencedTypes);
3001
+ const members = serializeInterfaceMembers(declaration, checker, typeRefs, referencedTypes);
2906
3002
  const exportEntry = {
2907
3003
  id: symbol.getName(),
2908
3004
  name: symbol.getName(),
@@ -2911,6 +3007,7 @@ function serializeInterface(declaration, symbol, context) {
2911
3007
  deprecated: isSymbolDeprecated(symbol),
2912
3008
  description,
2913
3009
  source: getSourceLocation(declaration),
3010
+ members,
2914
3011
  typeParameters,
2915
3012
  tags: parsedDoc?.tags,
2916
3013
  examples: parsedDoc?.examples
@@ -2922,6 +3019,7 @@ function serializeInterface(declaration, symbol, context) {
2922
3019
  ...metadata,
2923
3020
  kind: "interface",
2924
3021
  schema,
3022
+ members,
2925
3023
  description,
2926
3024
  source: getSourceLocation(declaration),
2927
3025
  tags: parsedDoc?.tags
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@doccov/sdk",
3
- "version": "0.3.3",
3
+ "version": "0.3.5",
4
4
  "description": "DocCov SDK - Documentation coverage and drift detection for TypeScript",
5
5
  "keywords": [
6
6
  "typescript",