build(aio): better parsing of selectors as aliases for directives/components (#20512)

PR Close #20512
This commit is contained in:
Peter Bacon Darwin
2017-11-17 13:37:15 +00:00
committed by Miško Hevery
parent c2cb475a2c
commit ecce90718b
4 changed files with 15 additions and 6 deletions

View File

@ -1,3 +1,5 @@
const CssSelectorParser = require('css-selector-parser').CssSelectorParser;
const cssParser = new CssSelectorParser();
/**
* @dgProcessor addMetadataAliases
*
@ -28,11 +30,13 @@ module.exports = function addMetadataAliasesProcessor() {
};
function extractSelectors(selectors) {
if (selectors) {
return stripQuotes(selectors).split(',').map(selector => selector.replace(/^\W*([\w-]+)\W*$/, '$1'));
} else {
return [];
}
const selectorAST = cssParser.parse(stripQuotes(selectors));
const rules = selectorAST.selectors ? selectorAST.selectors.map(ruleSet => ruleSet.rule) : [selectorAST.rule];
return rules.reduce((aliases, rule) => {
const tagAliases = rule.tagName? [rule.tagName] : [];
const attrRulesAliases = (rule.attrs || []).map(attr => attr.name);
return aliases.concat(tagAliases, attrRulesAliases);
}, []);
}
function stripQuotes(value) {

View File

@ -46,7 +46,7 @@ describe('addSelectorsAsAliases processor', () => {
expect(docs[3].aliases).toEqual([docs[3].name]);
expect(docs[4].aliases).toEqual([docs[4].name, 'myPipe']);
expect(docs[5].aliases).toEqual([docs[5].name, 'my-directive', 'myDirective', 'my-directive']);
expect(docs[6].aliases).toEqual([docs[6].name, '[ngModel]:not([formControlName]):not([formControl])']);
expect(docs[6].aliases).toEqual([docs[6].name, 'ngModel']);
expect(docs[7].aliases).toEqual([docs[7].name, 'my-component']);
expect(docs[8].aliases).toEqual([docs[8].name]);
expect(docs[9].aliases).toEqual([docs[9].name]);