express-cargo
Version:
express middleware for class-based request parsing
50 lines (49 loc) • 2.07 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "Enum", {
enumerable: true,
get: function() {
return Enum;
}
});
const _metadata = require("./metadata");
const _types = require("./types");
function Enum(enumObj, message) {
return (target, propertyKey)=>{
const classMeta = new _metadata.CargoClassMetadata(target);
const fieldMeta = classMeta.getFieldMetadata(propertyKey);
const enumKeys = Object.keys(enumObj).filter((k)=>isNaN(Number(k)));
const enumValues = enumKeys.map((k)=>enumObj[k]);
const validInputs = [
...enumKeys,
...enumValues
];
// 1. enum 타입 정보 저장
fieldMeta.setEnumType(enumObj);
// 2. enum validator 추가
fieldMeta.addValidator(new _types.ValidatorRule(propertyKey, 'enum', (input)=>validInputs.some((v)=>String(v) === String(input)), message || `${String(propertyKey)} must be one of: ${enumValues.join(', ')}`));
// 3. enum transformer 추가
const transformer = (value)=>{
if (value === null || value === undefined) return value;
const enumKeys = Object.keys(enumObj).filter((k)=>isNaN(Number(k)));
// 1. 입력값이 enum 키('ADMIN') 인 경우
if (typeof value === 'string' && enumKeys.includes(value)) {
return enumObj[value];
}
// 비교를 위해 숫자형 문자열을 숫자로 변환
const comparableValue = typeof value === 'string' && !isNaN(Number(value)) ? Number(value) : value;
// 2. 입력값이 enum 값(예: 0 또는 'admin')인 경우
for (const key of enumKeys){
if (enumObj[key] === comparableValue) {
return comparableValue;
}
}
return value;
};
fieldMeta.setTransformer(transformer);
// 메타데이터 저장
classMeta.setFieldMetadata(propertyKey, fieldMeta);
};
}