@dipscope/type-manager
Version:
Transform JSON strings or plain objects into JS class instances.
72 lines • 3.13 kB
JavaScript
var JsonPathReferenceHandler = (function () {
function JsonPathReferenceHandler() {
this.arrayKeyRegExp = new RegExp('\\[\\\'?([^\\\'\\[\\]]+)\\\'?\\]', 'g');
}
JsonPathReferenceHandler.prototype.define = function (serializerContext, referenceKey, referenceValueGetter) {
var referenceMap = serializerContext.referenceMap;
var referencePath = referenceMap.get(referenceKey);
if (referencePath === undefined) {
referenceMap.set(referenceKey, serializerContext.jsonPath);
var value = referenceValueGetter();
return value;
}
return { $ref: referencePath };
};
JsonPathReferenceHandler.prototype.restore = function (serializerContext, referenceKey, referenceValueGetter) {
var referenceMap = serializerContext.referenceMap;
var referenceTarget = this.defineReferenceTarget(serializerContext, referenceKey);
var referenceValue = referenceMap.get(referenceTarget);
if (referenceValue === undefined) {
referenceMap.set(referenceTarget, referenceTarget);
var value = referenceValueGetter();
referenceMap.set(referenceTarget, value);
serializerContext.resolveReferenceCallbacks(referenceTarget);
return value;
}
if (referenceTarget !== referenceKey) {
serializerContext.pushReferenceCallback(referenceTarget, function () {
serializerContext.resolveReferenceCallbacks(referenceKey);
});
}
if (referenceTarget === referenceValue) {
serializerContext.registerReferenceCallback(referenceTarget);
return undefined;
}
return referenceValue;
};
JsonPathReferenceHandler.prototype.defineReferenceTarget = function (serializerContext, referenceKey) {
var $ = serializerContext.$;
var referencePath = referenceKey.$ref;
if (typeof referencePath !== 'string' || typeof $ !== 'object') {
return referenceKey;
}
if (referencePath === '$') {
return $;
}
var referencePathArray = this.convertReferencePathToArray(referencePath);
referencePathArray.shift();
var referenceTarget = $;
for (var i = 0; i < referencePathArray.length; i++) {
referenceTarget = referenceTarget[referencePathArray[i]];
}
return referenceTarget;
};
JsonPathReferenceHandler.prototype.convertReferencePathToArray = function (referencePath) {
var array = new Array();
var parts = referencePath.split('.');
for (var i = 0; i < parts.length; i++) {
var part = parts[i];
var keys = part.split(this.arrayKeyRegExp);
for (var j = 0; j < keys.length; j++) {
var key = keys[j];
if (key.length > 0) {
array.push(key);
}
}
}
return array;
};
return JsonPathReferenceHandler;
}());
export { JsonPathReferenceHandler };
//# sourceMappingURL=json-path-reference-handler.js.map