62 lines
3.0 KiB
JavaScript
62 lines
3.0 KiB
JavaScript
"use strict";
|
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
};
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.toClass = exports.toClasses = exports.arrayItemToClass = void 0;
|
|
const isarray_1 = __importDefault(require("isarray"));
|
|
const utils_1 = require("./utils");
|
|
exports.arrayItemToClass = (arrayVal, Clazz, options) => {
|
|
return arrayVal.map((v) => isarray_1.default(v) ? exports.arrayItemToClass(v, Clazz, options) : objectToClass(v, Clazz, options));
|
|
};
|
|
const objectToClass = (jsonObj, Clazz, options) => {
|
|
const instance = new Clazz();
|
|
const originalKeyStore = utils_1.getOriginalKeyStore(Clazz);
|
|
originalKeyStore.forEach((propertiesOptions, originalKey) => {
|
|
const originalValue = jsonObj[originalKey];
|
|
propertiesOptions.forEach((storeItemoptions) => {
|
|
const { key, beforeDeserializer, deserializer, targetClass, optional } = storeItemoptions;
|
|
const disallowIgnoreDeserializer = storeItemoptions.disallowIgnoreDeserializer || !options.ignoreDeserializer;
|
|
const disallowIgnoreBeforeDeserializer = storeItemoptions.disallowIgnoreBeforeDeserializer || !options.ignoreBeforeDeserializer;
|
|
const isValueNotExist = options.distinguishNullAndUndefined ? utils_1.isUndefined : utils_1.isNullOrUndefined;
|
|
let value = originalValue;
|
|
if (isValueNotExist(value)) {
|
|
if (!isValueNotExist(storeItemoptions.default)) {
|
|
instance[key] = storeItemoptions.default;
|
|
return;
|
|
}
|
|
if (!optional) {
|
|
throw new Error(`Can't map '${originalKey}' to ${Clazz.name}.${key}, property '${originalKey}' not found`);
|
|
}
|
|
return;
|
|
}
|
|
value =
|
|
beforeDeserializer && disallowIgnoreBeforeDeserializer
|
|
? beforeDeserializer(value, instance, jsonObj, options)
|
|
: value;
|
|
if (value && targetClass) {
|
|
if (isarray_1.default(value)) {
|
|
value = exports.arrayItemToClass(value, targetClass, options);
|
|
}
|
|
else {
|
|
value = exports.toClass(value, targetClass, options);
|
|
}
|
|
}
|
|
instance[key] =
|
|
deserializer && disallowIgnoreDeserializer ? deserializer(value, instance, jsonObj, options) : value;
|
|
});
|
|
});
|
|
return instance;
|
|
};
|
|
exports.toClasses = (rawJson, Clazz, options = {}) => {
|
|
if (!isarray_1.default(rawJson)) {
|
|
throw new Error(`rawJson ${rawJson} must be an array`);
|
|
}
|
|
const { constructor } = Clazz.prototype;
|
|
return rawJson.map((item) => objectToClass(item, constructor, options));
|
|
};
|
|
exports.toClass = (rawJson, Clazz, options = {}) => {
|
|
const { constructor } = Clazz.prototype;
|
|
return objectToClass(rawJson, constructor, options);
|
|
};
|