UNPKG

@vladbasin/strong-api-mapping

Version:

Strongly typed API models. Mapping & validation

45 lines 2.14 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.defineDecorator = void 0; const lodash_1 = require("lodash"); const _1 = require("."); const defineDecorator = (options) => { return (target, key) => { var _a, _b; const mappings = [...(0, _1.getMappingMetadata)(target)]; const propName = key.toString(); const propType = Reflect.getMetadata('design:type', target, key); let isArray = false; let parser = (0, _1.wrapParserForNilAndBoolValues)((_a = options.parser) !== null && _a !== void 0 ? _a : propType); if (propType.name === 'Array') { if ((0, lodash_1.isNil)(options.parser)) { throw new _1.InvalidMappingError(`Parser is required for array property types (property = ${propName}). It will be used to parse array items`); } isArray = true; const nilWrappedParser = (0, _1.wrapParserForNilAndBoolValues)(parser); parser = (arg) => { if (!(0, lodash_1.isNil)(arg) && arg.constructor.name !== 'Array') { const result = nilWrappedParser(arg); if (result.constructor.name !== 'Array') { throw new _1.InvalidMappingError(`Property ${propName} cannot be mapped, because value is not array or specified parser cannot convert it into array`); } return result; } return (arg === null || arg === void 0 ? void 0 : arg.map(t => nilWrappedParser(t))) || []; }; } mappings.push({ isCustom: options.isCustom, propName, source: options.source, sourceKey: options.useKey ? (_b = options.key) !== null && _b !== void 0 ? _b : propName : undefined, isKeyCaseSensitive: options.isKeyCaseSensitive, isArray, parser, priority: options.priority || 0, }); (0, _1.setMappingMetadata)(mappings, target); }; }; exports.defineDecorator = defineDecorator; //# sourceMappingURL=defineDecorator.js.map