/ cli / source / datapack / helpers / BaseXmlTransformer.ts
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  }