You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gristlabs_grist-core/app/server/lib/FileParserElement.ts

50 lines
1.7 KiB

import {PluginInstance} from 'app/common/PluginInstance';
import {ParseFileAPI} from 'app/plugin/FileParserAPI';
import {checkers} from 'app/plugin/TypeCheckers';
import {FileParser} from 'app/plugin/PluginManifest';
import * as path from 'path';
/**
* Encapsulates together a file parse contribution with its plugin instance and callable stubs for
* `parseFile` implementation provided by the plugin.
*
* Implements as well a `getMatching` static method to get all file parsers matching a filename from
* the list of plugin instances.
*
*/
export class FileParserElement {
/**
* Get all file parser that matches fileName from the list of plugins instances.
*/
public static getMatching(pluginInstances: PluginInstance[], fileName: string): FileParserElement[] {
const fileParserElements: FileParserElement[] = [];
for (const plugin of pluginInstances) {
const fileParsers = plugin.definition.manifest.contributions.fileParsers;
if (fileParsers) {
for (const fileParser of fileParsers) {
if (matchFileParser(fileParser, fileName)) {
fileParserElements.push(new FileParserElement(plugin, fileParser));
}
}
}
}
return fileParserElements;
}
public parseFileStub: ParseFileAPI;
private constructor(public plugin: PluginInstance, public fileParser: FileParser) {
this.parseFileStub = plugin.getStub<ParseFileAPI>(fileParser.parseFile, checkers.ParseFileAPI);
}
}
function matchFileParser(fileParser: FileParser, fileName: string): boolean {
const ext = path.extname(fileName).slice(1),
fileExtensions = fileParser.fileExtensions;
return fileExtensions && fileExtensions.includes(ext);
}