UNPKG

express-cargo

Version:

express middleware for class-based request parsing

50 lines (49 loc) 2.07 kB
"use strict"; 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); }; }