diff --git a/src/util/quads.ts b/src/util/quads.ts index a8c5717331..2bc17e42fe 100644 --- a/src/util/quads.ts +++ b/src/util/quads.ts @@ -110,6 +110,7 @@ export function serialize2quads(obj: RecordForQuad, config: QuadSerializationCon guard(isObjectOrArray(obj), 'cannot serialize non-object to rdf!') guard(!Array.isArray(obj), 'cannot serialize arrays (must wrap in object)!') + store = new Set() const quads: Quad[] = [] serializeObject(obj, quads, useConfig) return writer.quadsToString(quads) @@ -148,7 +149,7 @@ export function graph2quads) { for(const [index, element] of value.entries()) { - if(isObjectOrArray(element)) { + if(element !== null && element !== undefined && isObjectOrArray(element)) { const context= retrieveContext(config.context, obj) quads.push(quad( namedNode(domain + config.getId(obj, context)), @@ -200,6 +201,9 @@ function processObjectEntry(key: string, value: unknown, obj: DataForQuad, quads if(config.ignore(key, value)) { return } + if(guardCycle(value)) { + return + } if(isObjectOrArray(value)) { if(Array.isArray(value)) { processArrayEntries(key, value, obj, quads, config) @@ -211,8 +215,24 @@ function processObjectEntry(key: string, value: unknown, obj: DataForQuad, quads } } +let store = new Set() + +function guardCycle(obj: unknown) { + // @ts-expect-error we do not care about the type here + if(isObjectOrArray(obj) && 'id' in obj) { + if(store.has(obj.id)) { + return true + } + store.add(obj.id) + } + return false +} + function serializeObject(obj: DataForQuad | undefined | null, quads: Quad[], config: Required): void { - if(obj === undefined || obj === null) { + if(obj === null || obj === undefined) { + return + } + if(guardCycle(obj)) { return } if(obj instanceof Map) {