/* eslint-disable @typescript-eslint/naming-convention */ import * as RmlParser from '@comake/rmlmapper-js'; import type { NodeObject } from 'jsonld'; import jsonld from 'jsonld'; import type { JSONValue, OrArray } from '../util/Types'; export interface MapperArgs { functions?: Record any>; } export class Mapper { private readonly functions?: Record any>; public constructor(args?: MapperArgs) { this.functions = args?.functions; } public async apply( data: JSONValue, mapping: OrArray, frame: Record ): Promise { const result = await this.doMapping(data, mapping); const frameResult = await this.frame(result, frame); return frameResult; } private async doMapping(data: JSONValue, mapping: OrArray): Promise { const sources = { 'input.json': JSON.stringify(data) }; const options = { functions: this.functions }; const mappingNodeObject = Array.isArray(mapping) ? { '@graph': mapping } : mapping; return await RmlParser.parseJsonLd(mappingNodeObject, sources, options) as NodeObject[]; } private async frame( jsonldDoc: any[], overrideFrame: Record ): Promise { let frame: Record = { '@context': {}, '@embed': '@always' }; frame = { ...frame, ...overrideFrame, '@context': { ...frame['@context'], ...overrideFrame?.['@context'] } }; return await jsonld.frame(jsonldDoc, frame); } }