BaseXmlTransformer.ts
1 import { TransformerProcess } from './TransformerProcess' 2 import { IDatapackEngine } from '../engine/IDatapackEngine' 3 import aigle from 'aigle' 4 import { XMLParser } from 'fast-xml-parser' 5 import * as fs from 'fs/promises' 6 import pkgDir from 'pkg-dir' 7 8 const rootDirectory = pkgDir.sync( __dirname ) 9 10 export abstract class BaseXmlTransformer implements TransformerProcess { 11 files: { [ key: string ]: string } | Array<any> 12 parserOptions: any 13 lastFileProcessed: string 14 private readonly parser: XMLParser 15 16 constructor( files: { [ key: string ]: string } | Array<any>, parserOptions : any ) { 17 this.files = files 18 this.parserOptions = parserOptions 19 this.parser = new XMLParser( parserOptions ) 20 } 21 22 async startProcess( engine: IDatapackEngine ): Promise<void> { 23 await aigle.resolve( this.getFiles() ).eachSeries( async ( fileName: string, tableName: string ) => { 24 this.lastFileProcessed = fileName 25 let xmlData = await fs.readFile( `${rootDirectory}/${fileName}` ) 26 let parsedData = await this.getParser().parse( xmlData.toString() ) 27 28 return engine.insertMany( this.getQuery( tableName, fileName ), this.transformData( parsedData, fileName ) ) 29 } ) 30 } 31 32 abstract transformData( parsedData: any, fileName: string ) : Array<Array<any>> 33 abstract getQuery( tableName: string, fileName: string ) : string 34 35 getFiles() { 36 return this.files 37 } 38 39 getLastProcessedOperation() { 40 return this.lastFileProcessed 41 } 42 43 abstract getName() : string 44 45 getParser() : XMLParser { 46 return this.parser 47 } 48 }