UNPKG

@nestia/core

Version:

Super-fast validation decorators of NestJS

104 lines 5.5 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.ParameterDecoratorTransformer = void 0; const path_1 = __importDefault(require("path")); const typescript_1 = __importDefault(require("typescript")); const PlainBodyProgrammer_1 = require("../programmers/PlainBodyProgrammer"); const TypedBodyProgrammer_1 = require("../programmers/TypedBodyProgrammer"); const TypedFormDataBodyProgrammer_1 = require("../programmers/TypedFormDataBodyProgrammer"); const TypedHeadersProgrammer_1 = require("../programmers/TypedHeadersProgrammer"); const TypedParamProgrammer_1 = require("../programmers/TypedParamProgrammer"); const TypedQueryBodyProgrammer_1 = require("../programmers/TypedQueryBodyProgrammer"); const TypedQueryProgrammer_1 = require("../programmers/TypedQueryProgrammer"); var ParameterDecoratorTransformer; (function (ParameterDecoratorTransformer) { ParameterDecoratorTransformer.transform = (props) => { var _a; //---- // VALIDATIONS //---- // CHECK DECORATOR if (!typescript_1.default.isCallExpression(props.decorator.expression)) return props.decorator; // SIGNATURE DECLARATION const declaration = (_a = props.context.checker.getResolvedSignature(props.decorator.expression)) === null || _a === void 0 ? void 0 : _a.declaration; if (declaration === undefined) return props.decorator; // FILE PATH const file = path_1.default.resolve(declaration.getSourceFile().fileName); if (file.indexOf(LIB_PATH) === -1 && file.indexOf(MONO_PATH) === -1) return props.decorator; //---- // TRANSFORMATION //---- // FIND PROGRAMMER const programmer = FUNCTORS[getName(props.context.checker.getTypeAtLocation(declaration).symbol)]; if (programmer === undefined) return props.decorator; // GET TYPE INFO const typeNode = props.context.checker.typeToTypeNode(props.type, undefined, undefined); if (typeNode === undefined) return props.decorator; // DO TRANSFORM return typescript_1.default.factory.createDecorator(typescript_1.default.factory.updateCallExpression(props.decorator.expression, props.decorator.expression.expression, props.decorator.expression.typeArguments, programmer({ context: props.context, modulo: props.decorator.expression.expression, arguments: props.decorator.expression.arguments, type: props.type, }))); }; })(ParameterDecoratorTransformer || (exports.ParameterDecoratorTransformer = ParameterDecoratorTransformer = {})); const FUNCTORS = { EncryptedBody: (props) => props.arguments.length ? props.arguments : [TypedBodyProgrammer_1.TypedBodyProgrammer.generate(props)], TypedBody: (props) => props.arguments.length ? props.arguments : [TypedBodyProgrammer_1.TypedBodyProgrammer.generate(props)], TypedHeaders: (props) => props.arguments.length ? props.arguments : [TypedHeadersProgrammer_1.TypedHeadersProgrammer.generate(props)], TypedParam: (props) => props.arguments.length !== 1 ? props.arguments : TypedParamProgrammer_1.TypedParamProgrammer.generate(props), TypedQuery: (props) => props.arguments.length ? props.arguments : [TypedQueryProgrammer_1.TypedQueryProgrammer.generate(props)], "TypedQuery.Body": (props) => props.arguments.length ? props.arguments : [TypedQueryBodyProgrammer_1.TypedQueryBodyProgrammer.generate(props)], "TypedFormData.Body": (props) => props.arguments.length === 0 ? [ typescript_1.default.factory.createIdentifier("undefined"), TypedFormDataBodyProgrammer_1.TypedFormDataBodyProgrammer.generate(props), ] : props.arguments.length === 1 ? [props.arguments[0], TypedFormDataBodyProgrammer_1.TypedFormDataBodyProgrammer.generate(props)] : props.arguments, PlainBody: (props) => props.arguments.length ? props.arguments : [PlainBodyProgrammer_1.PlainBodyProgrammer.generate(props)], "WebSocketRoute.Header": (props) => props.arguments.length ? props.arguments : [TypedBodyProgrammer_1.TypedBodyProgrammer.generate(props)], "WebSocketRoute.Param": (props) => props.arguments.length !== 1 ? props.arguments : TypedParamProgrammer_1.TypedParamProgrammer.generate(props), "WebSocketRoute.Query": (props) => props.arguments.length ? props.arguments : [TypedQueryProgrammer_1.TypedQueryProgrammer.generate(props)], }; const LIB_PATH = path_1.default.join("@nestia", "core", "lib", "decorators"); const MONO_PATH = path_1.default.join("packages", "core", "lib", "decorators"); const getName = (symbol) => { var _a, _b; const parent = (_b = (_a = symbol.getDeclarations()) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.parent; return parent ? exploreName(parent)(symbol.escapedName.toString()) : "__type"; }; const exploreName = (decl) => (name) => typescript_1.default.isModuleBlock(decl) ? exploreName(decl.parent.parent)(`${decl.parent.name.getFullText().trim()}.${name}`) : name; //# sourceMappingURL=ParameterDecoratorTransformer.js.map