@nestia/core
Version:
Super-fast validation decorators of NestJS
104 lines • 5.5 kB
JavaScript
;
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