eslint-plugin-obsidian
Version:
ESLint rules for Obsidian
82 lines • 3.29 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.SubgraphResolver = void 0;
const ast_1 = require("../../utils/ast");
const classFile_1 = require("../../dto/classFile");
const file_1 = require("../../dto/file");
const filter_1 = require("../../utils/filter");
class SubgraphResolver {
constructor(fileReader, classResolver) {
this.fileReader = fileReader;
this.classResolver = classResolver;
}
resolve(clazz) {
return [
...this.getImportedGraphs(clazz),
...this.getLocalGraphs(clazz),
...this.getExtendedGraphs(clazz),
]
.filter(filter_1.nonNull)
.flatMap((g) => [g, ...this.resolve(g)]);
}
getImportedGraphs(clazz) {
const subgraphs = this.getSubgraphsPropertyFromGraphDecorator(clazz);
return this.getImportedSubgraphClasses(clazz, subgraphs);
}
getImportedSubgraphClasses(clazz, subgraphs) {
if (!subgraphs)
return [];
const subgraphNames = this.getSubgraphNamesFromDecoratorProperty(subgraphs);
const classes = [];
clazz.imports.forEach(($import) => {
subgraphNames.forEach((subgraphName) => {
if ($import.includes(subgraphName)) {
classes.push(...this.fileReader.read(clazz.path, $import.path).toClassWithImports());
}
});
});
return classes;
}
getLocalGraphs(clazz) {
const subgraphs = this.getSubgraphsPropertyFromGraphDecorator(clazz);
return this.getLocalSubgraphClasses(subgraphs, clazz);
}
getExtendedGraphs(clazz) {
if (!clazz.superClass || clazz.superClass === 'ObjectGraph')
return [];
return [this.classResolver.resolve(clazz.superClass, clazz)];
}
getSubgraphsPropertyFromGraphDecorator({ clazz }) {
if (clazz.isAbstract)
return undefined;
const graphDecorator = clazz.requireDecoratorIgnoreCase('Graph');
return graphDecorator.getProperty('subgraphs');
}
getLocalSubgraphClasses(subgraphs, clazz) {
if (!subgraphs)
return [];
const allSubgraphs = this.getSubgraphNamesFromDecoratorProperty(subgraphs);
const localGraphNames = this.getLocalGraphNames(allSubgraphs, clazz);
return this.createLocalGraphClasses(clazz, localGraphNames);
}
createLocalGraphClasses({ clazz, imports, path }, localGraphNames) {
if (localGraphNames.length === 0)
return [];
const parent = new file_1.File((0, ast_1.requireProgram)(clazz.node), path);
return localGraphNames.map((localGraphName) => {
return new classFile_1.ClassFile(parent.requireGraph(localGraphName), imports, path);
});
}
getSubgraphNamesFromDecoratorProperty(subgraphs) {
return (0, ast_1.mapArrayExpression)(subgraphs.getValue(), (el) => el.name);
}
getLocalGraphNames(subgraphs, { imports }) {
return subgraphs.filter((subgraph) => {
return imports.some(($import) => {
return $import.includes(subgraph);
}) === false;
});
}
}
exports.SubgraphResolver = SubgraphResolver;
//# sourceMappingURL=subgraphResolver.js.map