UNPKG

@tsclean/core

Version:

Plugin for API Rest Full development, based on Clean Architecture, IoC and Dependency Injection.

59 lines 14.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Res = exports.Req = exports.Headers = exports.Response = exports.Request = void 0; exports.assignMetadata = assignMetadata; exports.Query = Query; exports.Body = Body; exports.Param = Param; exports.UploadedFile = UploadedFile; exports.UploadedFiles = UploadedFiles; const helpers_1 = require("../helpers"); const enums_1 = require("../enums"); const utils_1 = require("../utils"); function assignMetadata(args, paramType, index, data, ...handlers) { return Object.assign(Object.assign({}, args), { [`${paramType}:${index}`]: { index, data, handlers, } }); } function createRouteParamDecorator(paramType) { return (data) => (target, key, index) => { const args = Reflect.getMetadata(helpers_1.ROUTE_ARGS_METADATA, target.constructor, key) || {}; Reflect.defineMetadata(helpers_1.ROUTE_ARGS_METADATA, assignMetadata(args, paramType, index, data), target.constructor, key); }; } const createHandlerRouteParamDecorator = (paramType) => (data, ...pipes) => (target, key, index) => { const args = Reflect.getMetadata(helpers_1.ROUTE_ARGS_METADATA, target.constructor, key) || {}; const hasParamData = (0, utils_1.isNil)(data) || (0, utils_1.isString)(data); const paramData = hasParamData ? data : undefined; const paramPipes = hasParamData ? pipes : [data, ...pipes]; Reflect.defineMetadata(helpers_1.ROUTE_ARGS_METADATA, assignMetadata(args, paramType, index, paramData, ...paramPipes), target.constructor, key); }; exports.Request = createRouteParamDecorator(enums_1.RouteParamTypes.REQUEST); const Response = (options) => (target, key, index) => { if (options === null || options === void 0 ? void 0 : options.passThrough) { Reflect.defineMetadata(helpers_1.RESPONSE_PASSTHROUGH_METADATA, options === null || options === void 0 ? void 0 : options.passThrough, target.constructor, key); } return createRouteParamDecorator(enums_1.RouteParamTypes.RESPONSE)()(target, key, index); }; exports.Response = Response; exports.Headers = createRouteParamDecorator(enums_1.RouteParamTypes.HEADERS); function Query(property, ...handlers) { return createHandlerRouteParamDecorator(enums_1.RouteParamTypes.QUERY)(property, ...handlers); } function Body(property, ...handlers) { return createHandlerRouteParamDecorator(enums_1.RouteParamTypes.BODY)(property, ...handlers); } function Param(property, ...handlers) { return createHandlerRouteParamDecorator(enums_1.RouteParamTypes.PARAM)(property, ...handlers); } function UploadedFile(fileKey, ...handlers) { return createHandlerRouteParamDecorator(enums_1.RouteParamTypes.FILE)(fileKey, ...handlers); } function UploadedFiles(...handlers) { return createHandlerRouteParamDecorator(enums_1.RouteParamTypes.FILES)(undefined, ...handlers); } exports.Req = exports.Request; exports.Res = exports.Response; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUtcGFyYW1zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RlY29yYXRvcnMvcm91dGUtcGFyYW1zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQW9CQSx3Q0FXQztBQTBFRCxzQkFPQztBQVFELG9CQVFDO0FBVUQsc0JBUUM7QUFhRCxvQ0FRQztBQVFELHNDQU9DO0FBdExELHdDQUdvQjtBQUNwQixvQ0FBeUM7QUFHekMsb0NBQXlDO0FBYXpDLFNBQWdCLGNBQWMsQ0FDMUIsSUFBTyxFQUFFLFNBQVksRUFBRSxLQUFhLEVBQUUsSUFBZ0IsRUFDdEQsR0FBRyxRQUF1RDtJQUMxRCx1Q0FDTyxJQUFJLEtBQ1AsQ0FBQyxHQUFHLFNBQVMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxFQUFFO1lBQ3ZCLEtBQUs7WUFDTCxJQUFJO1lBQ0osUUFBUTtTQUNYLElBQ0g7QUFDTixDQUFDO0FBRUQsU0FBUyx5QkFBeUIsQ0FBQyxTQUEwQjtJQUN6RCxPQUFPLENBQUMsSUFBZ0IsRUFBc0IsRUFBRSxDQUM1QyxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUU7UUFDbkIsTUFBTSxJQUFJLEdBQ04sT0FBTyxDQUFDLFdBQVcsQ0FBQyw2QkFBbUIsRUFBRSxNQUFNLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM1RSxPQUFPLENBQUMsY0FBYyxDQUNsQiw2QkFBbUIsRUFDbkIsY0FBYyxDQUNWLElBQUksRUFDSixTQUFTLEVBQ1QsS0FBSyxFQUNMLElBQUksQ0FDUCxFQUNELE1BQU0sQ0FBQyxXQUFXLEVBQ2xCLEdBQUcsQ0FDTixDQUFDO0lBQ04sQ0FBQyxDQUFDO0FBQ1YsQ0FBQztBQUVELE1BQU0sZ0NBQWdDLEdBQ2xDLENBQUMsU0FBMEIsRUFBRSxFQUFFLENBQzNCLENBQ0ksSUFBVSxFQUNWLEdBQUcsS0FBb0QsRUFDckMsRUFBRSxDQUNwQixDQUFDLE1BQU0sRUFBRSxHQUFH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ICAgIFJFU1BPTlNFX1BBU1NUSFJPVUdIX01FVEFEQVRBLFxuICAgIFJPVVRFX0FSR1NfTUVUQURBVEEsXG59IGZyb20gJy4uL2hlbHBlcnMnO1xuaW1wb3J0IHtSb3V0ZVBhcmFtVHlwZXN9IGZyb20gJy4uL2VudW1zJztcbmltcG9ydCB7SGFuZGxlclRyYW5zZm9ybX0gZnJvbSAnLi4vY29udHJhY3RzJztcbmltcG9ydCB7VHlwZX0gZnJvbSAnLi4vY29udHJhY3RzJztcbmltcG9ydCB7aXNOaWwsIGlzU3RyaW5nfSBmcm9tICcuLi91dGlscyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzcG9uc2VEZWNvcmF0b3JPcHRpb25zIHtcbiAgICBwYXNzVGhyb3VnaDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgUGFyYW1EYXRhID0gb2JqZWN0IHwgc3RyaW5nIHwgbnVtYmVyO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJvdXRlUGFyYW1NZXRhZGF0YSB7XG4gICAgaW5kZXg6IG51bWJlcjtcbiAgICBkYXRhPzogUGFyYW1EYXRhO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzaWduTWV0YWRhdGE8VCA9IGFueSwgUiA9IGFueT4oXG4gICAgYXJnczogUiwgcGFyYW1UeXBlOiBULCBpbmRleDogbnVtYmVyLCBkYXRhPzogUGFyYW1EYXRhLFxuICAgIC4uLmhhbmRsZXJzOiAoVHlwZTxIYW5kbGVyVHJhbnNmb3JtPiB8IEhhbmRsZXJUcmFuc2Zvcm0pW10pIHtcbiAgICByZXR1cm4ge1xuICAgICAgICAuLi5hcmdzLFxuICAgICAgICBbYCR7cGFyYW1UeXBlfToke2luZGV4fWBdOiB7XG4gICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICBoYW5kbGVycyxcbiAgICAgICAgfSxcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVSb3V0ZVBhcmFtRGVjb3JhdG9yKHBhcmFtVHlwZTogUm91dGVQYXJhbVR5cGVzKSB7XG4gICAgcmV0dXJuIChkYXRhPzogUGFyYW1EYXRhKTogUGFyYW1ldGVyRGVjb3JhdG9yID0+XG4gICAgICAgICh0YXJnZXQsIGtleSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFyZ3MgPVxuICAgICAgICAgICAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoUk9VVEVfQVJHU19NRVRBREFUQSwgdGFyZ2V0LmNvbnN0cnVjdG9yLCBrZXkpIHx8IHt9O1xuICAgICAgICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgICAgICAgICAgICBST1VURV9BUkdTX01FVEFEQVRBLFxuICAgICAgICAgICAgICAgIGFzc2lnbk1ldGFkYXRhPFJvdXRlUGFyYW1UeXBlcywgUmVjb3JkPG51bWJlciwgUm91dGVQYXJhbU1ldGFkYXRhPj4oXG4gICAgICAgICAgICAgICAgICAgIGFyZ3MsXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtVHlwZSxcbiAgICAgICAgICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB0YXJnZXQuY29uc3RydWN0b3IsXG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfTtcbn1cblxuY29uc3QgY3JlYXRlSGFuZGxlclJvdXRlUGFyYW1EZWNvcmF0b3IgPVxuICAgIChwYXJhbVR5cGU6IFJvdXRlUGFyYW1UeXBlcykgPT5cbiAgICAgICAgKFxuICAgICAgICAgICAgZGF0YT86IGFueSxcbiAgICAgICAgICAgIC4uLnBpcGVzOiAoVHlwZTxIYW5kbGVyVHJhbnNmb3JtPiB8IEhhbmRsZXJUcmFuc2Zvcm0pW11cbiAgICAgICAgKTogUGFyYW1ldGVyRGVjb3JhdG9yID0+XG4gICAgICAgICAgICAodGFyZ2V0LCBrZXksIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYXJncyA9XG4gICAgICAgICAgICAgICAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoUk9VVEVfQVJHU19NRVRBREFUQSwgdGFyZ2V0LmNvbnN0cnVjdG9yLCBrZXkpIHx8IHt9O1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhc1BhcmFtRGF0YSA9IGlzTmlsKGRhdGEpIHx8IGlzU3RyaW5nKGRhdGEpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtRGF0YSA9IGhhc1BhcmFtRGF0YSA/IGRhdGEgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyYW1QaXBlcyA9IGhhc1BhcmFtRGF0YSA/IHBpcGVzIDogW2RhdGEsIC4uLnBpcGVzXTtcblxuICAgICAgICAgICAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICAgICAgICAgICAgICAgIFJPVVRFX0FSR1NfTUVUQURBVEEsXG4gICAgICAgICAgICAgICAgICAgIGFzc2lnbk1ldGFkYXRhKGFyZ3MsIHBhcmFtVHlwZSwgaW5kZXgsIHBhcmFtRGF0YSwgLi4ucGFyYW1QaXBlcyksXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldC5jb25zdHJ1Y3RvcixcbiAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9O1xuXG5leHBvcnQgY29uc3QgUmVxdWVzdDogKCkgPT4gUGFyYW1ldGVyRGVjb3JhdG9yID0gY3JlYXRlUm91dGVQYXJhbURlY29yYXRvcihcbiAgICBSb3V0ZVBhcmFtVHlwZXMuUkVRVUVTVCxcbik7XG5cbmV4cG9ydCBjb25zdCBSZXNwb25zZTogKG9wdGlvbnM/OiBSZXNwb25zZURlY29yYXRvck9wdGlvbnMpID0+IFBhcmFtZXRlckRlY29yYXRvciA9XG4gICAgKG9wdGlvbnM/OiBSZXNwb25zZURlY29yYXRvck9wdGlvbnMpID0+ICh0YXJnZXQsIGtleSwgaW5kZXgpID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbnM/LnBhc3NUaHJvdWdoKSB7XG4gICAgICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgICAgICAgICAgIFJFU1BPTlNFX1BBU1NUSFJPVUdIX01FVEFEQVRBLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM/LnBhc3NUaHJvdWdoLFxuICAgICAgICAgICAgICAgIHRhcmdldC5jb25zdHJ1Y3RvcixcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjcmVhdGVSb3V0ZVBhcmFtRGVjb3JhdG9yKFJvdXRlUGFyYW1UeXBlcy5SRVNQT05TRSkoKShcbiAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIGluZGV4LFxuICAgICAgICApO1xuICAgIH07XG5cbmV4cG9ydCBjb25zdCBIZWFkZXJzOiAocHJvcGVydHk/OiBzdHJpbmcpID0+IFBhcmFtZXRlckRlY29yYXRvciA9XG4gICAgY3JlYXRlUm91dGVQYXJhbURlY29yYXRvcihSb3V0ZVBhcmFtVHlwZXMuSEVBREVSUyk7XG5cbmV4cG9ydCBmdW5jdGlvbiBRdWVyeSgpOiBQYXJhbWV0ZXJEZWNvcmF0b3I7XG5cbmV4cG9ydCBmdW5jdGlvbiBRdWVyeSguLi5oYW5kbGVyczogKFR5cGU8SGFuZGxlclRyYW5zZm9ybT4gfCBIYW5kbGVyVHJhbnNmb3JtKVtdKTogUGFyYW1ldGVyRGVjb3JhdG9yO1xuXG5leHBvcnQgZnVuY3Rpb24gUXVlcnkocHJvcGVydHk6IHN0cmluZyxcbiAgICAuLi5oYW5kbGVyczogKFR5cGU8SGFuZGxlclRyYW5zZm9ybT4gfCBIYW5kbGVyVHJhbnNmb3JtKVtdXG4pOiBQYXJhbWV0ZXJEZWNvcmF0b3I7XG5cbmV4cG9ydCBmdW5jdGlvbiBRdWVyeShcbiAgICBwcm9wZXJ0eT86IHN0cmluZyB8IChUeXBlPEhhbmRsZXJUcmFuc2Zvcm0+IHwgSGFuZGxlclRyYW5zZm9ybSksIC4uLmhhbmRsZXJzOiAoVHlwZTxIYW5kbGVyVHJhbnNmb3JtPiB8IEhhbmRsZXJUcmFuc2Zvcm0pW11cbik6IFBhcmFtZXRlckRlY29yYXRvciB7XG4gICAgcmV0dXJuIGNyZWF0ZUhhbmRsZXJSb3V0ZVBhcmFtRGVjb3JhdG9yKFJvdXRlUGFyYW1UeXBlcy5RVUVSWSkoXG4gICAgICAgIHByb3BlcnR5LFxuICAgICAgICAuLi5oYW5kbGVycyxcbiAgICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gQm9keSgpOiBQYXJhbWV0ZXJEZWNvcmF0b3I7XG5cbmV4cG9ydCBmdW5jdGlvbiBCb2R5KC4uLmhhbmRsZXJzOiAoVHlwZTxIYW5kbGVyVHJhbnNmb3JtPiB8IEhhbmRsZXJUcmFuc2Zvcm0pW10pOiBQYXJhbWV0ZXJEZWNvcmF0b3I7XG5cbmV4cG9ydCBmdW5jdGlvbiBCb2R5KHByb3BlcnR5OiBzdHJpbmcsIC4uLmhhbmRsZXJzOiAoVHlwZTxIYW5kbGVyVHJhbnNmb3JtPiB8IEhhbmRsZXJUcmFuc2Zvcm0pW10pOiBQYXJhbWV0ZXJEZWNvcmF0b3I7XG5cbmV4cG9ydCBmdW5jdGlvbiBCb2R5KFxuICAgIHByb3BlcnR5Pzogc3RyaW5nIHwgKFR5cGU8SGFuZGxlclRyYW5zZm9ybT4gfCBIYW5kbGVyVHJhbnNmb3JtKSxcbiAgICAuLi5oYW5kbGVyczogKFR5cGU8SGFuZGxlclRyYW5zZm9ybT4gfCBIYW5kbGVyVHJhbnNmb3JtKVtdXG4pOiBQYXJhbWV0ZXJEZWNvcmF0b3Ige1xuICAgIHJldHVybiBjcmVhdGVIYW5kbGVyUm91dGVQYXJhbURlY29yYXRvcihSb3V0ZVBhcmFtVHlwZXMuQk9EWSkoXG4gICAgICAgIHByb3BlcnR5LFxuICAgICAgICAuLi5oYW5kbGVycyxcbiAgICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gUGFyYW0oKTogUGFyYW1ldGVyRGVjb3JhdG9yO1xuXG5leHBvcnQgZnVuY3Rpb24gUGFyYW0oLi4uaGFuZGxlcnM6IChUeXBlPEhhbmRsZXJUcmFuc2Zvcm0+IHwgSGFuZGxlclRyYW5zZm9ybSlbXSk6IFBhcmFtZXRlckRlY29yYXRvcjtcblxuZXhwb3J0IGZ1bmN0aW9uIFBhcmFtKFxuICAgIHByb3BlcnR5OiBzdHJpbmcsIC4uLmhhbmRsZXJzOiAoVHlwZTxIYW5kbGVyVHJhbnNmb3JtPiB8IEhhbmRsZXJUcmFuc2Zvcm0pW11cbik6IFBhcmFtZXRlckRlY29yYXRvcjtcblxuZXhwb3J0IGZ1bmN0aW9uIFBhcmFtKFxuICAgIHByb3BlcnR5Pzogc3RyaW5nIHwgKFR5cGU8SGFuZGxlclRyYW5zZm9ybT4gfCBIYW5kbGVyVHJhbnNmb3JtKSxcbiAgICAuLi5oYW5kbGVyczogKFR5cGU8SGFuZGxlclRyYW5zZm9ybT4gfCBIYW5kbGVyVHJhbnNmb3JtKVtdXG4pOiBQYXJhbWV0ZXJEZWNvcmF0b3Ige1xuICAgIHJldHVybiBjcmVhdGVIYW5kbGVyUm91dGVQYXJhbURlY29yYXRvcihSb3V0ZVBhcmFtVHlwZXMuUEFSQU0pKFxuICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgLi4uaGFuZGxlcnMsXG4gICAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFVwbG9hZGVkRmlsZSgpOiBQYXJhbWV0ZXJEZWNvcmF0b3I7XG5cbmV4cG9ydCBmdW5jdGlvbiBVcGxvYWRlZEZpbGUoXG4gICAgLi4uaGFuZGxlcnM6IChUeXBlPEhhbmRsZXJUcmFuc2Zvcm0+IHwgSGFuZGxlclRyYW5zZm9ybSlbXVxuKTogUGFyYW1ldGVyRGVjb3JhdG9yO1xuXG5leHBvcnQgZnVuY3Rpb24gVXBsb2FkZWRGaWxlKFxuICAgIGZpbGVLZXk/OiBzdHJpbmcsXG4gICAgLi4uaGFuZGxlcnM6IChUeXBlPEhhbmRsZXJUcmFuc2Zvcm0+IHwgSGFuZGxlclRyYW5zZm9ybSlbXVxuKTogUGFyYW1ldGVyRGVjb3JhdG9yO1xuXG5leHBvcnQgZnVuY3Rpb24gVXBsb2FkZWRGaWxlKFxuICAgIGZpbGVLZXk/OiBzdHJpbmcgfCAoVHlwZTxIYW5kbGVyVHJhbnNmb3JtPiB8IEhhbmRsZXJUcmFuc2Zvcm0pLFxuICAgIC4uLmhhbmRsZXJzOiAoVHlwZTxIYW5kbGVyVHJhbnNmb3JtPiB8IEhhbmRsZXJUcmFuc2Zvcm0pW11cbik6IFBhcmFtZXRlckRlY29yYXRvciB7XG4gICAgcmV0dXJuIGNyZWF0ZUhhbmRsZXJSb3V0ZVBhcmFtRGVjb3JhdG9yKFJvdXRlUGFyYW1UeXBlcy5GSUxFKShcbiAgICAgICAgZmlsZUtleSxcbiAgICAgICAgLi4uaGFuZGxlcnMsXG4gICAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFVwbG9hZGVkRmlsZXMoKTogUGFyYW1ldGVyRGVjb3JhdG9yO1xuXG5leHBvcnQgZnVuY3Rpb24gVXBsb2FkZWRGaWxlcyhcbiAgICAuLi5oYW5kbGVyczogKFR5cGU8SGFuZGxlclRyYW5zZm9ybT4gfCBIYW5kbGVyVHJhbnNmb3JtKVtdXG4pOiBQYXJhbWV0ZXJEZWNvcmF0b3I7XG5cbmV4cG9ydCBmdW5jdGlvbiBVcGxvYWRlZEZpbGVzKFxuICAgIC4uLmhhbmRsZXJzOiAoVHlwZTxIYW5kbGVyVHJhbnNmb3JtPiB8IEhhbmRsZXJUcmFuc2Zvcm0pW11cbik6IFBhcmFtZXRlckRlY29yYXRvciB7XG4gICAgcmV0dXJuIGNyZWF0ZUhhbmRsZXJSb3V0ZVBhcmFtRGVjb3JhdG9yKFJvdXRlUGFyYW1UeXBlcy5GSUxFUykoXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgLi4uaGFuZGxlcnMsXG4gICAgKTtcbn1cblxuZXhwb3J0IGNvbnN0IFJlcSA9IFJlcXVlc3Q7XG5leHBvcnQgY29uc3QgUmVzID0gUmVzcG9uc2U7XG4iXX0=