UNPKG

@loom-io/converter

Version:

Combines loom-io converters to convert from or to files

73 lines (72 loc) 2.23 kB
import { NoValidFileConverterException } from "./exceptions.js"; const defaultOptions = { failOnNoConverter: true, }; export class CombinedConverter { converters; config; constructor(converters, options = {}) { this.config = { ...defaultOptions, ...options, }; this.converters = Array.from(new Set(Array.isArray(converters) ? converters : [converters])); } converterSetAction(action, ...converters) { const convertersSet = new Set(this.converters); converters.forEach((converter) => { convertersSet[action](converter); }); this.converters = Array.from(convertersSet); } set options(options) { this.config = options; } get options() { return this.config; } addConverter(converter, ...converters) { this.converterSetAction("add", converter, ...converters); } removeConverter(converter, ...converters) { this.converterSetAction("delete", converter, ...converters); } async getConverter(file) { try { return await Promise.any(this.converters.map(async (converter) => { if (await converter.verify(file)) { return Promise.resolve(converter); } return Promise.reject(); })); // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (error) { if (this.config.failOnNoConverter) { throw new NoValidFileConverterException(file.name); } } } async verify(file) { try { await this.getConverter(file); return true; // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (error) { return false; } } async unify(file, content) { const converter = await this.getConverter(file); if (!converter) return; await converter.unify(file, content); } async parse(file) { const converter = await this.getConverter(file); if (!converter) return; return converter.parse(file); } }