typia
Version:
Superfast runtime validators with only one line
73 lines (66 loc) • 2.35 kB
text/typescript
import ts from "typescript";
import { ExpressionFactory } from "../../factories/ExpressionFactory";
import { ITypiaContext } from "../../transformers/ITypiaContext";
import { FunctionalIsParametersProgrammer } from "./FunctionalIsParametersProgrammer";
import { FunctionalIsReturnProgrammer } from "./FunctionalIsReturnProgrammer";
export namespace FunctionalIsFunctionProgrammer {
export interface IConfig {
equals: boolean;
}
export interface IProps {
context: ITypiaContext;
modulo: ts.LeftHandSideExpression;
config: IConfig;
declaration: ts.FunctionDeclaration;
expression: ts.Expression;
init?: ts.Expression | undefined;
}
export const write = (props: IProps): ts.CallExpression => {
const p = FunctionalIsParametersProgrammer.decompose(props);
const r = FunctionalIsReturnProgrammer.decompose(props);
return ExpressionFactory.selfCall(
ts.factory.createBlock(
[
...p.functions,
...r.functions,
ts.factory.createReturnStatement(
ts.factory.createArrowFunction(
r.async
? [ts.factory.createModifier(ts.SyntaxKind.AsyncKeyword)]
: undefined,
undefined,
props.declaration.parameters,
getReturnTypeNode({
declaration: props.declaration,
async: r.async,
}),
undefined,
ts.factory.createBlock([...p.statements, ...r.statements], true),
),
),
],
true,
),
);
};
export const getReturnTypeNode = (props: {
declaration: ts.FunctionDeclaration;
async: boolean;
}): ts.TypeNode | undefined =>
props.declaration.type
? props.async
? !!(props.declaration.type! as ts.TypeReferenceNode).typeArguments?.[0]
? ts.factory.createTypeReferenceNode("Promise", [
ts.factory.createUnionTypeNode([
(props.declaration.type! as ts.TypeReferenceNode)
.typeArguments![0]!,
ts.factory.createTypeReferenceNode("null"),
]),
])
: undefined
: ts.factory.createUnionTypeNode([
props.declaration.type,
ts.factory.createTypeReferenceNode("null"),
])
: undefined;
}