first commit
This commit is contained in:
1
json-mapper-class/dist/.pydio
vendored
Normal file
1
json-mapper-class/dist/.pydio
vendored
Normal file
@@ -0,0 +1 @@
|
||||
391e708b-cc22-49c3-8788-a0be45dd3948
|
||||
10
json-mapper-class/dist/decorators.d.ts
vendored
Normal file
10
json-mapper-class/dist/decorators.d.ts
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
import { StoreItemType } from './typing';
|
||||
export declare function serialize(serializer: StoreItemType['serializer'], disallowIgnore?: boolean): (target: any, propertyKey: string) => void;
|
||||
export declare function deserialize(deserializer: StoreItemType['deserializer'], disallowIgnore?: boolean): (target: any, propertyKey: string) => void;
|
||||
export declare function beforeDeserialize(beforeDeserializer: StoreItemType['beforeDeserializer'], disallowIgnore?: boolean): (target: any, propertyKey: string) => void;
|
||||
export declare function afterSerialize(afterSerializer: StoreItemType['afterSerializer'], disallowIgnore?: boolean): (target: any, propertyKey: string) => void;
|
||||
export declare function serializeTarget(): (target: any, propertyKey: string) => void;
|
||||
export declare function property(originalKey?: string, targetClass?: StoreItemType['targetClass'], isOptional?: boolean): (target: any, propertyKey: string) => void;
|
||||
export declare function typed(targetClass: StoreItemType['targetClass']): (target: any, propertyKey: string) => void;
|
||||
export declare function optional(): (target: any, propertyKey: string) => void;
|
||||
export declare function defaultVal(value: any): (target: any, propertyKey: string) => void;
|
||||
96
json-mapper-class/dist/decorators.js
vendored
Normal file
96
json-mapper-class/dist/decorators.js
vendored
Normal file
@@ -0,0 +1,96 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.defaultVal = exports.optional = exports.typed = exports.property = exports.serializeTarget = exports.afterSerialize = exports.beforeDeserialize = exports.deserialize = exports.serialize = void 0;
|
||||
const store_1 = require("./store");
|
||||
function serialize(serializer, disallowIgnore = false) {
|
||||
return (target, propertyKey) => {
|
||||
store_1.setStore(target, {
|
||||
key: propertyKey,
|
||||
serializer,
|
||||
disallowIgnoreSerializer: disallowIgnore,
|
||||
});
|
||||
};
|
||||
}
|
||||
exports.serialize = serialize;
|
||||
function deserialize(deserializer, disallowIgnore = false) {
|
||||
return (target, propertyKey) => {
|
||||
store_1.setStore(target, {
|
||||
key: propertyKey,
|
||||
deserializer,
|
||||
disallowIgnoreDeserializer: disallowIgnore,
|
||||
});
|
||||
};
|
||||
}
|
||||
exports.deserialize = deserialize;
|
||||
function beforeDeserialize(beforeDeserializer, disallowIgnore = false) {
|
||||
return (target, propertyKey) => {
|
||||
store_1.setStore(target, {
|
||||
key: propertyKey,
|
||||
beforeDeserializer,
|
||||
disallowIgnoreBeforeDeserializer: disallowIgnore,
|
||||
});
|
||||
};
|
||||
}
|
||||
exports.beforeDeserialize = beforeDeserialize;
|
||||
function afterSerialize(afterSerializer, disallowIgnore = false) {
|
||||
return (target, propertyKey) => {
|
||||
store_1.setStore(target, {
|
||||
key: propertyKey,
|
||||
afterSerializer,
|
||||
disallowIgnoreAfterSerializer: disallowIgnore,
|
||||
});
|
||||
};
|
||||
}
|
||||
exports.afterSerialize = afterSerialize;
|
||||
function serializeTarget() {
|
||||
return (target, propertyKey) => {
|
||||
store_1.setStore(target, {
|
||||
key: propertyKey,
|
||||
serializeTarget: true,
|
||||
});
|
||||
};
|
||||
}
|
||||
exports.serializeTarget = serializeTarget;
|
||||
function property(originalKey, targetClass, isOptional = false) {
|
||||
return (target, propertyKey) => {
|
||||
const config = {
|
||||
originalKey: originalKey || propertyKey,
|
||||
key: propertyKey,
|
||||
};
|
||||
if (targetClass) {
|
||||
config.targetClass = targetClass.prototype.constructor;
|
||||
}
|
||||
if (isOptional) {
|
||||
config.optional = isOptional;
|
||||
}
|
||||
store_1.setStore(target, config);
|
||||
};
|
||||
}
|
||||
exports.property = property;
|
||||
function typed(targetClass) {
|
||||
return (target, propertyKey) => {
|
||||
store_1.setStore(target, {
|
||||
key: propertyKey,
|
||||
targetClass,
|
||||
});
|
||||
};
|
||||
}
|
||||
exports.typed = typed;
|
||||
function optional() {
|
||||
return (target, propertyKey) => {
|
||||
store_1.setStore(target, {
|
||||
key: propertyKey,
|
||||
optional: true,
|
||||
});
|
||||
};
|
||||
}
|
||||
exports.optional = optional;
|
||||
function defaultVal(value) {
|
||||
return (target, propertyKey) => {
|
||||
store_1.setStore(target, {
|
||||
key: propertyKey,
|
||||
default: value,
|
||||
});
|
||||
};
|
||||
}
|
||||
exports.defaultVal = defaultVal;
|
||||
1
json-mapper-class/dist/decorators.js.map
vendored
Normal file
1
json-mapper-class/dist/decorators.js.map
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"decorators.js","sourceRoot":"","sources":["../src/decorators.ts"],"names":[],"mappings":"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"}
|
||||
4
json-mapper-class/dist/index.d.ts
vendored
Normal file
4
json-mapper-class/dist/index.d.ts
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
export * from './to-class';
|
||||
export * from './to-plain';
|
||||
export * from './decorators';
|
||||
export * from './typing';
|
||||
16
json-mapper-class/dist/index.js
vendored
Normal file
16
json-mapper-class/dist/index.js
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
"use strict";
|
||||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
||||
}) : (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
o[k2] = m[k];
|
||||
}));
|
||||
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
||||
for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
__exportStar(require("./to-class"), exports);
|
||||
__exportStar(require("./to-plain"), exports);
|
||||
__exportStar(require("./decorators"), exports);
|
||||
__exportStar(require("./typing"), exports);
|
||||
1
json-mapper-class/dist/index.js.map
vendored
Normal file
1
json-mapper-class/dist/index.js.map
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6CAA2B;AAC3B,6CAA2B;AAC3B,+CAA6B;AAC7B,2CAAyB"}
|
||||
6
json-mapper-class/dist/store.d.ts
vendored
Normal file
6
json-mapper-class/dist/store.d.ts
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
import { StoreItemOptions, StoreItemType } from './typing';
|
||||
declare const store: Map<Function, Map<string, StoreItemType>>;
|
||||
export declare const originalKeyStores: Map<Function, Map<string, StoreItemOptions[]>>;
|
||||
export declare const keyStores: Map<Function, Map<string, StoreItemType>>;
|
||||
export declare const setStore: (target: Function, options: StoreItemOptions) => void;
|
||||
export default store;
|
||||
19
json-mapper-class/dist/store.js
vendored
Normal file
19
json-mapper-class/dist/store.js
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.setStore = exports.keyStores = exports.originalKeyStores = void 0;
|
||||
const store = new Map();
|
||||
exports.originalKeyStores = new Map();
|
||||
exports.keyStores = new Map();
|
||||
exports.setStore = (target, options) => {
|
||||
const { key, ...rest } = options;
|
||||
const storeKey = target.constructor;
|
||||
const targetStore = store.has(storeKey) ? store.get(storeKey) : new Map();
|
||||
let value = targetStore.has(key) ? targetStore.get(key) : {};
|
||||
value = {
|
||||
...value,
|
||||
...rest,
|
||||
};
|
||||
targetStore.set(key, value);
|
||||
store.set(storeKey, targetStore);
|
||||
};
|
||||
exports.default = store;
|
||||
1
json-mapper-class/dist/store.js.map
vendored
Normal file
1
json-mapper-class/dist/store.js.map
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":";;;AAEA,MAAM,KAAK,GAAG,IAAI,GAAG,EAAwC,CAAC;AAEjD,QAAA,iBAAiB,GAAG,IAAI,GAAG,EAA6C,CAAC;AACzE,QAAA,SAAS,GAAG,IAAI,GAAG,EAAwC,CAAC;AAE5D,QAAA,QAAQ,GAAG,CAAC,MAAgB,EAAE,OAAyB,EAAE,EAAE;IACtE,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IACjC,oCAAoC;IACpC,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC;IACpC,sDAAsD;IACtD,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAyB,CAAC;IAEjG,iEAAiE;IACjE,IAAI,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7D,KAAK,GAAG;QACN,GAAG,KAAK;QACR,GAAG,IAAI;KACR,CAAC;IAEF,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC5B,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;AACnC,CAAC,CAAC;AAEF,kBAAe,KAAK,CAAC"}
|
||||
4
json-mapper-class/dist/to-class.d.ts
vendored
Normal file
4
json-mapper-class/dist/to-class.d.ts
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
import { JosnType, BasicClass, ToClassOptions } from './typing';
|
||||
export declare const arrayItemToClass: <T>(arrayVal: any[], Clazz: BasicClass<T>, options: ToClassOptions) => any;
|
||||
export declare const toClasses: <T>(rawJson: JosnType[], Clazz: BasicClass<T>, options?: ToClassOptions) => T[];
|
||||
export declare const toClass: <T>(rawJson: JosnType, Clazz: BasicClass<T>, options?: ToClassOptions) => T;
|
||||
61
json-mapper-class/dist/to-class.js
vendored
Normal file
61
json-mapper-class/dist/to-class.js
vendored
Normal file
@@ -0,0 +1,61 @@
|
||||
"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);
|
||||
};
|
||||
1
json-mapper-class/dist/to-class.js.map
vendored
Normal file
1
json-mapper-class/dist/to-class.js.map
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"to-class.js","sourceRoot":"","sources":["../src/to-class.ts"],"names":[],"mappings":"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"}
|
||||
4
json-mapper-class/dist/to-plain.d.ts
vendored
Normal file
4
json-mapper-class/dist/to-plain.d.ts
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
import { JosnType, BasicClass, ToPlainOptions } from './typing';
|
||||
export declare const arrayItemToObject: <T>(arrayVal: any[], Clazz: BasicClass<T>, options: ToPlainOptions) => any;
|
||||
export declare const toPlains: <T>(instances: (JosnType | T)[], Clazz: BasicClass<T>, options?: ToPlainOptions) => any[];
|
||||
export declare const toPlain: <T>(instance: JosnType | T, Clazz: BasicClass<T>, options?: ToPlainOptions) => any;
|
||||
49
json-mapper-class/dist/to-plain.js
vendored
Normal file
49
json-mapper-class/dist/to-plain.js
vendored
Normal file
@@ -0,0 +1,49 @@
|
||||
"use strict";
|
||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.toPlain = exports.toPlains = exports.arrayItemToObject = void 0;
|
||||
const isarray_1 = __importDefault(require("isarray"));
|
||||
const utils_1 = require("./utils");
|
||||
exports.arrayItemToObject = (arrayVal, Clazz, options) => {
|
||||
return arrayVal.map((v) => isarray_1.default(v) ? exports.arrayItemToObject(v, Clazz, options) : classToObject(v, Clazz, options));
|
||||
};
|
||||
const classToObject = (instance, Clazz, options) => {
|
||||
const obj = {};
|
||||
const keyStore = utils_1.getKeyStore(Clazz);
|
||||
keyStore.forEach((propertiesOption, key) => {
|
||||
const isValueNotExist = options.distinguishNullAndUndefined ? utils_1.isUndefined : utils_1.isNullOrUndefined;
|
||||
const instanceValue = isValueNotExist(instance[key]) ? propertiesOption.default : instance[key];
|
||||
const { originalKey, afterSerializer, serializer, targetClass, optional } = propertiesOption;
|
||||
const disallowIgnoreSerializer = propertiesOption.disallowIgnoreSerializer || !options.ignoreSerializer;
|
||||
const disallowIgnoreAfterSerializer = propertiesOption.disallowIgnoreAfterSerializer || !options.ignoreAfterSerializer;
|
||||
if (isValueNotExist(instanceValue)) {
|
||||
if (!optional) {
|
||||
throw new Error(`Property '${Clazz.name}.${key}' not found`);
|
||||
}
|
||||
return;
|
||||
}
|
||||
let value = serializer && disallowIgnoreSerializer ? serializer(instanceValue, instance, obj, options) : instanceValue;
|
||||
if (value && targetClass) {
|
||||
if (isarray_1.default(value)) {
|
||||
value = exports.arrayItemToObject(value, targetClass, options);
|
||||
}
|
||||
else {
|
||||
value = exports.toPlain(value, targetClass, options);
|
||||
}
|
||||
}
|
||||
obj[originalKey] =
|
||||
afterSerializer && disallowIgnoreAfterSerializer ? afterSerializer(value, instance, obj, options) : value;
|
||||
});
|
||||
return obj;
|
||||
};
|
||||
exports.toPlains = (instances, Clazz, options = {}) => {
|
||||
if (!isarray_1.default(instances)) {
|
||||
throw new Error(`${Clazz} instances must be an array`);
|
||||
}
|
||||
return instances.map((item) => classToObject(item, Clazz, options));
|
||||
};
|
||||
exports.toPlain = (instance, Clazz, options = {}) => {
|
||||
return classToObject(instance, Clazz, options);
|
||||
};
|
||||
1
json-mapper-class/dist/to-plain.js.map
vendored
Normal file
1
json-mapper-class/dist/to-plain.js.map
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"to-plain.js","sourceRoot":"","sources":["../src/to-plain.ts"],"names":[],"mappings":"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"}
|
||||
35
json-mapper-class/dist/typing.d.ts
vendored
Normal file
35
json-mapper-class/dist/typing.d.ts
vendored
Normal file
@@ -0,0 +1,35 @@
|
||||
export declare type StoreItemType = {
|
||||
originalKey?: string;
|
||||
targetClass?: BasicClass;
|
||||
serializer?: (value: any, instance: any, origin: any, options: ToPlainOptions) => any;
|
||||
disallowIgnoreSerializer?: boolean;
|
||||
afterSerializer?: (value: any, instance: any, origin: any, options: ToPlainOptions) => any;
|
||||
disallowIgnoreAfterSerializer?: boolean;
|
||||
deserializer?: (value: any, instance: any, origin: any, options: ToClassOptions) => any;
|
||||
disallowIgnoreDeserializer?: boolean;
|
||||
beforeDeserializer?: (value: any, instance: any, origin: any, options: ToClassOptions) => any;
|
||||
disallowIgnoreBeforeDeserializer?: boolean;
|
||||
default?: any;
|
||||
autoTypeDetection?: boolean;
|
||||
optional?: boolean;
|
||||
serializeTarget?: boolean;
|
||||
};
|
||||
export declare type StoreItemOptions = StoreItemType & {
|
||||
key: string;
|
||||
};
|
||||
export declare type BasicClass<T = any> = {
|
||||
new (...args: any[]): T;
|
||||
};
|
||||
export declare type JosnType = {
|
||||
[key: string]: any;
|
||||
};
|
||||
export interface ToClassOptions {
|
||||
ignoreDeserializer?: boolean;
|
||||
ignoreBeforeDeserializer?: boolean;
|
||||
distinguishNullAndUndefined?: boolean;
|
||||
}
|
||||
export interface ToPlainOptions {
|
||||
ignoreSerializer?: boolean;
|
||||
ignoreAfterSerializer?: boolean;
|
||||
distinguishNullAndUndefined?: boolean;
|
||||
}
|
||||
2
json-mapper-class/dist/typing.js
vendored
Normal file
2
json-mapper-class/dist/typing.js
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
1
json-mapper-class/dist/typing.js.map
vendored
Normal file
1
json-mapper-class/dist/typing.js.map
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"typing.js","sourceRoot":"","sources":["../src/typing.ts"],"names":[],"mappings":""}
|
||||
6
json-mapper-class/dist/utils.d.ts
vendored
Normal file
6
json-mapper-class/dist/utils.d.ts
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
import { StoreItemOptions, StoreItemType, BasicClass } from './typing';
|
||||
export declare const isNull: (val: any) => boolean;
|
||||
export declare const isUndefined: (val: any) => boolean;
|
||||
export declare const isNullOrUndefined: (val: any) => boolean;
|
||||
export declare const getOriginalKeyStore: <T>(Clazz: BasicClass<T>) => Map<string, StoreItemOptions[]>;
|
||||
export declare const getKeyStore: <T>(Clazz: BasicClass<T>) => Map<string, StoreItemType>;
|
||||
82
json-mapper-class/dist/utils.js
vendored
Normal file
82
json-mapper-class/dist/utils.js
vendored
Normal file
@@ -0,0 +1,82 @@
|
||||
"use strict";
|
||||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
||||
}) : (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
o[k2] = m[k];
|
||||
}));
|
||||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
||||
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
||||
}) : function(o, v) {
|
||||
o["default"] = v;
|
||||
});
|
||||
var __importStar = (this && this.__importStar) || function (mod) {
|
||||
if (mod && mod.__esModule) return mod;
|
||||
var result = {};
|
||||
if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
||||
__setModuleDefault(result, mod);
|
||||
return result;
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.getKeyStore = exports.getOriginalKeyStore = exports.isNullOrUndefined = exports.isUndefined = exports.isNull = void 0;
|
||||
const store_1 = __importStar(require("./store"));
|
||||
exports.isNull = (val) => val === null;
|
||||
exports.isUndefined = (val) => val === undefined;
|
||||
exports.isNullOrUndefined = (val) => exports.isNull(val) || exports.isUndefined(val);
|
||||
exports.getOriginalKeyStore = (Clazz) => {
|
||||
let curLayer = Clazz;
|
||||
const cacheOriginalKeyStore = store_1.originalKeyStores.get(curLayer);
|
||||
if (cacheOriginalKeyStore) {
|
||||
return cacheOriginalKeyStore;
|
||||
}
|
||||
const originalKeyStore = new Map();
|
||||
while (curLayer.name && curLayer.prototype) {
|
||||
const { constructor } = curLayer.prototype;
|
||||
const targetStore = store_1.default.get(constructor);
|
||||
if (targetStore) {
|
||||
targetStore.forEach((storeItem, key) => {
|
||||
const item = {
|
||||
key,
|
||||
...storeItem,
|
||||
};
|
||||
if (!originalKeyStore.has(storeItem.originalKey)) {
|
||||
originalKeyStore.set(storeItem.originalKey, [item]);
|
||||
}
|
||||
else {
|
||||
const exists = originalKeyStore.get(storeItem.originalKey);
|
||||
if (!exists.find((exist) => exist.key === key)) {
|
||||
originalKeyStore.set(storeItem.originalKey, [...originalKeyStore.get(storeItem.originalKey), item]);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
curLayer = Object.getPrototypeOf(constructor);
|
||||
}
|
||||
store_1.originalKeyStores.set(Clazz, originalKeyStore);
|
||||
return originalKeyStore;
|
||||
};
|
||||
exports.getKeyStore = (Clazz) => {
|
||||
const cacheKeyStore = store_1.keyStores.get(Clazz);
|
||||
if (cacheKeyStore) {
|
||||
return cacheKeyStore;
|
||||
}
|
||||
const keyStore = new Map();
|
||||
const originalKeyStore = exports.getOriginalKeyStore(Clazz);
|
||||
originalKeyStore.forEach(storeItems => {
|
||||
const [firstStoreItem] = storeItems;
|
||||
if (storeItems.length === 1) {
|
||||
keyStore.set(firstStoreItem.key, firstStoreItem);
|
||||
}
|
||||
else {
|
||||
const hasStoreItems = storeItems.filter(storeItem => storeItem.serializeTarget);
|
||||
if (hasStoreItems.length !== 1) {
|
||||
throw new Error(`Only one of keys(${storeItems.map(storeItem => storeItem.key).join(', ')}) in ${Clazz.name} can contain a serializeTarget when use toPlain`);
|
||||
}
|
||||
const hasStoreItem = hasStoreItems[0];
|
||||
keyStore.set(hasStoreItem.key, hasStoreItem);
|
||||
}
|
||||
});
|
||||
store_1.keyStores.set(Clazz, keyStore);
|
||||
return keyStore;
|
||||
};
|
||||
1
json-mapper-class/dist/utils.js.map
vendored
Normal file
1
json-mapper-class/dist/utils.js.map
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
|
||||
Reference in New Issue
Block a user