paramsSchema
tcmts.core.schema.paramsSchema · #nfld3nf5 · term · runs anywhere
import { schemaBuilder } from "#codebase/tcmts/core/schema";
import type { ParamsSchema } from "#codebase/tcmts/core/schema";
import { declarationOf } from "#codebase/tcmts/core/ts";
import type { TypeChecker } from "#codebase/tcmts/core/ts";
import { isParameterDeclaration as ts_isParameter } from "typescript/ast";
import type { ParameterDeclaration as ts_ParameterDeclaration } from "typescript/ast";
import type { Symbol as ts_Symbol, Type as ts_Type, TypeReference as ts_TypeReference } from "typescript/sync";
export function paramsSchema(
checker: TypeChecker,
type: ts_Type,
/** a parameter's type, where it's been asked already (`typedSites` asks them all at once) */
typeOf?: (p: ts_Symbol) => ts_Type | undefined,
): ParamsSchema | undefined {
const sig = type.getCallSignatures()[0];
if (!sig) return undefined;
const { of, defs } = schemaBuilder(checker);
const params = sig.getParameters().map((p) => {
const decl = declarationOf(p) as ts_ParameterDeclaration | undefined;
const rest = !!decl?.dotDotDotToken;
let pt = typeOf?.(p) ?? checker.getTypeOfSymbol(p);
if (rest && checker.isArrayType(pt)) pt = checker.getTypeArguments(pt as ts_TypeReference)[0]!;
const optional = !!decl && ts_isParameter(decl) && (!!decl.questionToken || !!decl.initializer);
return { name: p.name, s: of(pt, 0), optional, rest };
});
return { params, defs };
}
uses
used by