UNPKG

typia

Version:

Superfast runtime validators with only one line

68 lines (65 loc) 3.86 kB
import ts from 'typescript'; import { ExpressionFactory } from '../../factories/ExpressionFactory.mjs'; import { IdentifierFactory } from '../../factories/IdentifierFactory.mjs'; import { StringUtil } from '../../utils/StringUtil.mjs'; import { AssertProgrammer } from '../AssertProgrammer.mjs'; import { FunctionalAssertParametersProgrammer } from './FunctionalAssertParametersProgrammer.mjs'; import { FunctionAssertReturnProgrammer } from './FunctionalAssertReturnProgrammer.mjs'; var FunctionalAssertFunctionProgrammer; (function (FunctionalAssertFunctionProgrammer) { FunctionalAssertFunctionProgrammer.write = (props) => { const wrapper = FunctionalAssertFunctionProgrammer.errorFactoryWrapper({ context: props.context, parameters: props.declaration.parameters, init: props.init, }); const p = FunctionalAssertParametersProgrammer.decompose({ context: props.context, modulo: props.modulo, config: props.config, parameters: props.declaration.parameters, wrapper: wrapper.name, }); const r = FunctionAssertReturnProgrammer.decompose({ context: props.context, modulo: props.modulo, config: props.config, expression: props.expression, declaration: props.declaration, wrapper: wrapper.name, }); return ExpressionFactory.selfCall(ts.factory.createBlock([ wrapper.variable, ...p.functions, ...r.functions, ts.factory.createReturnStatement(ts.factory.createArrowFunction(r.async ? [ts.factory.createModifier(ts.SyntaxKind.AsyncKeyword)] : undefined, undefined, props.declaration.parameters, props.declaration.type, undefined, ts.factory.createBlock([ ...p.expressions.map(ts.factory.createExpressionStatement), ts.factory.createReturnStatement(r.value), ]))), ], true)); }; FunctionalAssertFunctionProgrammer.errorFactoryWrapper = (props) => { const name = StringUtil.escapeDuplicate({ keep: props.parameters.map((p) => p.name.getText()), input: "errorFactoryWrapper", }); const variable = ts.factory.createVariableStatement(undefined, ts.factory.createVariableDeclarationList([ ts.factory.createVariableDeclaration(name, undefined, AssertProgrammer.Guardian.type(props.context), props.init ?? props.context.importer.internal("functionalTypeGuardErrorFactory")), ], ts.NodeFlags.Const)); return { name, variable }; }; FunctionalAssertFunctionProgrammer.hookPath = (props) => ts.factory.createArrowFunction(undefined, undefined, [IdentifierFactory.parameter("p")], undefined, undefined, ts.factory.createCallExpression(ts.factory.createIdentifier(props.wrapper), undefined, [ ts.factory.createObjectLiteralExpression([ ts.factory.createSpreadAssignment(ts.factory.createIdentifier("p")), ts.factory.createPropertyAssignment("path", ts.factory.createConditionalExpression(ts.factory.createPropertyAccessExpression(ts.factory.createIdentifier("p"), "path"), undefined, ts.factory.createCallExpression(ts.factory.createPropertyAccessExpression(ts.factory.createPropertyAccessExpression(ts.factory.createIdentifier("p"), "path"), "replace"), undefined, [ ts.factory.createStringLiteral("$input"), ts.factory.createStringLiteral(props.replacer), ]), undefined, ts.factory.createIdentifier("undefined"))), ]), ])); })(FunctionalAssertFunctionProgrammer || (FunctionalAssertFunctionProgrammer = {})); export { FunctionalAssertFunctionProgrammer }; //# sourceMappingURL=FunctionalAssertFunctionProgrammer.mjs.map