UNPKG

compodoc

Version:

The missing documentation tool for your Angular application

202 lines (189 loc) 7.84 kB
import * as _ from 'lodash'; import * as util from 'util'; import * as fs from 'fs-extra'; export let RouterParser = (function() { var routes = [], modules = [], modulesTree, rootModule, modulesWithRoutes = []; return { addRoute: function(route) { routes.push(route); routes = _.sortBy(_.uniqWith(routes, _.isEqual), ['name']); }, addModuleWithRoutes: function(moduleName, moduleImports) { modulesWithRoutes.push({ name: moduleName, importsNode: moduleImports }); modulesWithRoutes = _.sortBy(_.uniqWith(modulesWithRoutes, _.isEqual), ['name']); }, addModule: function(moduleName: string, moduleImports) { modules.push({ name: moduleName, importsNode: moduleImports }); modules = _.sortBy(_.uniqWith(modules, _.isEqual), ['name']); }, setRootModule: function(module: string) { rootModule = module; }, printRoutes: function() { console.log(''); console.log('printRoutes: '); console.log(routes); }, printModulesRoutes: function() { console.log(''); console.log('modulesWithRoutes: '); console.log(modulesWithRoutes); }, hasRouterModuleInImports: function(imports) { let result = false, i = 0, len = imports.length; for(i; i<len; i++) { if (imports[i].name.indexOf('RouterModule.forChild') !== -1 || imports[i].name.indexOf('RouterModule.forRoot') !== -1) { result = true; } } return result; }, linkModulesAndRoutes: function() { //scan each module imports AST for each routes, and link routes with module let i = 0, len = modulesWithRoutes.length; for(i; i<len; i++) { _.forEach(modulesWithRoutes[i].importsNode, function(node) { if (node.initializer) { if (node.initializer.elements) { _.forEach(node.initializer.elements, function(element) { //find element with arguments if (element.arguments) { _.forEach(element.arguments, function(argument) { _.forEach(routes, function(route) { if(argument.text && route.name === argument.text) { route.module = modulesWithRoutes[i].name; } }); }); } }); } } }); } console.log(''); console.log('end linkModulesAndRoutes: '); console.log(routes); }, constructRoutesTree: function() { console.log(''); console.log('constructRoutesTree'); // routes[] contains routes with module link // modulesTree contains modules tree // make a final routes tree with that let cleanModulesTree = _.cloneDeep(modulesTree), modulesCleaner = function(arr) { for(var i in arr) { if (arr[i].importsNode) { delete arr[i].importsNode; } if (arr[i].parent) { delete arr[i].parent; } if(arr[i].children) { modulesCleaner(arr[i].children) } } }; modulesCleaner(cleanModulesTree); //fs.outputJson('./modules.json', cleanModulesTree); console.log(''); console.log(' cleanModulesTree light: ', util.inspect(cleanModulesTree, { depth: 10 })); console.log(''); var routesTree = { tag: '<root>', kind: 'ngModule', name: rootModule, children: [] }; let foundRouteWithModuleName = function(moduleName) { return _.find(routes, {'module': moduleName}); } let loopModulesParser = function(node) { if (node.children && node.children.length > 0) { //If module has child modules console.log(' If module has child modules'); for(var i in node.children) { let route = foundRouteWithModuleName(node.children[i].name); if (route) { route.routes = JSON.parse(route.data); delete route.data; route.kind = 'ngModule'; routesTree.children.push(route); } if (node.children[i].children) { loopModulesParser(node.children[i]); } } } else { //else routes are directly inside the module console.log(' else routes are directly inside the module'); } } console.log(''); console.log(' rootModule: ', rootModule); console.log(''); loopModulesParser(_.find(cleanModulesTree, {'name': rootModule})); console.log(''); console.log(' routesTree: ', routesTree); console.log(''); //fs.outputJson('./routes-tree.json', routesTree); var cleanedRoutesTree; var cleanRoutesTree = function(route) { for(var i in route.children) { var routes = route.children[i].routes; console.log(routes); } return route; } cleanedRoutesTree = cleanRoutesTree(routesTree); console.log(''); console.log(' cleanedRoutesTree: ', util.inspect(cleanedRoutesTree, { depth: 10 })); }, constructModulesTree: function() { console.log(''); console.log('constructModulesTree'); let getNestedChildren = function(arr, parent?) { var out = [] for(var i in arr) { if(arr[i].parent === parent) { var children = getNestedChildren(arr, arr[i].name) if(children.length) { arr[i].children = children } out.push(arr[i]) } } return out; } //Scan each module and add parent property _.forEach(modules, function(firstLoopModule) { _.forEach(firstLoopModule.importsNode, function(importNode) { _.forEach(modules, function(module) { if( module.name === importNode.name) { module.parent = firstLoopModule.name } }); }); }); modulesTree = getNestedChildren(modules); console.log(''); console.log('end constructModulesTree'); console.log(modulesTree); } } })();