Having duplicates was causing the code auto-linking to ignore `ngForm` directives. PR Close #20512
		
			
				
	
	
		
			50 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			50 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| const CssSelectorParser = require('css-selector-parser').CssSelectorParser;
 | |
| const cssParser = new CssSelectorParser();
 | |
| /**
 | |
|  * @dgProcessor addMetadataAliases
 | |
|  *
 | |
|  * Directives and components can also be referenced by their selectors,
 | |
|  * and Pipes can be referenced by their name.
 | |
|  * So let's add each selector as an alias to this doc.
 | |
|  */
 | |
| module.exports = function addMetadataAliasesProcessor() {
 | |
|   return {
 | |
|     $runAfter: ['extractDecoratedClassesProcessor'],
 | |
|     $runBefore: ['computing-ids'],
 | |
|     $process: function(docs) {
 | |
|       docs.forEach(doc => {
 | |
|         switch(doc.docType) {
 | |
|         case 'directive':
 | |
|         case 'component':
 | |
|           doc.aliases = doc.aliases.concat(extractSelectors(doc[doc.docType + 'Options'].selector));
 | |
|           break;
 | |
|         case 'pipe':
 | |
|           if (doc.pipeOptions.name) {
 | |
|             doc.aliases = doc.aliases.concat(stripQuotes(doc.pipeOptions.name));
 | |
|           }
 | |
|           break;
 | |
|         }
 | |
|       });
 | |
|     }
 | |
|   };
 | |
| };
 | |
| 
 | |
| function extractSelectors(selectors) {
 | |
|   const selectorAST = cssParser.parse(stripQuotes(selectors));
 | |
|   const rules = selectorAST.selectors ? selectorAST.selectors.map(ruleSet => ruleSet.rule) : [selectorAST.rule];
 | |
|   const aliases = {};
 | |
|   rules.forEach(rule => {
 | |
|     if (rule.tagName) {
 | |
|       aliases[rule.tagName] = true;
 | |
|     }
 | |
|     if (rule.attrs) {
 | |
|       rule.attrs.forEach(attr => aliases[attr.name] = true);
 | |
|     }
 | |
|   });
 | |
|   return Object.keys(aliases);
 | |
| }
 | |
| 
 | |
| function stripQuotes(value) {
 | |
|   return (typeof(value) === 'string') ? value.trim().replace(/^(['"])(.*)\1$/, '$2') : value;
 | |
| }
 |