express-cargo
Version:
express middleware for class-based request parsing
118 lines (117 loc) • 3.51 kB
JavaScript
function _define_property(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
return obj;
}
import 'reflect-metadata';
export class CargoClassMetadata {
getMetadataKey(propertyKey) {
return `cargo:${String(propertyKey)}`;
}
getFieldKey() {
return `cargo:fields`;
}
getFieldMetadata(propertyKey) {
const metadataKey = this.getMetadataKey(propertyKey);
return Reflect.getMetadata(metadataKey, this.target) || new CargoFieldMetadata(this.target, propertyKey);
}
setFieldMetadata(propertyKey, meta) {
const metaKey = this.getMetadataKey(propertyKey);
Reflect.defineMetadata(metaKey, meta, this.target);
}
getFieldList() {
const fields = new Set();
let current = this.target;
while(current && current !== Object.prototype){
const currentFields = Reflect.getMetadata(this.getFieldKey(), current) || [];
currentFields.forEach((f)=>fields.add(f));
current = Object.getPrototypeOf(current);
}
return Array.from(fields);
}
setFieldList(propertyKey) {
const existing = this.getFieldList();
if (!existing.includes(propertyKey)) {
Reflect.defineMetadata(this.getFieldKey(), [
...existing,
propertyKey
], this.target);
}
}
constructor(target){
_define_property(this, "target", void 0);
this.target = target;
}
}
export class CargoFieldMetadata {
getKey() {
return this.key;
}
setKey(key) {
this.key = key;
}
getSource() {
return this.source;
}
setSource(source) {
this.source = source;
}
getValidators() {
return this.validators;
}
addValidator(rule) {
this.validators.push(rule);
}
getOptional() {
return this.optional;
}
setOptional(optional) {
this.optional = optional;
}
getTransformer() {
return this.transformer;
}
setTransformer(transformer) {
this.transformer = transformer;
}
getRequestTransformer() {
return this.requestTransformer;
}
setRequestTransformer(transformer) {
this.requestTransformer = transformer;
}
getVirtualTransformer() {
return this.virtualTransformer;
}
setVirtualTransformer(transformer) {
this.virtualTransformer = transformer;
}
constructor(target, key){
_define_property(this, "target", void 0);
_define_property(this, "type", void 0);
_define_property(this, "key", void 0);
_define_property(this, "source", void 0);
_define_property(this, "optional", void 0);
_define_property(this, "validators", void 0);
_define_property(this, "transformer", void 0);
_define_property(this, "requestTransformer", void 0);
_define_property(this, "virtualTransformer", void 0);
this.target = target;
this.type = Reflect.getMetadata('design:type', target, key);
this.key = key;
this.source = 'body';
this.validators = [];
this.optional = false;
this.transformer = undefined;
this.requestTransformer = undefined;
this.virtualTransformer = undefined;
}
}