@dipscope/type-manager
Version:
Transform JSON strings or plain objects into JS class instances.
176 lines • 7.98 kB
JavaScript
export class SerializerContext {
constructor($, referenceMap, referenceCallbackMap, parentSerializerContext, jsonPathKey, typeState, genericMetadatas, propertyState, referenceValueSetter) {
this.$ = $;
this.referenceMap = referenceMap,
this.referenceCallbackMap = referenceCallbackMap;
this.parentSerializerContext = parentSerializerContext;
this.jsonPathKey = jsonPathKey;
this.typeState = typeState;
this.genericMetadatas = genericMetadatas;
this.propertyState = propertyState;
this.referenceValueSetter = referenceValueSetter;
return;
}
get jsonPath() {
const jsonPathKey = this.jsonPathKey;
const parentSerializerContext = this.parentSerializerContext;
if (parentSerializerContext === undefined) {
return `${jsonPathKey}`;
}
if (typeof jsonPathKey === 'number') {
return `${parentSerializerContext.jsonPath}[${jsonPathKey}]`;
}
return `${parentSerializerContext.jsonPath}['${jsonPathKey}']`;
}
get serializedNullValue() {
if (this.preserveNull) {
return null;
}
return this.serializedDefaultValue;
}
get serializedDefaultValue() {
var _a, _b;
if (this.useDefaultValue) {
return (_b = (_a = this.propertyState) === null || _a === void 0 ? void 0 : _a.serializedDefaultValueResolver()) !== null && _b !== void 0 ? _b : this.typeState.serializedDefaultValueResolver();
}
return undefined;
}
get deserializedNullValue() {
if (this.preserveNull) {
return null;
}
return this.deserializedDefaultValue;
}
get deserializedDefaultValue() {
var _a, _b;
if (this.useDefaultValue) {
return (_b = (_a = this.propertyState) === null || _a === void 0 ? void 0 : _a.deserializedDefaultValueResolver()) !== null && _b !== void 0 ? _b : this.typeState.deserializedDefaultValueResolver();
}
return undefined;
}
get discriminant() {
return this.typeState.discriminant;
}
get discriminator() {
return this.typeState.discriminator;
}
get factory() {
return this.typeState.factory;
}
get injector() {
return this.typeState.injector;
}
get logger() {
return this.typeState.logger;
}
get polymorphic() {
return this.typeState.polymorphic;
}
get preserveDiscriminator() {
return this.typeState.preserveDiscriminator;
}
get referenceHandler() {
var _a, _b;
return (_b = (_a = this.propertyState) === null || _a === void 0 ? void 0 : _a.referenceHandler) !== null && _b !== void 0 ? _b : this.typeState.referenceHandler;
}
get serializer() {
var _a, _b;
return (_b = (_a = this.propertyState) === null || _a === void 0 ? void 0 : _a.serializer) !== null && _b !== void 0 ? _b : this.typeState.serializer;
}
get typeMetadata() {
return this.typeState.typeMetadata;
}
get preserveNull() {
var _a, _b;
return (_b = (_a = this.propertyState) === null || _a === void 0 ? void 0 : _a.preserveNull) !== null && _b !== void 0 ? _b : this.typeState.preserveNull;
}
get useDefaultValue() {
var _a, _b;
return (_b = (_a = this.propertyState) === null || _a === void 0 ? void 0 : _a.useDefaultValue) !== null && _b !== void 0 ? _b : this.typeState.useDefaultValue;
}
get useImplicitConversion() {
var _a, _b;
return (_b = (_a = this.propertyState) === null || _a === void 0 ? void 0 : _a.useImplicitConversion) !== null && _b !== void 0 ? _b : this.typeState.useImplicitConversion;
}
serialize(x) {
return this.serializer.serialize(x, this);
}
deserialize(x) {
return this.serializer.deserialize(x, this);
}
defineReference(referenceKey, referenceValueGetter) {
return this.referenceHandler.define(this, referenceKey, referenceValueGetter);
}
restoreReference(referenceKey, referenceValueGetter) {
return this.referenceHandler.restore(this, referenceKey, referenceValueGetter);
}
registerReferenceCallback(referenceKey) {
const referenceValueSetter = this.referenceValueSetter;
if (referenceValueSetter === undefined) {
return;
}
const jsonPathKey = this.jsonPathKey;
this.pushReferenceCallback(referenceKey, () => {
const referenceValue = this.referenceMap.get(referenceKey);
referenceValueSetter(referenceValue, jsonPathKey);
});
return;
}
pushReferenceCallback(referenceKey, referenceCallback) {
let referenceCallbacks = this.referenceCallbackMap.get(referenceKey);
if (referenceCallbacks === undefined) {
referenceCallbacks = new Array();
this.referenceCallbackMap.set(referenceKey, referenceCallbacks);
}
referenceCallbacks.push(referenceCallback);
return;
}
resolveReferenceCallbacks(referenceKey) {
const referenceCallbacks = this.referenceCallbackMap.get(referenceKey);
if (referenceCallbacks === undefined) {
return;
}
for (let i = 0; i < referenceCallbacks.length; i++) {
referenceCallbacks[i]();
}
return;
}
defineChildSerializerContext() {
return new SerializerContext(this.$, this.referenceMap, this.referenceCallbackMap, this, this.jsonPathKey, this.typeState, this.genericMetadatas, this.propertyState, this.referenceValueSetter);
}
defineGenericSerializerContext(genericIndex) {
const genericMetadata = this.genericMetadatas[genericIndex];
if (genericMetadata === undefined) {
throw new Error(`${this.jsonPath}: cannot define generic metadata for index ${genericIndex}. This is usually caused by invalid configuration.`);
}
const typeMetadata = genericMetadata[0];
const genericMetadatas = genericMetadata[1];
return new SerializerContext(this.$, this.referenceMap, this.referenceCallbackMap, this.parentSerializerContext, this.jsonPath, typeMetadata.typeState, genericMetadatas, undefined, this.referenceValueSetter);
}
definePolymorphicSerializerContext(x) {
if (typeof x === 'function') {
return this.definePolymorphicSerializerContextByTypeFn(x);
}
return this.definePolymorphicSerializerContextByDiscriminant(x);
}
definePolymorphicSerializerContextByTypeFn(x) {
const typeFn = x;
const typeMetadata = this.typeState.typeMetadataMap.get(typeFn);
if (typeMetadata === undefined) {
throw new Error(`${this.jsonPath}: cannot define discriminant of polymorphic type. This is usually caused by invalid configuration.`);
}
return new SerializerContext(this.$, this.referenceMap, this.referenceCallbackMap, this.parentSerializerContext, this.jsonPathKey, typeMetadata.typeState, this.genericMetadatas, this.propertyState, this.referenceValueSetter);
}
definePolymorphicSerializerContextByDiscriminant(x) {
const record = x;
const childTypeMetadatas = this.typeState.childTypeMetadatas;
for (let i = 0; i < childTypeMetadatas.length; i++) {
const childTypeState = childTypeMetadatas[i].typeState;
if (record[childTypeState.discriminator] === childTypeState.discriminant) {
return new SerializerContext(this.$, this.referenceMap, this.referenceCallbackMap, this.parentSerializerContext, this.jsonPathKey, childTypeState, this.genericMetadatas, this.propertyState, this.referenceValueSetter);
}
}
throw new Error(`${this.jsonPath}: cannot define discriminant of polymorphic type. This is usually caused by invalid configuration.`);
}
}
//# sourceMappingURL=serializer-context.js.map