UNPKG

@rr0/data

Version:
59 lines (58 loc) 2.01 kB
import { globSync } from "glob"; import { FileContents } from "@javarome/fileutil"; /** * Fetch RR0 data from JSON files. */ export class AllDataService { /** * * @param factories The factories to instantiate different RR0Data types. */ constructor(factories) { this.factories = factories; this.pathToData = new Map(); } async getFromDir(dirName, types, fileNames = this.factories.reduce((allFileNames, factory) => Array.from(new Set(allFileNames.concat(factory.fileNames))), [])) { const key = dirName + "$" + fileNames.join("$"); let dataList = this.pathToData.get(key); if (dataList === undefined) { dataList = await this.readAll(dirName, fileNames); this.pathToData.set(key, dataList); } return dataList.filter(data => types.includes(data.type)); } async read(fileName) { const dataFile = FileContents.read(fileName, "utf-8"); let data; for (let i = 0; !data && i < this.factories.length; i++) { const factory = this.factories[i]; try { data = factory.createFromFile(dataFile); } catch (e) { console.warn("Could not create a", factory.type, "from", dataFile, "because of", e); } } return data; } async readAll(dirName, fileNames) { const dataList = []; const p = `${dirName}/*(${fileNames.join("|")})`; const files = globSync(p); for (const file of files) { try { const dataFile = await this.read(file); if (dataFile) { dataList.push(dataFile); } else { throw new Error("No factory to handle " + dataFile.name); } } catch (e) { console.warn(`Could not create data from ${file}`, e); } } return dataList; } }