@vladbasin/strong-api-mapping
Version:
Strongly typed API models. Mapping & validation
45 lines • 2.14 kB
JavaScript
;
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