In the CLI when it's undefined it can mean `false`, or sometimes it will be overwritten by a runtime value. PR Close #27024
		
			
				
	
	
		
			66 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			66 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
module.exports = function processCliCommands(createDocMessage) {
 | 
						|
  return {
 | 
						|
    $runAfter: ['extra-docs-added'],
 | 
						|
    $runBefore: ['rendering-docs'],
 | 
						|
    $process(docs) {
 | 
						|
      const navigationDoc = docs.find(doc => doc.docType === 'navigation-json');
 | 
						|
      const navigationNode = navigationDoc && navigationDoc.data['SideNav'].find(node => node.children && node.children.length && node.children[0].url === 'cli');
 | 
						|
 | 
						|
      if (!navigationNode) {
 | 
						|
        throw new Error(createDocMessage('Missing `cli` url - CLI Commands must include a first child node with url set at `cli`', navigationDoc));
 | 
						|
      }
 | 
						|
 | 
						|
      docs.forEach(doc => {
 | 
						|
        if (doc.docType === 'cli-command') {
 | 
						|
          doc.names = collectNames(doc.name, doc.commandAliases);
 | 
						|
 | 
						|
          // Recursively process the options
 | 
						|
          processOptions(doc, doc.options);
 | 
						|
 | 
						|
          // Add to navigation doc
 | 
						|
          navigationNode.children.push({ url: doc.path, title: `ng ${doc.name}` });
 | 
						|
        }
 | 
						|
      });
 | 
						|
    }
 | 
						|
  };
 | 
						|
};
 | 
						|
 | 
						|
function processOptions(container, options) {
 | 
						|
  container.positionalOptions = [];
 | 
						|
  container.namedOptions = [];
 | 
						|
 | 
						|
  options.forEach(option => {
 | 
						|
    // Ignore any hidden options
 | 
						|
    if (option.hidden) { return; }
 | 
						|
 | 
						|
    option.types = option.types || [option.type];
 | 
						|
    option.names = collectNames(option.name, option.aliases);
 | 
						|
 | 
						|
    // Now work out what kind of option it is: positional/named
 | 
						|
    if (option.positional !== undefined) {
 | 
						|
      container.positionalOptions[option.positional] = option;
 | 
						|
    } else {
 | 
						|
      container.namedOptions.push(option);
 | 
						|
    }
 | 
						|
 | 
						|
    // Recurse if there are subcommands
 | 
						|
    if (option.subcommands) {
 | 
						|
      option.subcommands = getValues(option.subcommands);
 | 
						|
      option.subcommands.forEach(subcommand => {
 | 
						|
        subcommand.names = collectNames(subcommand.name, subcommand.aliases);
 | 
						|
        processOptions(subcommand, subcommand.options);
 | 
						|
      });
 | 
						|
    }
 | 
						|
  });
 | 
						|
 | 
						|
  container.namedOptions.sort((a, b) => a.name > b.name ? 1 : -1);
 | 
						|
}
 | 
						|
 | 
						|
function collectNames(name, aliases) {
 | 
						|
  return [name].concat(aliases);
 | 
						|
}
 | 
						|
 | 
						|
function getValues(obj) {
 | 
						|
  return Object.keys(obj).map(key => obj[key]);
 | 
						|
}
 |