@compodoc/compodoc
Version:
The missing documentation tool for your Angular application
119 lines (109 loc) • 4.16 kB
text/typescript
import * as _ from 'lodash';
import * as path from 'path';
import { logger } from '../../utils/logger';
import FileEngine from './file.engine';
const $: any = require('cheerio');
class ComponentsTreeEngine {
private components: any[] = [];
private componentsForTree: any[] = [];
private static instance: ComponentsTreeEngine;
private constructor() {}
public static getInstance() {
if (!ComponentsTreeEngine.instance) {
ComponentsTreeEngine.instance = new ComponentsTreeEngine();
}
return ComponentsTreeEngine.instance;
}
public addComponent(component) {
this.components.push(component);
}
private readTemplates() {
return new Promise((resolve, reject) => {
let i = 0;
let len = this.componentsForTree.length;
let loop = () => {
if (i <= len - 1) {
if (this.componentsForTree[i].templateUrl) {
let filePath =
process.cwd() +
path.sep +
path.dirname(this.componentsForTree[i].file) +
path.sep +
this.componentsForTree[i].templateUrl;
FileEngine.get(filePath).then(
templateData => {
this.componentsForTree[i].templateData = templateData;
i++;
loop();
},
e => {
logger.error(e);
reject();
}
);
} else {
this.componentsForTree[i].templateData = this.componentsForTree[i].template;
i++;
loop();
}
} else {
resolve();
}
};
loop();
});
}
private findChildrenAndParents() {
return new Promise((resolve, reject) => {
_.forEach(this.componentsForTree, component => {
let $component = $(component.templateData);
_.forEach(this.componentsForTree, componentToFind => {
if ($component.find(componentToFind.selector).length > 0) {
console.log(componentToFind.name + ' found in ' + component.name);
component.children.push(componentToFind.name);
}
});
});
resolve();
});
}
private createTreesForComponents() {
return new Promise((resolve, reject) => {
_.forEach(this.components, component => {
let _component = {
name: component.name,
file: component.file,
selector: component.selector,
children: [],
template: '',
templateUrl: ''
};
if (typeof component.template !== 'undefined') {
_component.template = component.template;
}
if (component.templateUrl.length > 0) {
_component.templateUrl = component.templateUrl[0];
}
this.componentsForTree.push(_component);
});
this.readTemplates().then(
() => {
this.findChildrenAndParents().then(
() => {
console.log('this.componentsForTree: ', this.componentsForTree);
resolve();
},
e => {
logger.error(e);
reject();
}
);
},
e => {
logger.error(e);
}
);
});
}
}
export default ComponentsTreeEngine.getInstance();