| 
									
										
										
										
											2017-03-20 22:23:20 +00:00
										 |  |  | module.exports = function processNavigationMap(versionInfo, log) { | 
					
						
							|  |  |  |   return { | 
					
						
							|  |  |  |     $runAfter: ['paths-computed'], | 
					
						
							|  |  |  |     $runBefore: ['rendering-docs'], | 
					
						
							|  |  |  |     $process: function(docs) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-31 21:10:54 +01:00
										 |  |  |       const navigationDoc = docs.find(doc => doc.docType === 'navigation-json'); | 
					
						
							| 
									
										
										
										
											2017-03-20 22:23:20 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |       if (!navigationDoc) { | 
					
						
							|  |  |  |         throw new Error( | 
					
						
							| 
									
										
										
										
											2017-03-31 21:10:54 +01:00
										 |  |  |           'Missing navigation map document (docType="navigation-json").' + | 
					
						
							| 
									
										
										
										
											2017-03-20 22:23:20 +00:00
										 |  |  |           'Did you forget to add it to the readFileProcessor?'); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Verify that all the navigation paths are to valid docs
 | 
					
						
							|  |  |  |       const pathMap = {}; | 
					
						
							|  |  |  |       docs.forEach(doc => pathMap[doc.path] = true); | 
					
						
							|  |  |  |       const errors = walk(navigationDoc.data, pathMap, []); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if (errors.length) { | 
					
						
							|  |  |  |         log.error(`Navigation doc: ${navigationDoc.fileInfo.relativePath} contains invalid urls`); | 
					
						
							| 
									
										
										
										
											2017-04-01 21:34:10 +03:00
										 |  |  |         // eslint-disable-next-line no-console
 | 
					
						
							| 
									
										
										
										
											2017-03-20 22:23:20 +00:00
										 |  |  |         console.log(errors); | 
					
						
							|  |  |  |         // TODO(petebd): fail if there are errors: throw new Error('processNavigationMap failed');
 | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // Add in the version data in a "secret" field to be extracted in the docs app
 | 
					
						
							|  |  |  |       navigationDoc.data['__versionInfo'] = versionInfo.currentVersion; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-04-01 21:34:10 +03:00
										 |  |  |   }; | 
					
						
							| 
									
										
										
										
											2017-03-20 22:23:20 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function walk(node, map, path) { | 
					
						
							|  |  |  |   let errors = []; | 
					
						
							|  |  |  |   for(const key in node) { | 
					
						
							|  |  |  |     const child = node[key]; | 
					
						
							| 
									
										
										
										
											2017-04-25 14:48:01 -07:00
										 |  |  |     if (child !== null) { // null is allowed
 | 
					
						
							|  |  |  |       if (key === 'url') { | 
					
						
							|  |  |  |         const url = child.replace(/#.*$/, ''); // strip hash
 | 
					
						
							|  |  |  |         if (isRelative(url) && !map[url]) { | 
					
						
							|  |  |  |           errors.push({ path: path.join('.'), url }); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       } else if (typeof child !== 'string') { | 
					
						
							|  |  |  |         errors = errors.concat(walk(child, map, path.concat([key]))); | 
					
						
							| 
									
										
										
										
											2017-03-20 22:23:20 +00:00
										 |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return errors; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function isRelative(url) { | 
					
						
							|  |  |  |   return !/^(https?:)?\/\//.test(url); | 
					
						
							| 
									
										
										
										
											2017-04-01 21:34:10 +03:00
										 |  |  | } |