UNPKG

@dipscope/type-manager

Version:

Transform JSON strings or plain objects into JS class instances.

72 lines 3.13 kB
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